237 lines
6.2 KiB
C++
237 lines
6.2 KiB
C++
#include <gtest/gtest.h>
|
|
|
|
#include <algorithm>
|
|
|
|
#include "host_image.h"
|
|
#include "device_image.h"
|
|
#include "test_utility.h"
|
|
#include "internal.h"
|
|
#include "constants.h"
|
|
|
|
namespace sgm
|
|
{
|
|
|
|
template <typename SRC_T>
|
|
static void check_consistency_(HostImage& dispL, const HostImage& dispR, const HostImage& srcL,
|
|
bool subpixel, int LR_max_diff)
|
|
{
|
|
using DST_T = uint16_t;
|
|
|
|
const int h = srcL.rows;
|
|
const int w = srcL.cols;
|
|
|
|
for (int y = 0; y < h; y++)
|
|
{
|
|
const SRC_T* ptrMask = srcL.ptr<SRC_T>(y);
|
|
DST_T* ptrDispL = dispL.ptr<DST_T>(y);
|
|
const DST_T* ptrDispR = dispR.ptr<DST_T>(y);
|
|
for (int x = 0; x < w; x++)
|
|
{
|
|
const SRC_T mask = ptrMask[x];
|
|
const DST_T disp = ptrDispL[x];
|
|
int d = disp;
|
|
if (subpixel) {
|
|
d >>= sgm::StereoSGM::SUBPIXEL_SHIFT;
|
|
}
|
|
const int k = x - d;
|
|
if (mask == 0 || disp == sgm::INVALID_DISP ||
|
|
(k >= 0 && k < w && LR_max_diff >= 0 && abs(ptrDispR[k] - d) > LR_max_diff)) {
|
|
ptrDispL[x] = static_cast<DST_T>(sgm::INVALID_DISP);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void check_consistency(HostImage& dispL, const HostImage& dispR, const HostImage& srcL,
|
|
bool subpixel, int LR_max_diff)
|
|
{
|
|
if (srcL.type == SGM_8U)
|
|
check_consistency_<uint8_t>(dispL, dispR, srcL, subpixel, LR_max_diff);
|
|
if (srcL.type == SGM_16U)
|
|
check_consistency_<uint16_t>(dispL, dispR, srcL, subpixel, LR_max_diff);
|
|
if (srcL.type == SGM_32U)
|
|
check_consistency_<uint32_t>(dispL, dispR, srcL, subpixel, LR_max_diff);
|
|
}
|
|
|
|
} // namespace sgm
|
|
|
|
TEST(CheckConsistencyTest, RandomU8)
|
|
{
|
|
using namespace sgm;
|
|
using namespace details;
|
|
|
|
const int w = 631;
|
|
const int h = 479;
|
|
const int pitch = 640;
|
|
const ImageType stype = SGM_8U;
|
|
const ImageType dtype = SGM_16U;
|
|
const int LR_max_diff = 5;
|
|
const bool subpixel = false;
|
|
|
|
HostImage h_srcL(h, w, stype, pitch), h_dispL(h, w, dtype, pitch), h_dispR(h, w, dtype, pitch);
|
|
DeviceImage d_srcL(h, w, stype, pitch), d_dispL(h, w, dtype, pitch), d_dispR(h, w, dtype, pitch);
|
|
|
|
random_fill(h_srcL);
|
|
random_fill(h_dispL);
|
|
random_fill(h_dispR);
|
|
|
|
d_srcL.upload(h_srcL.data);
|
|
d_dispL.upload(h_dispL.data);
|
|
d_dispR.upload(h_dispR.data);
|
|
|
|
check_consistency(h_dispL, h_dispR, h_srcL, subpixel, LR_max_diff);
|
|
check_consistency(d_dispL, d_dispR, d_srcL, subpixel, LR_max_diff);
|
|
|
|
EXPECT_TRUE(equals(h_dispL, d_dispL));
|
|
}
|
|
|
|
TEST(CheckConsistencyTest, RandomU16)
|
|
{
|
|
using namespace sgm;
|
|
using namespace details;
|
|
|
|
const int w = 631;
|
|
const int h = 479;
|
|
const int pitch = 640;
|
|
const ImageType stype = SGM_16U;
|
|
const ImageType dtype = SGM_16U;
|
|
const int LR_max_diff = 5;
|
|
const bool subpixel = false;
|
|
|
|
HostImage h_srcL(h, w, stype, pitch), h_dispL(h, w, dtype, pitch), h_dispR(h, w, dtype, pitch);
|
|
DeviceImage d_srcL(h, w, stype, pitch), d_dispL(h, w, dtype, pitch), d_dispR(h, w, dtype, pitch);
|
|
|
|
random_fill(h_srcL);
|
|
random_fill(h_dispL);
|
|
random_fill(h_dispR);
|
|
|
|
d_srcL.upload(h_srcL.data);
|
|
d_dispL.upload(h_dispL.data);
|
|
d_dispR.upload(h_dispR.data);
|
|
|
|
check_consistency(h_dispL, h_dispR, h_srcL, subpixel, LR_max_diff);
|
|
check_consistency(d_dispL, d_dispR, d_srcL, subpixel, LR_max_diff);
|
|
|
|
EXPECT_TRUE(equals(h_dispL, d_dispL));
|
|
}
|
|
|
|
TEST(CheckConsistencyTest, RandomU32)
|
|
{
|
|
using namespace sgm;
|
|
using namespace details;
|
|
|
|
const int w = 631;
|
|
const int h = 479;
|
|
const int pitch = 640;
|
|
const ImageType stype = SGM_32U;
|
|
const ImageType dtype = SGM_16U;
|
|
const int LR_max_diff = 5;
|
|
const bool subpixel = false;
|
|
|
|
HostImage h_srcL(h, w, stype, pitch), h_dispL(h, w, dtype, pitch), h_dispR(h, w, dtype, pitch);
|
|
DeviceImage d_srcL(h, w, stype, pitch), d_dispL(h, w, dtype, pitch), d_dispR(h, w, dtype, pitch);
|
|
|
|
random_fill(h_srcL);
|
|
random_fill(h_dispL);
|
|
random_fill(h_dispR);
|
|
|
|
d_srcL.upload(h_srcL.data);
|
|
d_dispL.upload(h_dispL.data);
|
|
d_dispR.upload(h_dispR.data);
|
|
|
|
check_consistency(h_dispL, h_dispR, h_srcL, subpixel, LR_max_diff);
|
|
check_consistency(d_dispL, d_dispR, d_srcL, subpixel, LR_max_diff);
|
|
|
|
EXPECT_TRUE(equals(h_dispL, d_dispL));
|
|
}
|
|
|
|
TEST(CheckConsistencyTest, RandomU8_Subpixel)
|
|
{
|
|
using namespace sgm;
|
|
using namespace details;
|
|
|
|
const int w = 631;
|
|
const int h = 479;
|
|
const int pitch = 640;
|
|
const ImageType stype = SGM_8U;
|
|
const ImageType dtype = SGM_16U;
|
|
const int LR_max_diff = 5;
|
|
const bool subpixel = true;
|
|
|
|
HostImage h_srcL(h, w, stype, pitch), h_dispL(h, w, dtype, pitch), h_dispR(h, w, dtype, pitch);
|
|
DeviceImage d_srcL(h, w, stype, pitch), d_dispL(h, w, dtype, pitch), d_dispR(h, w, dtype, pitch);
|
|
|
|
random_fill(h_srcL);
|
|
random_fill(h_dispL);
|
|
random_fill(h_dispR);
|
|
|
|
d_srcL.upload(h_srcL.data);
|
|
d_dispL.upload(h_dispL.data);
|
|
d_dispR.upload(h_dispR.data);
|
|
|
|
check_consistency(h_dispL, h_dispR, h_srcL, subpixel, LR_max_diff);
|
|
check_consistency(d_dispL, d_dispR, d_srcL, subpixel, LR_max_diff);
|
|
|
|
EXPECT_TRUE(equals(h_dispL, d_dispL));
|
|
}
|
|
|
|
TEST(CheckConsistencyTest, RandomU16_Subpixel)
|
|
{
|
|
using namespace sgm;
|
|
using namespace details;
|
|
|
|
const int w = 631;
|
|
const int h = 479;
|
|
const int pitch = 640;
|
|
const ImageType stype = SGM_16U;
|
|
const ImageType dtype = SGM_16U;
|
|
const int LR_max_diff = 5;
|
|
const bool subpixel = true;
|
|
|
|
HostImage h_srcL(h, w, stype, pitch), h_dispL(h, w, dtype, pitch), h_dispR(h, w, dtype, pitch);
|
|
DeviceImage d_srcL(h, w, stype, pitch), d_dispL(h, w, dtype, pitch), d_dispR(h, w, dtype, pitch);
|
|
|
|
random_fill(h_srcL);
|
|
random_fill(h_dispL);
|
|
random_fill(h_dispR);
|
|
|
|
d_srcL.upload(h_srcL.data);
|
|
d_dispL.upload(h_dispL.data);
|
|
d_dispR.upload(h_dispR.data);
|
|
|
|
check_consistency(h_dispL, h_dispR, h_srcL, subpixel, LR_max_diff);
|
|
check_consistency(d_dispL, d_dispR, d_srcL, subpixel, LR_max_diff);
|
|
|
|
EXPECT_TRUE(equals(h_dispL, d_dispL));
|
|
}
|
|
|
|
TEST(CheckConsistencyTest, RandomU32_Subpixel)
|
|
{
|
|
using namespace sgm;
|
|
using namespace details;
|
|
|
|
const int w = 631;
|
|
const int h = 479;
|
|
const int pitch = 640;
|
|
const ImageType stype = SGM_32U;
|
|
const ImageType dtype = SGM_16U;
|
|
const int LR_max_diff = 5;
|
|
const bool subpixel = true;
|
|
|
|
HostImage h_srcL(h, w, stype, pitch), h_dispL(h, w, dtype, pitch), h_dispR(h, w, dtype, pitch);
|
|
DeviceImage d_srcL(h, w, stype, pitch), d_dispL(h, w, dtype, pitch), d_dispR(h, w, dtype, pitch);
|
|
|
|
random_fill(h_srcL);
|
|
random_fill(h_dispL);
|
|
random_fill(h_dispR);
|
|
|
|
d_srcL.upload(h_srcL.data);
|
|
d_dispL.upload(h_dispL.data);
|
|
d_dispR.upload(h_dispR.data);
|
|
|
|
check_consistency(h_dispL, h_dispR, h_srcL, subpixel, LR_max_diff);
|
|
check_consistency(d_dispL, d_dispR, d_srcL, subpixel, LR_max_diff);
|
|
|
|
EXPECT_TRUE(equals(h_dispL, d_dispL));
|
|
}
|