From 4439ba09f973453b1b34f68c5d2bcbde56aac09d Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 19 Oct 2016 13:43:06 +0300 Subject: [PATCH] test: update condition for Calib3d_StereoCalibrate --- modules/calib3d/test/test_cameracalibration.cpp | 27 ++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/modules/calib3d/test/test_cameracalibration.cpp b/modules/calib3d/test/test_cameracalibration.cpp index 5235942..55618c2 100644 --- a/modules/calib3d/test/test_cameracalibration.cpp +++ b/modules/calib3d/test/test_cameracalibration.cpp @@ -1701,9 +1701,10 @@ void CV_StereoCalibrationTest::run( int ) const float minCoord = -300.0f; const float maxCoord = 300.0f; const float minDisparity = 0.1f; - const float maxDisparity = 600.0f; + const float maxDisparity = 60.0f; const int pointsCount = 500; const float requiredAccuracy = 1e-3f; + const float allowToFail = 0.2f; // 20% RNG& rng = ts->get_rng(); Mat projectedPoints_1(2, pointsCount, CV_32FC1); @@ -1732,9 +1733,29 @@ void CV_StereoCalibrationTest::run( int ) Mat reprojectedPoints; perspectiveTransform(sparsePoints, reprojectedPoints, Q); - if (cvtest::norm(triangulatedPoints, reprojectedPoints, NORM_L2) / sqrt((double)pointsCount) > requiredAccuracy) + Mat diff; + absdiff(triangulatedPoints, reprojectedPoints, diff); + Mat mask = diff > requiredAccuracy; + mask = mask.reshape(1); + mask = mask.col(0) | mask.col(1) | mask.col(2); + int numFailed = countNonZero(mask); +#if 0 + std::cout << "numFailed=" << numFailed << std::endl; + for (int i = 0; i < triangulatedPoints.rows; i++) + { + if (mask.at(i)) + { + // failed points usually have 'w'~0 (points4d[3]) + std::cout << "i=" << i << " triangulatePoints=" << triangulatedPoints.row(i) << " reprojectedPoints=" << reprojectedPoints.row(i) << std::endl << + " points4d=" << points4d.col(i).t() << " projectedPoints_1=" << projectedPoints_1.col(i).t() << " disparities=" << disparities.col(i).t() << std::endl; + } + } +#endif + + if (numFailed >= allowToFail * pointsCount) { - ts->printf( cvtest::TS::LOG, "Points reprojected with a matrix Q and points reconstructed by triangulation are different, testcase %d\n", testcase); + ts->printf( cvtest::TS::LOG, "Points reprojected with a matrix Q and points reconstructed by triangulation are different (tolerance=%g, failed=%d), testcase %d\n", + requiredAccuracy, numFailed, testcase); ts->set_failed_test_info( cvtest::TS::FAIL_INVALID_OUTPUT ); } -- 2.7.4