2017-08-16 108 views
0

当前更改的要素类型是通过在代码中手动更改名称完成的。例如,对于SURF检测器和描述符,我有单词“SURF”更改为其他名称下面的代码示例:如何通过opencv中的程序参数定义要素类型?

Ptr<SURF> detector = SURF::create(); 
Ptr<SURF> descriptor = SURF::create(); 

有没有办法改变“SURF”改变了功能型部分通过程序参数?

我希望能够批量评估多种功能类型,而不是每次手动键入功能类型。

回答

0

OpenCV 3.x

没有内置函数。使用Ptr<FeatureDetector>来定义一个检测器(描述符相当于Ptr<DescriptorExtractor>)。示例代码如下:

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<FeatureDetector> cv::FeatureDetector::create(const string& detectorType)。欲了解更多详情,请参阅由slawekwin回答。

0

模板呢?

template<class T> cv::Ptr<T> FeatureDetectorCreator() 
{ 
    return T::create(); 
}; 

那么你就可以把它叫做:

cv::Ptr<SURF> detector = FeatureDetectorCreator<SURF>(); 

替代可能是一个宏。

只有在所有这些特征检测器共用一个通用接口的情况下才有效。

+0

我想使用字符串输入作为程序参数来编程。编辑问题澄清。 – SK90

1

看来你想通过Ptr<FeatureDetector> cv::FeatureDetector::create(const string& detectorType)函数提供的功能:

"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基类,这样你就可以使用多态运行时选择具体的实现:

//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); 
+0

我也在看这个。你能否详细说明如何为此使用多态。我以前没有用过它。顺便说一句,我打算使用字符串输入作为程序参数来选择要素类型。编辑问题的澄清。 – SK90

+2

该解决方案使用字符串作为输入。看看:http://docs.opencv.org/2.4/modules/features2d/doc/common_interfaces_of_feature_detectors.html – Micka

+0

@ SK90我添加了一个示例程序,显示如何使用此功能。你不必在这里做任何明确的关于多态性的事情 - 只需使用接口函数并让运行时找出正确的实现 – slawekwin

相关问题