Skip to content

Commit 6db3e95

Browse files
committed
reg: add support of different datatypes in Mapper::grid()
1 parent d879ea4 commit 6db3e95

File tree

2 files changed

+42
-14
lines changed

2 files changed

+42
-14
lines changed

modules/reg/src/mapper.cpp

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,28 +59,45 @@ void Mapper::gradient(const Mat& img1, const Mat& img2, Mat& Ix, Mat& Iy, Mat& I
5959
}
6060

6161
////////////////////////////////////////////////////////////////////////////////////////////////////
62-
void Mapper::grid(const Mat& img, Mat& grid_r, Mat& grid_c) const
62+
63+
template<typename _Tp>
64+
void fillGridMatrices(const Mat img, Mat grid_r, Mat grid_c)
6365
{
64-
// Matrices with reference frame coordinates
65-
grid_r.create(img.size(), img.type());
66-
grid_c.create(img.size(), img.type());
6766
if(img.channels() == 1) {
6867
for(int r_i = 0; r_i < img.rows; ++r_i) {
6968
for(int c_i = 0; c_i < img.cols; ++c_i) {
70-
grid_r.at<double>(r_i, c_i) = r_i;
71-
grid_c.at<double>(r_i, c_i) = c_i;
69+
grid_r.at<_Tp>(r_i, c_i) = r_i;
70+
grid_c.at<_Tp>(r_i, c_i) = c_i;
7271
}
7372
}
7473
} else {
75-
Vec3d ones(1., 1., 1.);
74+
Vec<_Tp, 3> ones(1., 1., 1.);
7675
for(int r_i = 0; r_i < img.rows; ++r_i) {
7776
for(int c_i = 0; c_i < img.cols; ++c_i) {
78-
grid_r.at<Vec3d>(r_i, c_i) = r_i*ones;
79-
grid_c.at<Vec3d>(r_i, c_i) = c_i*ones;
77+
grid_r.at< Vec<_Tp, 3> >(r_i, c_i) = r_i*ones;
78+
grid_c.at< Vec<_Tp, 3> >(r_i, c_i) = c_i*ones;
8079
}
8180
}
8281
}
8382
}
8483

84+
void Mapper::grid(const Mat& img, Mat& grid_r, Mat& grid_c) const
85+
{
86+
CV_DbgAssert(img.channels() == 1 || img.channels() == 3);
87+
88+
// Matrices with reference frame coordinates
89+
grid_r.create(img.size(), img.type());
90+
grid_c.create(img.size(), img.type());
91+
92+
if(img.depth() == CV_8U)
93+
fillGridMatrices<uchar>(img, grid_r, grid_c);
94+
if(img.depth() == CV_16U)
95+
fillGridMatrices<ushort>(img, grid_r, grid_c);
96+
else if(img.depth() == CV_32F)
97+
fillGridMatrices<float>(img, grid_r, grid_c);
98+
else if(img.depth() == CV_64F)
99+
fillGridMatrices<double>(img, grid_r, grid_c);
100+
}
101+
85102

86103
}} // namespace cv::reg

modules/reg/test/test_reg.cpp

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ using namespace cv::reg;
6363
class RegTest : public testing::Test
6464
{
6565
public:
66-
void loadImage();
66+
void loadImage(int dstDataType = CV_32FC3);
6767

6868
void testShift();
6969
void testEuclidean();
@@ -242,14 +242,13 @@ void RegTest::testProjective()
242242
EXPECT_GE(projNorm, sqrt(3.) - 0.01);
243243
}
244244

245-
void RegTest::loadImage()
245+
void RegTest::loadImage(int dstDataType)
246246
{
247247
const string imageName = cvtest::TS::ptr()->get_data_path() + "reg/home.png";
248248

249249
img1 = imread(imageName, -1);
250-
ASSERT_TRUE(img1.data != 0);
251-
// Convert to double, 3 channels
252-
img1.convertTo(img1, CV_64FC3);
250+
ASSERT_TRUE(!img1.empty());
251+
img1.convertTo(img1, dstDataType);
253252
}
254253

255254

@@ -282,3 +281,15 @@ TEST_F(RegTest, projective)
282281
loadImage();
283282
testProjective();
284283
}
284+
285+
TEST_F(RegTest, projective_dt64fc3)
286+
{
287+
loadImage(CV_64FC3);
288+
testProjective();
289+
}
290+
291+
TEST_F(RegTest, projective_dt64fc1)
292+
{
293+
loadImage(CV_64FC1);
294+
testProjective();
295+
}

0 commit comments

Comments
 (0)