• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*M///////////////////////////////////////////////////////////////////////////////////////
2 //
3 // By downloading, copying, installing or using the software you agree to this license.
4 // If you do not agree to this license, do not download, install,
5 // copy or use the software.
6 //
7 //
8 //                           License Agreement
9 //                For Open Source Computer Vision Library
10 //                        (3-clause BSD License)
11 //
12 // Copyright (C) 2015-2016, OpenCV Foundation, all rights reserved.
13 // Third party copyrights are property of their respective owners.
14 //
15 // Redistribution and use in source and binary forms, with or without modification,
16 // are permitted provided that the following conditions are met:
17 //
18 //   * Redistributions of source code must retain the above copyright notice,
19 //     this list of conditions and the following disclaimer.
20 //
21 //   * Redistributions in binary form must reproduce the above copyright notice,
22 //     this list of conditions and the following disclaimer in the documentation
23 //     and/or other materials provided with the distribution.
24 //
25 //   * Neither the names of the copyright holders nor the names of the contributors
26 //     may be used to endorse or promote products derived from this software
27 //     without specific prior written permission.
28 //
29 // This software is provided by the copyright holders and contributors "as is" and
30 // any express or implied warranties, including, but not limited to, the implied
31 // warranties of merchantability and fitness for a particular purpose are disclaimed.
32 // In no event shall copyright holders or contributors be liable for any direct,
33 // indirect, incidental, special, exemplary, or consequential damages
34 // (including, but not limited to, procurement of substitute goods or services;
35 // loss of use, data, or profits; or business interruption) however caused
36 // and on any theory of liability, whether in contract, strict liability,
37 // or tort (including negligence or otherwise) arising in any way out of
38 // the use of this software, even if advised of the possibility of such damage.
39 //
40 //M*/
41 
42 #include "perf_precomp.hpp"
43 #include <algorithm>
44 #include <functional>
45 
46 namespace opencv_test
47 {
48 using namespace perf;
49 
50 CV_ENUM(Method, RANSAC, LMEDS)
51 typedef tuple<int, double, Method, size_t> AffineParams;
52 typedef TestBaseWithParam<AffineParams> EstimateAffine;
53 #define ESTIMATE_PARAMS Combine(Values(100000, 5000, 100), Values(0.99, 0.95, 0.9), Method::all(), Values(10, 0))
54 
rngIn(float from,float to)55 static float rngIn(float from, float to) { return from + (to-from) * (float)theRNG(); }
56 
rngPartialAffMat()57 static Mat rngPartialAffMat() {
58     double theta = rngIn(0, (float)CV_PI*2.f);
59     double scale = rngIn(0, 3);
60     double tx = rngIn(-2, 2);
61     double ty = rngIn(-2, 2);
62     double aff[2*3] = { std::cos(theta) * scale, -std::sin(theta) * scale, tx,
63                         std::sin(theta) * scale,  std::cos(theta) * scale, ty };
64     return Mat(2, 3, CV_64F, aff).clone();
65 }
66 
PERF_TEST_P(EstimateAffine,EstimateAffine2D,ESTIMATE_PARAMS)67 PERF_TEST_P( EstimateAffine, EstimateAffine2D, ESTIMATE_PARAMS )
68 {
69     AffineParams params = GetParam();
70     const int n = get<0>(params);
71     const double confidence = get<1>(params);
72     const int method = get<2>(params);
73     const size_t refining = get<3>(params);
74 
75     Mat aff(2, 3, CV_64F);
76     cv::randu(aff, -2., 2.);
77 
78     // LMEDS can't handle more than 50% outliers (by design)
79     int m;
80     if (method == LMEDS)
81         m = 3*n/5;
82     else
83         m = 2*n/5;
84     const float shift_outl = 15.f;
85     const float noise_level = 20.f;
86 
87     Mat fpts(1, n, CV_32FC2);
88     Mat tpts(1, n, CV_32FC2);
89 
90     randu(fpts, 0., 100.);
91     transform(fpts, tpts, aff);
92 
93     /* adding noise to some points */
94     Mat outliers = tpts.colRange(m, n);
95     outliers.reshape(1) += shift_outl;
96 
97     Mat noise (outliers.size(), outliers.type());
98     randu(noise, 0., noise_level);
99     outliers += noise;
100 
101     Mat aff_est;
102     vector<uchar> inliers (n);
103 
104     warmup(inliers, WARMUP_WRITE);
105     warmup(fpts, WARMUP_READ);
106     warmup(tpts, WARMUP_READ);
107 
108     TEST_CYCLE()
109     {
110         aff_est = estimateAffine2D(fpts, tpts, inliers, method, 3, 2000, confidence, refining);
111     }
112 
113     // we already have accuracy tests
114     SANITY_CHECK_NOTHING();
115 }
116 
PERF_TEST_P(EstimateAffine,EstimateAffinePartial2D,ESTIMATE_PARAMS)117 PERF_TEST_P( EstimateAffine, EstimateAffinePartial2D, ESTIMATE_PARAMS )
118 {
119     AffineParams params = GetParam();
120     const int n = get<0>(params);
121     const double confidence = get<1>(params);
122     const int method = get<2>(params);
123     const size_t refining = get<3>(params);
124 
125     Mat aff = rngPartialAffMat();
126 
127     int m;
128     // LMEDS can't handle more than 50% outliers (by design)
129     if (method == LMEDS)
130         m = 3*n/5;
131     else
132         m = 2*n/5;
133     const float shift_outl = 15.f;    const float noise_level = 20.f;
134 
135     Mat fpts(1, n, CV_32FC2);
136     Mat tpts(1, n, CV_32FC2);
137 
138     randu(fpts, 0., 100.);
139     transform(fpts, tpts, aff);
140 
141     /* adding noise*/
142     Mat outliers = tpts.colRange(m, n);
143     outliers.reshape(1) += shift_outl;
144 
145     Mat noise (outliers.size(), outliers.type());
146     randu(noise, 0., noise_level);
147     outliers += noise;
148 
149     Mat aff_est;
150     vector<uchar> inliers (n);
151 
152     warmup(inliers, WARMUP_WRITE);
153     warmup(fpts, WARMUP_READ);
154     warmup(tpts, WARMUP_READ);
155 
156     TEST_CYCLE()
157     {
158         aff_est = estimateAffinePartial2D(fpts, tpts, inliers, method, 3, 2000, confidence, refining);
159     }
160 
161     // we already have accuracy tests
162     SANITY_CHECK_NOTHING();
163 }
164 
165 } // namespace opencv_test
166