當前更改的要素類型是通過在代碼中手動更改名稱完成的。例如,對於SURF檢測器和描述符,我有單詞「SURF」更改爲其他名稱下面的代碼示例:如何通過opencv中的程序參數定義要素類型?
Ptr<SURF> detector = SURF::create();
Ptr<SURF> descriptor = SURF::create();
有沒有辦法改變「SURF」改變了功能型部分通過程序參數?
我希望能夠批量評估多種功能類型,而不是每次手動鍵入功能類型。
當前更改的要素類型是通過在代碼中手動更改名稱完成的。例如,對於SURF檢測器和描述符,我有單詞「SURF」更改爲其他名稱下面的代碼示例:如何通過opencv中的程序參數定義要素類型?
Ptr<SURF> detector = SURF::create();
Ptr<SURF> descriptor = SURF::create();
有沒有辦法改變「SURF」改變了功能型部分通過程序參數?
我希望能夠批量評估多種功能類型,而不是每次手動鍵入功能類型。
沒有內置函數。使用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();
}
使用提供的功能Ptr<FeatureDetector> cv::FeatureDetector::create(const string& detectorType)
。欲瞭解更多詳情,請參閱由slawekwin回答。
模板呢?
template<class T> cv::Ptr<T> FeatureDetectorCreator()
{
return T::create();
};
那麼你就可以把它叫做:
cv::Ptr<SURF> detector = FeatureDetectorCreator<SURF>();
替代可能是一個宏。
只有在所有這些特徵檢測器共用一個通用接口的情況下才有效。
看來你想通過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);
我想使用字符串輸入作爲程序參數來編程。編輯問題澄清。 – SK90