首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在opencv中通过程序参数定义特征类型?

如何在opencv中通过程序参数定义特征类型?
EN

Stack Overflow用户
提问于 2017-08-16 18:52:45
回答 3查看 647关注 0票数 0

目前,更改特征类型是通过在代码中手动更改名称来完成的。例如,对于SURF检测器和描述符,我必须在下面的代码示例中将单词"SURF“更改为其他名称:

代码语言:javascript
复制
Ptr<SURF> detector = SURF::create();
Ptr<SURF> descriptor = SURF::create();

有没有办法通过程序参数改变"SURF“零件来改变特征类型?

我希望能够批量评估多个特征类型,而不是每次都手动键入特征类型。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-17 17:26:28

OpenCV 3.x

这方面没有内置的函数。使用Ptr<FeatureDetector>定义检测器(描述符等效于Ptr<DescriptorExtractor>)。示例代码如下:

代码语言:javascript
复制
string det = argv[4]; //assuming detector definition is fourth argument
Ptr<FeatureDetector> detector;
if (det == "SURF") {
    detector = SURF::create();
} else if (det == "SIFT") {
    detector = SIFT::create();
}

OpenCV 2.4.x

使用提供的函数Ptr cv::FeatureDetector::create(const string& detectorType)。有关更多详细信息,请参阅slawekwin的答案。

票数 0
EN

Stack Overflow用户

发布于 2017-08-16 19:45:10

看起来您会喜欢Ptr cv::FeatureDetector::create(const string& detectorType)函数提供的功能:

代码语言:javascript
复制
"FAST" – FastFeatureDetector 
"STAR" – StarFeatureDetector 
"SIFT" – SIFT (nonfree module) 
"SURF" – SURF (nonfree module) 
"ORB" – ORB
"BRISK" – BRISK 
"MSER" – MSER 
"GFTT" – GoodFeaturesToTrackDetector
"HARRIS" – GoodFeaturesToTrackDetector with Harris detector enabled
"Dense" – DenseFeatureDetector 
"SimpleBlob" – SimpleBlobDetector

Also a combined format is supported: 
  feature detector adapter name ( "Grid" – GridAdaptedFeatureDetector, "Pyramid" – PyramidAdaptedFeatureDetector )
   + feature detector name (see above), for example: "GridFAST", "PyramidSTAR"

它返回一个指向FeatureDetector基类的指针,因此您可以在运行时使用多态性来选择特定的实现:

代码语言:javascript
复制
//assuming image path is the first command line parameter and detector type is the second parameter
auto image = cv::imread(argv[1]);
auto ptr = cv::FeatureDetector::create(argv[2]); //auto evaulates to cv::Ptr<cv::FeatureDetector> here
std::vector<cv::KeyPoint> keypoints;
ptr->detect(image, keypoints);
for (auto kp : keypoints)
    cv::circle(image, kp.pt, 2, cv::Scalar(0, 255, 255), -1);
cv::imwrite(argv[1], image);
票数 1
EN

Stack Overflow用户

发布于 2017-08-16 19:20:23

那么模板呢?

代码语言:javascript
复制
template<class T> cv::Ptr<T> FeatureDetectorCreator()
{
    return T::create();
};

然后,您可以使用以下命令调用它:

代码语言:javascript
复制
cv::Ptr<SURF> detector = FeatureDetectorCreator<SURF>();

替代方法可以是宏。

只有当所有这些特征检测器共享一个公共接口时,才能工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45711614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档