我々はすべて知っているように、opencv3.0バージョン、変化の無限の多様いるので、まだopencv2と比べて大きな違いがあります。あなたが学習「OpenCV3プログラミングエントリー」からこの本を見つけることができるかもしれない、より良いフロントなどの特徴抽出などの比較的複雑な画像処理の裏、本当に大きな変化に。opencv_contribに統合さ3.0特徴抽出関連の機能は、あなたがあなた自身を設定する必要があり、その後、あなたは良いサンプルプログラムを見つける本を設定するには、130分かかった場合でも、まだかかりません。ヘッダファイルを含む多くの機能が変更されているので、キー作者怠惰な死者のおしゃべりは、opencv2の直接使用の手がかりバージョンを明らかにしなかった、プライムリアルガス叫び!!!ノー道、唯一のハードopencv3のバージョンでこれらの私たちの上、最も邪悪な煙は、オンライン情報を見つけることは容易でもあるので、実行時間の130分の成功嘔吐の前に連れて行ってくれました!次はあなたがそれを共有しました!
opencv_contrib構成
最初の、そして最も重要なステップは、opencv_contrib構成、使用cmakeのに必要であり、私はVS2015 + OpenCV3.2.0を使用し、その後も多くの時間を費やしopencv_contribを設定し、私は、オンラインまたはの多くの、特定のチュートリアルを導入していませんもちろん、あなたはすべての後、誰も神の祝福がヒッヒッヒを注ぎ、あなたの運で成功おしゃべりすることはできません。以下の構成チュートリアルのリンク、与えられた(個人用)openCV3.2.0のconfigure VS2013を+ opencv_contribのインストール、私はあなたが成功率が高くなります一緒に、いくつかのチュートリアルを比較見つけることを示唆しています。
ヘッダファイルの変更
コードが長くありませんが、実際に嘔吐物の多くを変更する場所、SURF特徴抽出コード:私は本のサンプルプログラム11.2.3を使用しています。最初の多くは、ブルートフォース相関関数における本来置くSURFのnonfree.hppとlegacy.hppとして、今xfeatures2d.hppの内部に配置され、opencv_contribに統合され、ヘッダファイルです。あなただけもちろん、次のヘッダーファイルを追加する必要があるので、前提は、configure opencv_contribに持っています。
書式#include <opencv2 / xfeatures2d.hpp>
名前空間xfeatures2dを使用して、
この名前空間は、あなたはまだ不可能、また、そうでない場合は、それらの相関関数は非常に重要であるので、それは本当に非常に静か嘔吐物ですが、トラブルが死んでおしゃべりです!
定義された特徴検出クラスオブジェクト
コードブックは、
SurfFeatureDetector検出器(minHessian)。
detector.detect(srcImage1、keypoint1)。
opencv3バージョンポインタ定義された方法のように変更され、それは2つの方法がAと原SURF SurfFeatureDetectorによって定義されたクラスを定義した通りで直接使用があり、矢印()関数によって検出呼び出す必要があり、別の方法であり、これは種は、この使用しても備えるユニバーサル特徴抽出法,,のように見える
方法を:
PTR <SurfFeatureDetector>検出器= SurfFeatureDetector ::作成(minHessian)。
detector->(srcImage1、keypoint1)を検出します。
方法2:
PTR <SURF>検出器= SURF ::作成(minHessian)。
detector->(srcImage1、keypoint1)を検出します。
記述子(特徴ベクトル)を算出します
コードブックは、
SurfDescriptorExtractor抽出。
extractor.compute(srcImage1、keypoint1、descriptors1)。
ロングコードクラス定義として、以下のように定義することができるように以下の変更は、それによって得られます
//方法一
のPtr <SurfDescriptorExtractor>抽出= SurfDescriptorExtractor ::作成();
//方法二
//のPtr <SURF>抽出= SURF ::()を作成します。
extractor->計算(srcImage1、keypoint1、descriptors1)。
使用ブルートフォース試合
コードブックは、
BruteForceMatcher <L2 <フロート>>マッチャー。
matcher.match(descriptors1、descriptors2、マッチ)。
ここで上記と多少異なるが、それは依然として本なく、ポインタクラスに類似しており、他方はBFMatcherクラス直接ヘッダファイルに定義されている、二つの変更方法、同方法によって一つを有します
//方法一
のPtr <DescriptorMatcher>マッチャー= DescriptorMatcher ::(「ブルートフォース」)を作成します。
matcher->(descriptors1、descriptors2、マッチ)と一致。
//方法二
// BFMatcherマッチャ(NORM_L2)。
//matcher.match(descriptors1、descriptors2、マッチ)。
完全なコード
その他の部分は基本的に同じで、まだ使用するようにすべての完全なコードを与える、私はそう寛大な、私は非常に高貴な比較が、フリー喜喜でした!
#include<opencv2/opencv.hpp>
#include<opencv2/xfeatures2d.hpp>
#include<iostream>
using namespace cv;
using namespace xfeatures2d;
using namespace std;
int main()
{
Mat srcImage1 = imread("linlin.jpg");
Mat srcImage2 = imread("linlin2.jpg");
//使用SURF算子检测关键点
int minHessian = 700; //SURF算法中的Hessian阈值
Ptr<SurfFeatureDetector>detector = SurfFeatureDetector::create(minHessian);// 定义一个特征检测类对象
vector<KeyPoint> keypoint1, keypoint2;//vector模板类,存放任意类型的动态数组
//调用detect函数检测出SURF特征关键点,保存在vector容器中
detector->detect(srcImage1, keypoint1);
detector->detect(srcImage2, keypoint2);
//计算描述符(特征向量)
//方法一
Ptr<SurfDescriptorExtractor> extractor = SurfDescriptorExtractor::create();
//方法二
//Ptr<SURF> extractor = SURF::create();
Mat descriptors1, descriptors2;
extractor->compute(srcImage1, keypoint1, descriptors1);
extractor->compute(srcImage2, keypoint2, descriptors2);
//使用BruteForce进行匹配
//实例化一个匹配器
//方法一
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce");
//方法二
//BFMatcher matcher(NORM_L2);
vector<DMatch> matches;
//匹配两幅图中的描述子
matcher->match(descriptors1, descriptors2, matches);
//绘制从两个图像中匹配出的关键点
Mat imgMatches;
drawMatches(srcImage1, keypoint1, srcImage2, keypoint2, matches, imgMatches); //进行绘制
imshow("匹配图", imgMatches);
waitKey(0);
return 0;
}
実験結果
愛はまだ売春婦の宇宙の日の選択肢ですが、日後の状況があまりにも豊富な雌犬ですので、結果まあ、私と氏ツァイ、ブーツブーツをQingzheziqing売春婦番組を一致させます!(なお、二つの絵と同じサイズのヨーヨーに最高のチューン)