OpenCV如何使用UsacParams和指定USAC方法



我正在使用openCV 4.5,我正在使用USAC来找到基本矩阵。这对于指定USAC方法很有效:

import cv2
a,b = cv2.FindFundamentalMat(pts1, pts2, cv2.USAC_FAST)

,这可以很好地指定USAC参数:

params = cv2.UsacParams()
params.maxIterations=700
a,b = cv2.FindFundamentalMat(pts1, pts2, params)

但是我不知道如何同时指定方法和设置。还是方法决定设置?

查看c++源代码,我们可以看到调用函数的两种不同方式(带或不带UsacParams)会导致对setParameters的不同调用。

总之,你是对的,方法的选择(例如USAC_FAST)决定了(至少在c++代码中)。

从https://github.com/opencv/opencv/blob/4.x/modules/calib3d/src/usac/ransac_solvers.cpp

如果你传递UsacParams:

void setParameters (Ptr<Model> &params, EstimationMethod estimator, const UsacParams &usac_params, bool mask_needed) {
params = Model::create(usac_params.threshold, estimator, usac_params.sampler, usac_params.confidence, usac_params.maxIterations, usac_params.score);
params->setLocalOptimization(usac_params.loMethod);
params->setLOSampleSize(usac_params.loSampleSize);
params->setLOIterations(usac_params.loIterations);
params->setParallel(usac_params.isParallel);
params->setNeighborsType(usac_params.neighborsSearch);
params->setRandomGeneratorState(usac_params.randomGeneratorState);
params->maskRequired(mask_needed);
}

如果你传递一个方法而不是UsacParams:

void setParameters (int flag, Ptr<Model> &params, EstimationMethod estimator, double thr,
int max_iters, double conf, bool mask_needed) {
switch (flag) {
case USAC_DEFAULT:
params = Model::create(thr, estimator, SamplingMethod::SAMPLING_UNIFORM, conf, max_iters, ScoreMethod::SCORE_METHOD_MSAC);
params->setLocalOptimization(LocalOptimMethod ::LOCAL_OPTIM_INNER_AND_ITER_LO);
break;
case USAC_MAGSAC:
params = Model::create(thr, estimator, SamplingMethod::SAMPLING_UNIFORM, conf, max_iters, ScoreMethod::SCORE_METHOD_MAGSAC);
params->setLocalOptimization(LocalOptimMethod ::LOCAL_OPTIM_SIGMA);
params->setLOSampleSize(params->isHomography() ? 75 : 50);
params->setLOIterations(params->isHomography() ? 15 : 10);
break;
case USAC_PARALLEL:
params = Model::create(thr, estimator, SamplingMethod::SAMPLING_UNIFORM, conf, max_iters, ScoreMethod::SCORE_METHOD_MSAC);
params->setParallel(true);
params->setLocalOptimization(LocalOptimMethod ::LOCAL_OPTIM_INNER_LO);
break;
case USAC_ACCURATE:
params = Model::create(thr, estimator, SamplingMethod::SAMPLING_UNIFORM, conf, max_iters, ScoreMethod::SCORE_METHOD_MSAC);
params->setLocalOptimization(LocalOptimMethod ::LOCAL_OPTIM_GC);
params->setLOSampleSize(20);
params->setLOIterations(25);
break;
case USAC_FAST:
params = Model::create(thr, estimator, SamplingMethod::SAMPLING_UNIFORM, conf, max_iters, ScoreMethod::SCORE_METHOD_MSAC);
params->setLocalOptimization(LocalOptimMethod ::LOCAL_OPTIM_INNER_AND_ITER_LO);
params->setLOIterations(5);
params->setLOIterativeIters(3);
break;
case USAC_PROSAC:
params = Model::create(thr, estimator, SamplingMethod::SAMPLING_PROSAC, conf, max_iters, ScoreMethod::SCORE_METHOD_MSAC);
params->setLocalOptimization(LocalOptimMethod ::LOCAL_OPTIM_INNER_LO);
break;
case USAC_FM_8PTS:
params = Model::create(thr, EstimationMethod::Fundamental8,SamplingMethod::SAMPLING_UNIFORM, conf, max_iters,ScoreMethod::SCORE_METHOD_MSAC);
params->setLocalOptimization(LocalOptimMethod ::LOCAL_OPTIM_INNER_LO);
break;
default: CV_Error(cv::Error::StsBadFlag, "Incorrect flag for USAC!");
}
// do not do too many iterations for PnP
if (estimator == EstimationMethod::P3P) {
if (params->getLOInnerMaxIters() > 15)
params->setLOIterations(15);
params->setLOIterativeIters(0);
}
params->maskRequired(mask_needed);
}

有关更多信息,请查看此处不同参数的描述:https://docs.opencv.org/4.5.0/d1/df1/md__build_master-contrib_docs-lin64_opencv_doc_tutorials_calib3d_usac.html

相关内容

最新更新