From e1378aad79d0928847998b7d6800524a91d17090 Mon Sep 17 00:00:00 2001 From: Ilya Lysenkov Date: Tue, 27 Mar 2012 19:04:43 +0000 Subject: [PATCH] Added a check that Q reprojects to the same 3D points as reconstructed by triangulation (#1575) --- modules/calib3d/test/test_cameracalibration.cpp | 47 +++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/modules/calib3d/test/test_cameracalibration.cpp b/modules/calib3d/test/test_cameracalibration.cpp index e9f9b73..7d6dde4 100644 --- a/modules/calib3d/test/test_cameracalibration.cpp +++ b/modules/calib3d/test/test_cameracalibration.cpp @@ -1496,6 +1496,53 @@ void CV_StereoCalibrationTest::run( int ) 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 CV_Assert( imgpt1.size() == imgpt2.size() ); Mat _imgpt1( total, 1, CV_32FC2 ), _imgpt2( total, 1, CV_32FC2 ); -- 2.7.4