1/*M///////////////////////////////////////////////////////////////////////////////////////
2//
3//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4//
5//  By downloading, copying, installing or using the software you agree to this license.
6//  If you do not agree to this license, do not download, install,
7//  copy or use the software.
8//
9//
10//                           License Agreement
11//                For Open Source Computer Vision Library
12//
13// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
14// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
15// Third party copyrights are property of their respective owners.
16//
17// Redistribution and use in source and binary forms, with or without modification,
18// are permitted provided that the following conditions are met:
19//
20//   * Redistribution's of source code must retain the above copyright notice,
21//     this list of conditions and the following disclaimer.
22//
23//   * Redistribution's in binary form must reproduce the above copyright notice,
24//     this list of conditions and the following disclaimer in the documentation
25//     and/or other materials provided with the distribution.
26//
27//   * The name of the copyright holders may not be used to endorse or promote products
28//     derived from this software without specific prior written permission.
29//
30// This software is provided by the copyright holders and contributors "as is" and
31// any express or implied warranties, including, but not limited to, the implied
32// warranties of merchantability and fitness for a particular purpose are disclaimed.
33// In no event shall the Intel Corporation or contributors be liable for any direct,
34// indirect, incidental, special, exemplary, or consequential damages
35// (including, but not limited to, procurement of substitute goods or services;
36// loss of use, data, or profits; or business interruption) however caused
37// and on any theory of liability, whether in contract, strict liability,
38// or tort (including negligence or otherwise) arising in any way out of
39// the use of this software, even if advised of the possibility of such damage.
40//
41//M*/
42
43#include "perf_precomp.hpp"
44
45#ifdef HAVE_OPENCV_CALIB3D
46
47#include "opencv2/calib3d.hpp"
48
49using namespace std;
50using namespace testing;
51using namespace perf;
52
53DEF_PARAM_TEST_1(Count, int);
54
55//////////////////////////////////////////////////////////////////////
56// ProjectPoints
57
58PERF_TEST_P(Count, Calib3D_ProjectPoints,
59            Values(5000, 10000, 20000))
60{
61    const int count = GetParam();
62
63    cv::Mat src(1, count, CV_32FC3);
64    declare.in(src, WARMUP_RNG);
65
66    const cv::Mat rvec = cv::Mat::ones(1, 3, CV_32FC1);
67    const cv::Mat tvec = cv::Mat::ones(1, 3, CV_32FC1);
68    const cv::Mat camera_mat = cv::Mat::ones(3, 3, CV_32FC1);
69
70    if (PERF_RUN_CUDA())
71    {
72        const cv::cuda::GpuMat d_src(src);
73        cv::cuda::GpuMat dst;
74
75        TEST_CYCLE() cv::cuda::projectPoints(d_src, rvec, tvec, camera_mat, cv::Mat(), dst);
76
77        CUDA_SANITY_CHECK(dst);
78    }
79    else
80    {
81        cv::Mat dst;
82
83        TEST_CYCLE() cv::projectPoints(src, rvec, tvec, camera_mat, cv::noArray(), dst);
84
85        CPU_SANITY_CHECK(dst);
86    }
87}
88
89//////////////////////////////////////////////////////////////////////
90// SolvePnPRansac
91
92PERF_TEST_P(Count, Calib3D_SolvePnPRansac,
93            Values(5000, 10000, 20000))
94{
95    declare.time(10.0);
96
97    const int count = GetParam();
98
99    cv::Mat object(1, count, CV_32FC3);
100    declare.in(object, WARMUP_RNG);
101
102    cv::Mat camera_mat(3, 3, CV_32FC1);
103    cv::randu(camera_mat, 0.5, 1);
104    camera_mat.at<float>(0, 1) = 0.f;
105    camera_mat.at<float>(1, 0) = 0.f;
106    camera_mat.at<float>(2, 0) = 0.f;
107    camera_mat.at<float>(2, 1) = 0.f;
108
109    const cv::Mat dist_coef(1, 8, CV_32F, cv::Scalar::all(0));
110
111    cv::Mat rvec_gold(1, 3, CV_32FC1);
112    cv::randu(rvec_gold, 0, 1);
113
114    cv::Mat tvec_gold(1, 3, CV_32FC1);
115    cv::randu(tvec_gold, 0, 1);
116
117    std::vector<cv::Point2f> image_vec;
118    cv::projectPoints(object, rvec_gold, tvec_gold, camera_mat, dist_coef, image_vec);
119
120    const cv::Mat image(1, count, CV_32FC2, &image_vec[0]);
121
122    cv::Mat rvec;
123    cv::Mat tvec;
124
125    if (PERF_RUN_CUDA())
126    {
127        TEST_CYCLE() cv::cuda::solvePnPRansac(object, image, camera_mat, dist_coef, rvec, tvec);
128
129        CUDA_SANITY_CHECK(rvec, 1e-3);
130        CUDA_SANITY_CHECK(tvec, 1e-3);
131    }
132    else
133    {
134        TEST_CYCLE() cv::solvePnPRansac(object, image, camera_mat, dist_coef, rvec, tvec);
135
136        CPU_SANITY_CHECK(rvec, 1e-6);
137        CPU_SANITY_CHECK(tvec, 1e-6);
138    }
139}
140
141#endif
142