2017-08-16 2 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>(); 

代替MACROである可能性があります。

すべての機能検出器が共通のインターフェイスを共有する場合にのみ機能します。

+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

関連する問題