Added a check that Q reprojects to the same 3D points as reconstructed by triangulation (#1575)
This commit is contained in:
parent
bc7b517e41
commit
e1378aad79
@ -1496,6 +1496,53 @@ void CV_StereoCalibrationTest::run( int )
|
|||||||
ts->set_failed_test_info( cvtest::TS::FAIL_INVALID_OUTPUT );
|
ts->set_failed_test_info( cvtest::TS::FAIL_INVALID_OUTPUT );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//check that Q reprojects the same points as reconstructed by triangulation
|
||||||
|
const float minCoord = -300.0f;
|
||||||
|
const float maxCoord = 300.0f;
|
||||||
|
const float minDisparity = 0.1f;
|
||||||
|
const float maxDisparity = 600.0f;
|
||||||
|
const int pointsCount = 500;
|
||||||
|
const float requiredAccuracy = 1e-3;
|
||||||
|
RNG& rng = ts->get_rng();
|
||||||
|
|
||||||
|
Mat projectedPoints_1(2, pointsCount, CV_32FC1);
|
||||||
|
Mat projectedPoints_2(2, pointsCount, CV_32FC1);
|
||||||
|
Mat disparities(1, pointsCount, CV_32FC1);
|
||||||
|
|
||||||
|
rng.fill(projectedPoints_1, RNG::UNIFORM, minCoord, maxCoord);
|
||||||
|
rng.fill(disparities, RNG::UNIFORM, minDisparity, maxDisparity);
|
||||||
|
projectedPoints_2.row(0) = projectedPoints_1.row(0) - disparities;
|
||||||
|
Mat ys_2 = projectedPoints_2.row(1);
|
||||||
|
projectedPoints_1.row(1).copyTo(ys_2);
|
||||||
|
|
||||||
|
const int dimension = 4;
|
||||||
|
Mat points4d(dimension, pointsCount, CV_32FC1);
|
||||||
|
CvMat cvPoints4d = points4d;
|
||||||
|
CvMat cvP1 = P1;
|
||||||
|
CvMat cvP2 = P2;
|
||||||
|
CvMat cvPoints1 = projectedPoints_1;
|
||||||
|
CvMat cvPoints2 = projectedPoints_2;
|
||||||
|
cvTriangulatePoints(&cvP1, &cvP2, &cvPoints1, &cvPoints2, &cvPoints4d);
|
||||||
|
Mat homogeneousPoints4d = points4d.t();
|
||||||
|
homogeneousPoints4d = homogeneousPoints4d.reshape(dimension);
|
||||||
|
Mat triangulatedPoints;
|
||||||
|
convertPointsFromHomogeneous(homogeneousPoints4d, triangulatedPoints);
|
||||||
|
|
||||||
|
Mat sparsePoints;
|
||||||
|
sparsePoints.push_back(projectedPoints_1);
|
||||||
|
sparsePoints.push_back(disparities);
|
||||||
|
sparsePoints = sparsePoints.t();
|
||||||
|
sparsePoints = sparsePoints.reshape(3);
|
||||||
|
Mat reprojectedPoints;
|
||||||
|
perspectiveTransform(sparsePoints, reprojectedPoints, Q);
|
||||||
|
|
||||||
|
if (norm(triangulatedPoints - reprojectedPoints) / sqrt(pointsCount) > requiredAccuracy)
|
||||||
|
{
|
||||||
|
ts->printf( cvtest::TS::LOG, "Points reprojected with a matrix Q and points reconstructed by triangulation are different, testcase %d\n", testcase);
|
||||||
|
ts->set_failed_test_info( cvtest::TS::FAIL_INVALID_OUTPUT );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// rectifyUncalibrated
|
// rectifyUncalibrated
|
||||||
CV_Assert( imgpt1.size() == imgpt2.size() );
|
CV_Assert( imgpt1.size() == imgpt2.size() );
|
||||||
Mat _imgpt1( total, 1, CV_32FC2 ), _imgpt2( total, 1, CV_32FC2 );
|
Mat _imgpt1( total, 1, CV_32FC2 ), _imgpt2( total, 1, CV_32FC2 );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user