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 );