|
|
|
@ -249,7 +249,7 @@ bool solvePnPRansac(InputArray _opoints, InputArray _ipoints, |
|
|
|
|
ipoints = ipoints0; |
|
|
|
|
|
|
|
|
|
int npoints = std::max(opoints.checkVector(3, CV_32F), opoints.checkVector(3, CV_64F)); |
|
|
|
|
CV_Assert( npoints >= 0 && npoints == std::max(ipoints.checkVector(2, CV_32F), ipoints.checkVector(2, CV_64F)) ); |
|
|
|
|
CV_Assert( npoints >= 4 && npoints == std::max(ipoints.checkVector(2, CV_32F), ipoints.checkVector(2, CV_64F)) ); |
|
|
|
|
|
|
|
|
|
CV_Assert(opoints.isContinuous()); |
|
|
|
|
CV_Assert(opoints.depth() == CV_32F || opoints.depth() == CV_64F); |
|
|
|
@ -279,6 +279,31 @@ bool solvePnPRansac(InputArray _opoints, InputArray _ipoints, |
|
|
|
|
ransac_kernel_method = SOLVEPNP_P3P; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if( model_points == npoints ) |
|
|
|
|
{ |
|
|
|
|
bool result = solvePnP(opoints, ipoints, cameraMatrix, distCoeffs, _rvec, _tvec, useExtrinsicGuess, ransac_kernel_method); |
|
|
|
|
|
|
|
|
|
if(!result) |
|
|
|
|
{ |
|
|
|
|
if( _inliers.needed() ) |
|
|
|
|
_inliers.release(); |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(_inliers.needed()) |
|
|
|
|
{ |
|
|
|
|
_inliers.create(npoints, 1, CV_32S); |
|
|
|
|
Mat _local_inliers = _inliers.getMat(); |
|
|
|
|
for(int i = 0; i < npoints; i++) |
|
|
|
|
{ |
|
|
|
|
_local_inliers.at<int>(i) = i; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Ptr<PointSetRegistrator::Callback> cb; // pointer to callback
|
|
|
|
|
cb = makePtr<PnPRansacCallback>( cameraMatrix, distCoeffs, ransac_kernel_method, useExtrinsicGuess, rvec, tvec); |
|
|
|
|
|
|
|
|
@ -293,26 +318,6 @@ bool solvePnPRansac(InputArray _opoints, InputArray _ipoints, |
|
|
|
|
int result = createRANSACPointSetRegistrator(cb, model_points, |
|
|
|
|
param1, param2, param3)->run(opoints, ipoints, _local_model, _mask_local_inliers); |
|
|
|
|
|
|
|
|
|
if( result > 0 ) |
|
|
|
|
{ |
|
|
|
|
vector<Point3d> opoints_inliers; |
|
|
|
|
vector<Point2d> ipoints_inliers; |
|
|
|
|
opoints = opoints.reshape(3); |
|
|
|
|
ipoints = ipoints.reshape(2); |
|
|
|
|
opoints.convertTo(opoints_inliers, CV_64F); |
|
|
|
|
ipoints.convertTo(ipoints_inliers, CV_64F); |
|
|
|
|
|
|
|
|
|
const uchar* mask = _mask_local_inliers.ptr<uchar>(); |
|
|
|
|
int npoints1 = compressElems(&opoints_inliers[0], mask, 1, npoints); |
|
|
|
|
compressElems(&ipoints_inliers[0], mask, 1, npoints); |
|
|
|
|
|
|
|
|
|
opoints_inliers.resize(npoints1); |
|
|
|
|
ipoints_inliers.resize(npoints1); |
|
|
|
|
result = solvePnP(opoints_inliers, ipoints_inliers, cameraMatrix, |
|
|
|
|
distCoeffs, rvec, tvec, false, |
|
|
|
|
(flags == SOLVEPNP_P3P || flags == SOLVEPNP_AP3P) ? SOLVEPNP_EPNP : flags) ? 1 : -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if( result <= 0 || _local_model.rows <= 0) |
|
|
|
|
{ |
|
|
|
|
_rvec.assign(rvec); // output rotation vector
|
|
|
|
@ -323,10 +328,38 @@ bool solvePnPRansac(InputArray _opoints, InputArray _ipoints, |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
|
|
|
|
|
vector<Point3d> opoints_inliers; |
|
|
|
|
vector<Point2d> ipoints_inliers; |
|
|
|
|
opoints = opoints.reshape(3); |
|
|
|
|
ipoints = ipoints.reshape(2); |
|
|
|
|
opoints.convertTo(opoints_inliers, CV_64F); |
|
|
|
|
ipoints.convertTo(ipoints_inliers, CV_64F); |
|
|
|
|
|
|
|
|
|
const uchar* mask = _mask_local_inliers.ptr<uchar>(); |
|
|
|
|
int npoints1 = compressElems(&opoints_inliers[0], mask, 1, npoints); |
|
|
|
|
compressElems(&ipoints_inliers[0], mask, 1, npoints); |
|
|
|
|
|
|
|
|
|
opoints_inliers.resize(npoints1); |
|
|
|
|
ipoints_inliers.resize(npoints1); |
|
|
|
|
result = solvePnP(opoints_inliers, ipoints_inliers, cameraMatrix, |
|
|
|
|
distCoeffs, rvec, tvec, useExtrinsicGuess, |
|
|
|
|
(flags == SOLVEPNP_P3P || flags == SOLVEPNP_AP3P) ? SOLVEPNP_EPNP : flags) ? 1 : -1; |
|
|
|
|
|
|
|
|
|
if( result <= 0 ) |
|
|
|
|
{ |
|
|
|
|
_rvec.assign(_local_model.col(0)); // output rotation vector
|
|
|
|
|
_tvec.assign(_local_model.col(1)); // output translation vector
|
|
|
|
|
|
|
|
|
|
if( _inliers.needed() ) |
|
|
|
|
_inliers.release(); |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
_rvec.assign(rvec); // output rotation vector
|
|
|
|
|
_tvec.assign(tvec); // output translation vector
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(_inliers.needed()) |
|
|
|
|