OpenCV学習ノート(50)——アルゴリthm類紹介(core)

2730 ワード

記事の由来:http://blog.csdn.net/yang_xian 521/articale/detail/7533922
      新しい2.4.0を勉強し始めたばかりです.マニュアルを一度見ましたが、やはりがっかりしました.多くの章節はまだ2.3.1の内容です.文書のコードも穴が多いです.ここでは、簡単にAlgorithmという新しい基質を紹介します.この部分は新しいモジュールだと思っていましたが、referenceManualを見てはじめて、それは一つの基本類にすぎないことが分かりました.BMアルゴリズムなどの立体マッチングアルゴリズムがいくつか集められています.前景背景分離のアルゴリズムや光流法などのモジュールが集積されています.クラスのメンバー関数は主にget、set、writhe、read、get List、createなどの関数があります.前の4つは文字列とXMLファイルからアルゴリズムを読み取るためのパラメータ用で、getを使って、setはパラメータの名前に対応するタイプがデータのタイプに対応しています.Algorithm::write,以后SITF:wirteやSURF:writeよ、もう会えます.get ListはAlgorithmによってサポートされるアルゴリズムタイプを得ることができる.私はget Listのアルゴリズムをテストしました.BRIF、Dense、FAST、CFIT、HARRIS、MSER、ORB、SIFT、STAR、SURFは後で実現するはずです.マニュアルにはSURFとSIFTの紹介しかありません.少なくとも現在はこの二つのアルゴリズムだけをサポートしているように思います.createはアルゴリズムを作成する関数です.使うのも比較的簡単です.ここでやはり説明したいのですが、新版のfeature s 2 dモジュールは大幅に変更されています.いずれにしても、この部分の多くは、特徴記述子、記述子の抽出、特徴のマッチングなど、いくつかの共通インターフェースを見ています.FAST、MSER、ORBだけはドキュメントにしっかりと現れています.以前のStar、randomTree、rTree Class ifeは捨てられています.mlを入れるべきです.SIFT、SURFなどもnonfreeという新しいモジュールに入れられましたが、この新しいモジュールは弱いです.SIFTとSURFアルゴリズムしかありません.今後は他のアルゴリズムを統合する予定です.
       次に、ドキュメントの一例に基づいて、新しいバージョンのSIFT特徴点検出アルゴリズムを実践し、以前のバージョンのSITFの書き方を比較して、新しい構造の違いを感じてみましょう.
 
#include <opencv2/opencv.hpp>
#include <opencv2/nonfree/nonfree.hpp>
#include <opencv2/nonfree/features2d.hpp>

using namespace cv;

void main()
{
	Mat image = imread("church01.jpg");
	Mat imageGray = imread("church01.jpg", 0);
	Mat descriptors;
	vector<KeyPoint> keypoints;
	//    2.4.0  
	initModule_nonfree();

	Ptr<Feature2D> sift1 = Algorithm::create<Feature2D>("Feature2D.SIFT");
	sift1->set("contrastThreshold", 0.01f);
	(*sift1)(imageGray, noArray(), keypoints, descriptors);

	// 2.3.1  
// 	SiftFeatureDetector sift2(0.06f, 10.0);
// 	sift2.detect(imageGray, keypoints);
	
	drawKeypoints(image, keypoints, image, Scalar(255,0,0));

	imshow("test", image);
	waitKey();
}
     initModuleに注意してくださいmodulename>()関数は、この関数はcreateの前に使ってこそ、動的にアルゴリズムを作成できます.でないと、createの針はとても野ですよ.みんな分かります.SURF、SIFTアルゴリズムを使うなら、inintModule_を呼び出します.nonfree()は、EMアルゴリズムを使うには、まずinitModuleを呼び出す必要があります.ml()
     実は私の考えでは、このAlgorithm類は開発者のアルゴリズムに共通のインターフェースを提供しています.これから開発者が開発したアルゴリズムはOpenCVに追加したいです.Algorithmのインターフェースによってすればいいです.これからアルゴリズムが増えないように、OpenCVも太っています.
自分のアルゴリズムクラスを作成するのも簡単です.Algorithmクラスをベースに、アルゴリズムのパラメータをメンバー変数として、get関数で呼び出し、AlgorithmInfo*info()constを追加して、自分のアルゴリズムクラスに行って、構造関数を追加します.AlgorithmInfo変数は、EMアルゴリズムの初期化を参照して、他の関数を追加してください.できたらcreateで自分の関数を呼んでください.今回は簡単に紹介してください.後で自分で関数を作って、経験してから詳しく書いてください.