Skip to content

Commit

Permalink
Merge pull request opencv#14271 from alalek:issue_14259
Browse files Browse the repository at this point in the history
  • Loading branch information
alalek committed Apr 6, 2019
2 parents 2892557 + b5961cc commit 4368f04
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 0 deletions.
14 changes: 14 additions & 0 deletions modules/calib3d/src/ptsetreg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -833,6 +833,13 @@ Mat estimateAffine2D(InputArray _from, InputArray _to, OutputArray _inliers,
to.convertTo(tmp2, CV_32FC2);
to = tmp2;
}
else
{
// avoid changing of inputs in compressElems() call
from = from.clone();
to = to.clone();
}

// convert to N x 1 vectors
from = from.reshape(2, count);
to = to.reshape(2, count);
Expand Down Expand Up @@ -900,6 +907,13 @@ Mat estimateAffinePartial2D(InputArray _from, InputArray _to, OutputArray _inlie
to.convertTo(tmp2, CV_32FC2);
to = tmp2;
}
else
{
// avoid changing of inputs in compressElems() call
from = from.clone();
to = to.clone();
}

// convert to N x 1 vectors
from = from.reshape(2, count);
to = to.reshape(2, count);
Expand Down
42 changes: 42 additions & 0 deletions modules/calib3d/test/test_affine2d_estimator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -152,4 +152,46 @@ TEST_P(EstimateAffine2D, testConversion)

INSTANTIATE_TEST_CASE_P(Calib3d, EstimateAffine2D, Method::all());


// https://github.com/opencv/opencv/issues/14259
TEST(EstimateAffine2D, issue_14259_dont_change_inputs)
{
/*const static*/ float pts0_[10] = {
0.0f, 0.0f,
0.0f, 8.0f,
4.0f, 0.0f, // outlier
8.0f, 8.0f,
8.0f, 0.0f
};
/*const static*/ float pts1_[10] = {
0.1f, 0.1f,
0.1f, 8.1f,
0.0f, 4.0f, // outlier
8.1f, 8.1f,
8.1f, 0.1f
};

Mat pts0(Size(1, 5), CV_32FC2, (void*)pts0_);
Mat pts1(Size(1, 5), CV_32FC2, (void*)pts1_);

Mat pts0_copy = pts0.clone();
Mat pts1_copy = pts1.clone();

Mat inliers;

cv::Mat A = cv::estimateAffine2D(pts0, pts1, inliers);

for(int i = 0; i < pts0.rows; ++i)
{
EXPECT_EQ(pts0_copy.at<Vec2f>(i), pts0.at<Vec2f>(i)) << "pts0: i=" << i;
}

for(int i = 0; i < pts1.rows; ++i)
{
EXPECT_EQ(pts1_copy.at<Vec2f>(i), pts1.at<Vec2f>(i)) << "pts1: i=" << i;
}

EXPECT_EQ(0, (int)inliers.at<uchar>(2));
}

}} // namespace
42 changes: 42 additions & 0 deletions modules/calib3d/test/test_affine_partial2d_estimator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -161,4 +161,46 @@ TEST_P(EstimateAffinePartial2D, testConversion)

INSTANTIATE_TEST_CASE_P(Calib3d, EstimateAffinePartial2D, Method::all());


// https://github.com/opencv/opencv/issues/14259
TEST(EstimateAffinePartial2D, issue_14259_dont_change_inputs)
{
/*const static*/ float pts0_[10] = {
0.0f, 0.0f,
0.0f, 8.0f,
4.0f, 0.0f, // outlier
8.0f, 8.0f,
8.0f, 0.0f
};
/*const static*/ float pts1_[10] = {
0.1f, 0.1f,
0.1f, 8.1f,
0.0f, 4.0f, // outlier
8.1f, 8.1f,
8.1f, 0.1f
};

Mat pts0(Size(1, 5), CV_32FC2, (void*)pts0_);
Mat pts1(Size(1, 5), CV_32FC2, (void*)pts1_);

Mat pts0_copy = pts0.clone();
Mat pts1_copy = pts1.clone();

Mat inliers;

cv::Mat A = cv::estimateAffinePartial2D(pts0, pts1, inliers);

for(int i = 0; i < pts0.rows; ++i)
{
EXPECT_EQ(pts0_copy.at<Vec2f>(i), pts0.at<Vec2f>(i)) << "pts0: i=" << i;
}

for(int i = 0; i < pts1.rows; ++i)
{
EXPECT_EQ(pts1_copy.at<Vec2f>(i), pts1.at<Vec2f>(i)) << "pts1: i=" << i;
}

EXPECT_EQ(0, (int)inliers.at<uchar>(2));
}

}} // namespace

0 comments on commit 4368f04

Please sign in to comment.