2015年7月18日土曜日

OpenCV 特徴点検出+マッチング

OpenCVにおけるマッチングは次のプロセスを経て実現されます。

特徴点抽出
  ↓
特徴量記述の計算の実行
  ↓
マッチング

少し突っ込めば、さらに双方向マッチングの実施+マッチング距離の閾値以下の除去があります。それを入れると、

特徴点抽出
  ↓
特徴量記述の計算の実行
  ↓
双方向マッチング
  ↓
マッチング距離の閾値以下の除去

それでは、一気にコードを見てみましょう。(ORBを使用)

// FeatureDetectorオブジェクトの生成
Ptr<FeatureDetector> detector = new ORB(80, 1.25f, 4, 7, 0, 2, 0, 7);

// DescriptionExtractorオブジェクトの生成
Ptr<DescriptorExtractor> extractor = DescriptorExtractor::create("ORB");

// DescriptorMatcherオブジェクトの生成
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce-Hamming");

// 特徴点情報を格納するための変数
vector<KeyPoint> keypoints1;
vector<KeyPoint> keypoints2;

// Extract feature points
detector->detect(img1, keypoints1);
detector->detect(img2, keypoints2);

// 画像の特徴情報を格納するための変数
Mat descriptor1;
Mat descriptor2;

// compute the feature discriptor
extractor->compute(img1, keypoints1, descriptor1);
extractor->compute(img2, keypoints2, descriptor2);

// 特徴点のマッチング情報を格納する変数
vector<DMatch> dmatch;

// compute matching
matcher->match(descriptor1, descriptor2, dmatch);

// Extract matching which has high matching rate
int count = dmatch.size();
int matchCount = 0;

double min_dist = DBL_MAX;
for (int i = 0; i < (int)dmatch.size(); i++) { // Acquire the minimum distance
double dist = dmatch[i].distance;

if (dist < min_dist) {
min_dist = dist;
}
}
if (min_dist < 1.0)
{
min_dist = 1.0;
}

double threshold = 30; // Fixed value is better than value times min_dist

for (int i = 0; i < (int)dmatch.size(); i++) {
if (dmatch[i].distance < threshold) {
matchCount++;

dmatchClose.push_back(dmatch[i]);
}
//std::cout << dmatch[i].distance << "\t" << min_dist << "\t" << threshold << std::endl;
}




参考:
OpenCVで画像の特徴抽出・マッチングを行う
http://whoopsidaisies.hatenablog.com/entry/2013/12/07/135810
OpenCVでのORBによる特徴点抽出とマッチング(その1)基本的な使い方
http://independence-sys.net/main/?p=2632

OpenGLでGLUTを使って2つのウィンドウを制御する①
http://blog.goo.ne.jp/omty/e/c8a5aee50e3918a1ad669472ec25e462
サブウィンドウ
http://seesaawiki.jp/w/mikk_ni3_92/d/%c8%af%c5%b8%ca%d403

PixelBufferObject
http://seesaawiki.jp/w/mikk_ni3_92/d/PixelBufferObject

Visual Studioでデバッグ時にOpenCVのMat等の画像を表示できるプラグインが便利
http://whoopsidaisies.hatenablog.com/entry/2014/11/28/175637



0 件のコメント:

コメントを投稿