おべんきょうwiki

OpenCV:画像特徴点

最終更新:

yahirohumpty

- view
管理者のみ編集可
以下の記述は古い可能性があるので常に最新の情報を参照してください.
http://docs.opencv.org/modules/features2d/doc/features2d.html


SIFTに端を発する特徴点ベースのマッチング手法について.
OpenCVの実装では特徴点抽出,特徴量計算,対応点探索をそれぞれ好きなのを使える.
なお,Fernはこのフレームワークに収まらないため別の実装になる.



特徴点抽出



特徴点抽出では
FeatureDetectorという基底クラスを元にしている.
FeatureDetector::create()に文字列を与えて色々作れる.
  • "FAST"
  • "STAR"
  • "SIFT"
  • "SURF"
  • "ORB"
  • "BRISK"
  • "MSER"
  • "GFTT"
  • "HARRIS"
  • "Dense"
  • "SimpleBlob"
が使える.また"Grid...","Pyramid..."と接頭辞を付け加えると
それぞれ格子状に区切った範囲,ピラミッド画像に適用したものにすることができる.



特徴量計算



特徴量計算も同様に
DescriptorExtractorという基底クラスを元にしている.
DescriptorExtractor::create()では
  • "SIFT"
  • "SURF"
  • "ORB"
  • "BRISK"
  • "BRIEF"
が使える.また"Opponent..."とするとOpponent色空間に適用することができ,
記述子の次元が三倍になる.

2.4.2以降ではFREAKという記述子が使えるようになっているが,
create()では作れない.cv::FREAKを直接作る.


対応点探索



対応点探索もやはりDescriptorMatcherという基底クラスがあり,
DescriptorMatcher::create()では
  • BruteForce (it uses L2 )
  • BruteForce-L1
  • BruteForce-Hamming
  • BruteForce-Hamming(2)
  • FlannBased
が選べる.



対応点探索における注意点として,
記述子間の距離を計算するときにユークリッド距離かハミング距離かを考えなければいけない.
SIFTなどはユークリッド距離だが
BRIEF,ORB,FREAKなどはバイナリ記述子なのでハミング距離になる.
これがFlannBasedMatcherで例外を引き起こす原因になる.


Note that SIFT requires an euclidean-distance-based matcher (FLANN), but FREAK or other binary descriptors require a hamming-distance-based matcher.



The LinearIndexParams and the small data set were just an simple example to demonstrate the problem.
I actually want to use the KDTreeIndexParams on large data sets with about 10^6 * 128 uchar values.
The KDTreeIndexParams work fine on float data but fail when trying to use uchar data.
I want to emphasize again that the documentation of the original FLANN library states that uchar is supported.


どちらに該当するかは記述子を格納している行列のtype()で判定可能.


CV_8Uであれば,バイナリ記述子であるためLshIndexParamsを利用する.
引数は三つのintで,
前からテーブルサイズ,キーのビット数,隣接バケットチェックのためのビットシフト桁数.

目安箱バナー