//M*/
#include "test_precomp.hpp"
+#include "opencv2/core/internal.hpp"
using namespace cv;
using namespace std;
TEST(Calib3d_SolvePnPRansac, accuracy) { CV_solvePnPRansac_Test test; test.safe_run(); }
TEST(Calib3d_SolvePnP, accuracy) { CV_solvePnP_Test test; test.safe_run(); }
+
+#ifdef HAVE_TBB
+
+TEST(DISABLED_Calib3d_SolvePnPRansac, concurrency)
+{
+ int count = 7*13;
+
+ Mat object(1, count, CV_32FC3);
+ randu(object, -100, 100);
+
+ Mat camera_mat(3, 3, CV_32FC1);
+ randu(camera_mat, 0.5, 1);
+ camera_mat.at<float>(0, 1) = 0.f;
+ camera_mat.at<float>(1, 0) = 0.f;
+ camera_mat.at<float>(2, 0) = 0.f;
+ camera_mat.at<float>(2, 1) = 0.f;
+
+ Mat dist_coef(1, 8, CV_32F, cv::Scalar::all(0));
+
+ vector<cv::Point2f> image_vec;
+ Mat rvec_gold(1, 3, CV_32FC1);
+ randu(rvec_gold, 0, 1);
+ Mat tvec_gold(1, 3, CV_32FC1);
+ randu(tvec_gold, 0, 1);
+ projectPoints(object, rvec_gold, tvec_gold, camera_mat, dist_coef, image_vec);
+
+ Mat image(1, count, CV_32FC2, &image_vec[0]);
+
+ Mat rvec1, rvec2;
+ Mat tvec1, tvec2;
+
+ {
+ // limit concurrency to get determenistic result
+ cv::theRNG().state = 20121010;
+ cv::Ptr<tbb::task_scheduler_init> one_thread = new tbb::task_scheduler_init(1);
+ solvePnPRansac(object, image, camera_mat, dist_coef, rvec1, tvec1);
+ }
+
+ if(1)
+ {
+ Mat rvec;
+ Mat tvec;
+ // parallel executions
+ for(int i = 0; i < 10; ++i)
+ {
+ cv::theRNG().state = 20121010;
+ solvePnPRansac(object, image, camera_mat, dist_coef, rvec, tvec);
+ }
+ }
+
+ {
+ // single thread again
+ cv::theRNG().state = 20121010;
+ cv::Ptr<tbb::task_scheduler_init> one_thread = new tbb::task_scheduler_init(1);
+ solvePnPRansac(object, image, camera_mat, dist_coef, rvec2, tvec2);
+ }
+
+ double rnorm = cv::norm(rvec1, rvec2, NORM_INF);
+ double tnorm = cv::norm(tvec1, tvec2, NORM_INF);
+
+ EXPECT_LT(rnorm, 1e-6);
+ EXPECT_LT(tnorm, 1e-6);
+
+}
+#endif
\ No newline at end of file