mirror of
https://github.com/opencv/opencv.git
synced 2025-01-18 22:44:02 +08:00
Merge pull request #13601 from JimZhou-001:JimZhou-001
* Fix the bug in case determinant of rotation matrix is -1 * calib3d(test): check det(R) == 1
This commit is contained in:
parent
7812a805ad
commit
78bd55c8df
@ -185,6 +185,10 @@ bool HomographyDecompZhang::findMotionFrom_tstar_n(const cv::Vec3d& tstar, const
|
||||
temp(1, 1) += 1.0;
|
||||
temp(2, 2) += 1.0;
|
||||
motion.R = getHnorm() * temp.inv();
|
||||
if (cv::determinant(motion.R) < 0)
|
||||
{
|
||||
motion.R *= -1;
|
||||
}
|
||||
motion.t = motion.R * tstar;
|
||||
motion.n = n;
|
||||
return passesSameSideOfPlaneConstraint(motion);
|
||||
@ -312,6 +316,10 @@ void HomographyDecompInria::findRmatFrom_tstar_n(const cv::Vec3d& tstar, const c
|
||||
0.0, 0.0, 1.0);
|
||||
|
||||
R = getHnorm() * (I - (2/v) * tstar_m * n_m.t() );
|
||||
if (cv::determinant(R) < 0)
|
||||
{
|
||||
R *= -1;
|
||||
}
|
||||
}
|
||||
|
||||
void HomographyDecompInria::decompose(std::vector<CameraMotion>& camMotions)
|
||||
|
@ -134,4 +134,36 @@ private:
|
||||
|
||||
TEST(Calib3d_DecomposeHomography, regression) { CV_HomographyDecompTest test; test.safe_run(); }
|
||||
|
||||
|
||||
TEST(Calib3d_DecomposeHomography, issue_4978)
|
||||
{
|
||||
Matx33d K(
|
||||
1.0, 0.0, 0.0,
|
||||
0.0, 1.0, 0.0,
|
||||
0.0, 0.0, 1.0
|
||||
);
|
||||
|
||||
Matx33d H(
|
||||
-0.102896, 0.270191, -0.0031153,
|
||||
0.0406387, 1.19569, -0.0120456,
|
||||
0.445351, 0.0410889, 1
|
||||
);
|
||||
|
||||
vector<Mat> rotations;
|
||||
vector<Mat> translations;
|
||||
vector<Mat> normals;
|
||||
|
||||
decomposeHomographyMat(H, K, rotations, translations, normals);
|
||||
|
||||
ASSERT_GT(rotations.size(), (size_t)0u);
|
||||
for (size_t i = 0; i < rotations.size(); i++)
|
||||
{
|
||||
// check: det(R) = 1
|
||||
EXPECT_TRUE(std::fabs(cv::determinant(rotations[i]) - 1.0) < 0.01)
|
||||
<< "R: det=" << cv::determinant(rotations[0]) << std::endl << rotations[i] << std::endl
|
||||
<< "T:" << std::endl << translations[i] << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}} // namespace
|
||||
|
Loading…
Reference in New Issue
Block a user