2017-08-16 116 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

相關問題