@@ -61,22 +61,22 @@ class CV_solvePnPRansac_Test : public cvtest::BaseTest
61
61
eps[SOLVEPNP_DLS] = 1.0e-2 ;
62
62
eps[SOLVEPNP_UPNP] = 1.0e-2 ;
63
63
totalTestsCount = 10 ;
64
+ pointsCount = 500 ;
64
65
}
65
66
~CV_solvePnPRansac_Test () {}
66
67
protected:
67
- void generate3DPointCloud (vector<Point3f>& points, Point3f pmin = Point3f(-1 ,
68
- -1 , 5 ), Point3f pmax = Point3f(1 , 1 , 10 ))
68
+ void generate3DPointCloud (vector<Point3f>& points,
69
+ Point3f pmin = Point3f(-1 , -1 , 5 ),
70
+ Point3f pmax = Point3f(1 , 1 , 10 ))
69
71
{
70
- const Point3f delta = pmax - pmin;
72
+ RNG rng = ::theRNG (); // fix the seed to use "fixed" input 3D points
73
+
71
74
for (size_t i = 0 ; i < points.size (); i++)
72
75
{
73
- Point3f p (float (rand ()) / RAND_MAX, float (rand ()) / RAND_MAX,
74
- float (rand ()) / RAND_MAX);
75
- p.x *= delta.x ;
76
- p.y *= delta.y ;
77
- p.z *= delta.z ;
78
- p = p + pmin;
79
- points[i] = p;
76
+ float _x = rng.uniform (pmin.x , pmax.x );
77
+ float _y = rng.uniform (pmin.y , pmax.y );
78
+ float _z = rng.uniform (pmin.z , pmax.z );
79
+ points[i] = Point3f (_x, _y, _z);
80
80
}
81
81
}
82
82
@@ -138,8 +138,7 @@ class CV_solvePnPRansac_Test : public cvtest::BaseTest
138
138
}
139
139
}
140
140
141
- solvePnPRansac (points, projectedPoints, intrinsics, distCoeffs, rvec, tvec,
142
- false , 500 , 0 .5f , 0.99 , inliers, method);
141
+ solvePnPRansac (points, projectedPoints, intrinsics, distCoeffs, rvec, tvec, false , pointsCount, 0 .5f , 0.99 , inliers, method);
143
142
144
143
bool isTestSuccess = inliers.size () >= points.size ()*0.95 ;
145
144
@@ -158,26 +157,25 @@ class CV_solvePnPRansac_Test : public cvtest::BaseTest
158
157
ts->set_failed_test_info (cvtest::TS::OK);
159
158
160
159
vector<Point3f> points, points_dls;
161
- const int pointsCount = 500 ;
162
160
points.resize (pointsCount);
163
161
generate3DPointCloud (points);
164
162
165
- const int methodsCount = 6 ;
166
163
RNG rng = ts->get_rng ();
167
164
168
165
169
166
for (int mode = 0 ; mode < 2 ; mode++)
170
167
{
171
- for (int method = 0 ; method < methodsCount ; method++)
168
+ for (int method = 0 ; method < SOLVEPNP_MAX_COUNT ; method++)
172
169
{
173
170
double maxError = 0 ;
174
171
int successfulTestsCount = 0 ;
175
172
for (int testIndex = 0 ; testIndex < totalTestsCount; testIndex++)
176
173
{
177
174
if (runTest (rng, mode, method, points, eps, maxError))
175
+ {
178
176
successfulTestsCount++;
177
+ }
179
178
}
180
- // cout << maxError << " " << successfulTestsCount << endl;
181
179
if (successfulTestsCount < 0.7 *totalTestsCount)
182
180
{
183
181
ts->printf ( cvtest::TS::LOG, " Invalid accuracy for method %d, failed %d tests from %d, maximum error equals %f, distortion mode equals %d\n " ,
@@ -190,8 +188,9 @@ class CV_solvePnPRansac_Test : public cvtest::BaseTest
190
188
}
191
189
}
192
190
}
193
- double eps[6 ];
191
+ double eps[SOLVEPNP_MAX_COUNT ];
194
192
int totalTestsCount;
193
+ int pointsCount;
195
194
};
196
195
197
196
class CV_solvePnP_Test : public CV_solvePnPRansac_Test
@@ -201,7 +200,7 @@ class CV_solvePnP_Test : public CV_solvePnPRansac_Test
201
200
{
202
201
eps[SOLVEPNP_ITERATIVE] = 1.0e-6 ;
203
202
eps[SOLVEPNP_EPNP] = 1.0e-6 ;
204
- eps[SOLVEPNP_P3P] = 1 .0e-4 ;
203
+ eps[SOLVEPNP_P3P] = 2 .0e-4 ;
205
204
eps[SOLVEPNP_AP3P] = 1.0e-4 ;
206
205
eps[SOLVEPNP_DLS] = 1.0e-4 ;
207
206
eps[SOLVEPNP_UPNP] = 1.0e-4 ;
@@ -216,38 +215,53 @@ class CV_solvePnP_Test : public CV_solvePnPRansac_Test
216
215
Mat trueRvec, trueTvec;
217
216
Mat intrinsics, distCoeffs;
218
217
generateCameraMatrix (intrinsics, rng);
219
- if (method == 4 ) intrinsics.at <double >(1 ,1 ) = intrinsics.at <double >(0 ,0 );
218
+ if (method == SOLVEPNP_DLS)
219
+ {
220
+ intrinsics.at <double >(1 ,1 ) = intrinsics.at <double >(0 ,0 );
221
+ }
220
222
if (mode == 0 )
223
+ {
221
224
distCoeffs = Mat::zeros (4 , 1 , CV_64FC1);
225
+ }
222
226
else
227
+ {
223
228
generateDistCoeffs (distCoeffs, rng);
229
+ }
224
230
generatePose (trueRvec, trueTvec, rng);
225
231
226
232
std::vector<Point3f> opoints;
227
- if (method == 2 || method == 5 )
233
+ switch (method)
228
234
{
229
- opoints = std::vector<Point3f>(points.begin (), points.begin ()+4 );
235
+ case SOLVEPNP_P3P:
236
+ case SOLVEPNP_AP3P:
237
+ opoints = std::vector<Point3f>(points.begin (), points.begin ()+4 );
238
+ break ;
239
+ case SOLVEPNP_UPNP:
240
+ opoints = std::vector<Point3f>(points.begin (), points.begin ()+50 );
241
+ break ;
242
+ default :
243
+ opoints = points;
244
+ break ;
230
245
}
231
- else if (method == 3 )
232
- {
233
- opoints = std::vector<Point3f>(points.begin (), points.begin ()+50 );
234
- }
235
- else
236
- opoints = points;
237
246
238
247
vector<Point2f> projectedPoints;
239
248
projectedPoints.resize (opoints.size ());
240
249
projectPoints (Mat (opoints), trueRvec, trueTvec, intrinsics, distCoeffs, projectedPoints);
241
250
242
- solvePnP (opoints, projectedPoints, intrinsics, distCoeffs, rvec, tvec,
243
- false , method);
251
+ bool isEstimateSuccess = solvePnP (opoints, projectedPoints, intrinsics, distCoeffs, rvec, tvec, false , method);
252
+ if (isEstimateSuccess == false )
253
+ {
254
+ return isEstimateSuccess;
255
+ }
244
256
245
257
double rvecDiff = norm (rvec-trueRvec), tvecDiff = norm (tvec-trueTvec);
246
258
bool isTestSuccess = rvecDiff < epsilon[method] && tvecDiff < epsilon[method];
247
259
248
260
double error = rvecDiff > tvecDiff ? rvecDiff : tvecDiff;
249
261
if (error > maxError)
262
+ {
250
263
maxError = error;
264
+ }
251
265
252
266
return isTestSuccess;
253
267
}
@@ -258,7 +272,7 @@ class CV_solveP3P_Test : public CV_solvePnPRansac_Test
258
272
public:
259
273
CV_solveP3P_Test ()
260
274
{
261
- eps[SOLVEPNP_P3P] = 1 .0e-4 ;
275
+ eps[SOLVEPNP_P3P] = 2 .0e-4 ;
262
276
eps[SOLVEPNP_AP3P] = 1.0e-4 ;
263
277
totalTestsCount = 1000 ;
264
278
}
@@ -311,12 +325,11 @@ class CV_solveP3P_Test : public CV_solvePnPRansac_Test
311
325
ts->set_failed_test_info (cvtest::TS::OK);
312
326
313
327
vector<Point3f> points, points_dls;
314
- const int pointsCount = 500 ;
315
328
points.resize (pointsCount);
316
329
generate3DPointCloud (points);
317
330
318
331
const int methodsCount = 2 ;
319
- int methods[methodsCount ] = {SOLVEPNP_P3P, SOLVEPNP_AP3P};
332
+ int methods[] = {SOLVEPNP_P3P, SOLVEPNP_AP3P};
320
333
RNG rng = ts->get_rng ();
321
334
322
335
for (int mode = 0 ; mode < 2 ; mode++)
@@ -330,7 +343,6 @@ class CV_solveP3P_Test : public CV_solvePnPRansac_Test
330
343
if (runTest (rng, mode, methods[method], points, eps, maxError))
331
344
successfulTestsCount++;
332
345
}
333
- // cout << maxError << " " << successfulTestsCount << endl;
334
346
if (successfulTestsCount < 0.7 *totalTestsCount)
335
347
{
336
348
ts->printf ( cvtest::TS::LOG, " Invalid accuracy for method %d, failed %d tests from %d, maximum error equals %f, distortion mode equals %d\n " ,
0 commit comments