2016. 9. 9.
石立 喬

OpenCV3.1.0とVisual C++ 2015による画像処理と認識(10)

----- OpenCV3.1.0で用意されている各種特徴点検出器を試す -----

 これは、「OpenCVとVisual C++による画像処理と認識(10)」の続編とも言えるもので、OpenCV3.1.0のFeature Detection and Descriptionサブモジュールに用意されているすべての特徴点検出器の動作を確認する。単純な幾何学的図形と、実写による建築物の二種類の画像を用いて、各特徴点検出器のデフォルト設定で得られた結果と、詳細設定で改善されたものとを紹介する。
 特徴検出の一般論や、前資料で説明済みのものは省略してある。

OpenCV2.4からOpenCV3.1.0への特徴点検出関連クラスの移り変わり
 OpenCV2.4とOpenCV3.0は共通した部分が多く、共に、features2d(2D Featurres Frameworks)モジュールの下に、Feature Detection and DescriptionサブモジュールとCommon Interfaces of Feature Descriptorサブモジュールがあり、前者にはFAST、MSER、ORB、BRISK、FREAKなどのキーポイント検出クラスがあり(OpenCV3.0になって、FREAKが無くなり、KAZE、AKAZE、SIFTが追加になった)、後者にはFeatureDetectorの他、FastFeatureDetector、GoodFeaturesToTrackDetectorなどのラッパー(検出クラスを包含するもの)クラスがあった。
 ところが、OpenCV3.1.0になると、OpenCV3.0からガラッと変わり、features2d(2D Featurres Frameworks)モジュールの下のサブモジュールがFeature Detection and Descritionのみに統合され、その中に、AKAZE、BRISK、KAZE、MSER、ORBの基本クラスと混じって、AgastFeatureDetector(OpenCV3.1.0になって追加)、FastFeatureDetector、GFTTDetectorのラッピングクラスがある。
 すなわち、特徴点検出器に関しては、OpenCV3.0からOpenCV3.1.0になって大きく変わった。
 より基本的な、imgproc((Image Processing)モジュールのFeature DetectionサブモジュールのcornerEigenValsAndVecs、cornerHarris、cornerMinEigenVal、goodFeaturesToTrackは、OpenCV2.4からOpenCV3.1.0まで、変わっていない。

各種特徴点検出器の生成方法
 OpenCV3.0以前では、Common Interface of Feature Detectorに属するFeatureDetectorラッパークラスを共通的に用いて、
  Ptr<FeatureDetector> orb = FeatureDetector::create("ORB");
などにより、、各種の特徴点検出器クラスを生成していた。
 しかし、OpenCV3.1.0では、 FeatureDetectorクラスが無くなり、それぞれの特徴点検出器クラス(またはラッパークラス)を、
  Ptr<GFTTDetector> gftt = GFTTDetector::create();
  Ptr<ORB> orb = ORB::create();
などで個別に生成するようになった。ただし、これらのクラスはFeatur2Dクラスを継承しているので、どちらもPtr<Feature2D>が使える(autoを使えば、型の意識さえ不要)。crteate()の引数で、クラス生成と同時に詳細設定ができるので、便利になった。

各種の特徴点検出法(設定条件はデフォルト値使用)を比較するプログラム
 図1にプログラムを示す。原画像をグレイスケール画像として読み込み、共通に使用するベクトル型検出点pointsを宣言しておく。
特徴点検出器を、各ラッパークラスまたはキーポイント検出器クラスのcreate関数で生成(デフォルト設定)し、detect関数で実行させて、検出した特徴点を、drawPeypoints関数で赤丸で表示する。

使用したOpenCVクラス(関数)の説明
◎特徴点検出器関連クラス
 OpenCV3.1.0に含まれる特徴点検出のラッピングクラスおよびキーポイント検出クラスは多数ある。それらの引数には、すべてデフォルト値が設定されており、筆者が確認したところ、OctaveLayerの数や検出法の選択などアルゴリズムに関係する部分は、一般的な用途には最適化されていることが分かった。したがって、特別の意図がない限り、デフォルトで十分である。
 ただし、検出点数、しきい値など、アルゴリズムと独立した値については、試行錯誤で、変更すると良い場合が多い。
 各クラスの詳細については、下記サイトを参照してほしい。
  OpenCV3.1.0 OpenCV modules
  http://docs.opencv.org/3.1.0/
◎drawKeypoints関数
 features2dモジュールのDrawing Features of Keypoints and Matchesサブモジュールに属する。OpenCV2.4以来、変わっていない。
  drawKeypoints(
    image ---------------- InputArray、キーポイントの原画像
    keypoints ------------- vector<KeyPoint>&、キーポイントベクトルのポインタ
    outimage ------------- InputOutputArray、キーポイントを描く対象画像
    color = Scalar::all(-1) ---Scalar&、デフォルトは、表示の度に乱数で色が変わる
    flags = DrawMatchesFlags::DEFAULT( = 0)、同じ大きさの円を描く
  )
 DrawMatchesFlags::DRAW_RICH_KEYPOINTS( = 4)にすると、強さを円の半径で、方向を矢印で表示する。




図1 デフォルト条件で特徴点抽出を試すプログラム


デフォルト条件で、図形を原画像とした場合の結果
 図2は図1のプログラムで得られた結果で、デフォルト設定でも、AGASTは素晴らしい結果を示している。、GTFFも良い結果が出ているが、デフォルトでは検出する特徴点の最大個数が1000個と大きく設定されているので、傾斜を持った辺などが無理やりに特徴点にさせられている。
 AKAZEとBRISKは、似たような傾向を示し、上辺部、左辺部の特徴点が検出できてない。FASTは、デフォルトでは、ほとんど特徴点を見つけられない。MSERは、ブロブ(blob、binary large object、同じような値のピクセル値を持った塊)検出器なので、普通の特徴点検出器とは異なるが、その性能を十分示している。ORBも、デフォルトでは周辺部の検出に難があるが、これは詳細設定により改善できる(後述)。KAZEは他と異なる特性を示す。MSERと類似してパターン中央部を特徴点としたり、白地の中間点を特徴点としたりする特異な性能を持つ。


 

図2 デフォルト条件での結果(図形)

図形に対する詳細設定の結果
 下記○印は、詳細設定により改善できたもので、デフォルトのまま(変更なし)も含めて、全ての結果を図3に示す。
  AGAST ----- 全く問題がないので、デフォルトのままとする
  AKAZE ----- 引数をいろいろと変えても、上辺部、左辺部の検出はできなかった
 〇BRISK ----- patternScaleをデフォルトの1.0fから0.6fに下げ、thresholdを上げたら、良い結果になった
               auto brisk = BRISK::create(120, 3, 0.6f);
 ○FAST ------ nomaxSuppressionをデフォルトのtrueからfalseに変えたら、多くの特徴点が検出されたので、thresholdを上げた
               auto fast = FastFeatureDetector::create(127, false);
 ○GFTT ------ maxCornersをデフォルトの1000から40に下げたら、ほぼ良好な結果が得られた
               auto gftt = GTFFDetector::create(40);
 ○KAZE ------ thresholdをデフォルトの0.001fから0.005fに上げたら、白地部分の検出点が減った
               auto kaze = KAZE::create(false, false, 0.005f);
  MSER ------ これは特徴点検出とも違い、ブロブ検出は優れているので、デフォルトのままとする
 ○ORB ------ 画像周辺を検出するために、edgeThresholdとpatchSizeをデフォルトの31から7に変更する、scaleFactorもデフォルトの1.2fから1.25fに変更した(「OpenCVとVisual C++による画像処理と認識(10)」を参照)、nfeaturesも80に減らした
               auto orb = ORB::create(80, 1.25f, 4, 7, 0, 2, ORB::HARRIS_SCORE, 7, 20);



図3 条件を細かく調節して改善した結果(図形)


デフォルト条件で、建築物(実写)を原画像とした場合の結果
 図4は図1のプログラムで得られたデフォルト設定の結果で、AGASTとFASTは、検出点が多過ぎ、BRISK、GFTT、KAZEは人の感覚(たとえば、鯱(しゃちほこ)は人間ならだれでも特徴点と思う)に近い。



図4 デフォルト条件での結果(建築物)


実写建築物に対する詳細設定の結果
 下記○印は、詳細設定により改善できたもので、デフォルトのままを含めて、全ての結果を図5に示す。
 ○AGAST ----- thresholdを、デフォルトの10から70に上げた
               auto agast = AgastFeatureDetector::create(70);
  AKAZE ------ デフォルトでも、ほぼ適切な特徴点検出がされており、引数を変えてもほとんど変化がなかった
 〇BRISK ----- thresholdを、デフォルトの30から70に上げた
               auto brisk = BRISK::create(70);
 ○FAST ------ thresholdを、デフォルトの10から70に上げた
               auto fast = FastFeatureDetector::create(70);
 ○GFTT ------ maxCornersをデフォルトの1000から400に下げた
               auto gftt = GTFFDetector::create(400);
  KAZE ------- デフォルトでも、ほぼ適切な特徴点検出がされており、引数を変えてもあまり変化がなかった
  MSER ------- これは特徴点検出とも違い、ブロブ検出は優れているので、デフォルトのままとする
 ○ORB ------- 画像周辺を検出するために、edgeThresholdとpatchSizeをデフォルトの31から7に変更し、scaleFactorもデフォルトの1.2fから1.25fに変更した(「OpenCVとVisual C++による画像処理と認識(10)」を参照)、nfeaturesも400に減らした
               auto orb = ORB::create(400, 1.25f, 8, 7, 0, 2, ORB::HARRIS_SCORE, 7);



図5 しきい値を高めたり、検出個数を減らしたりして改善した結果(建築物)


結 論
 OpenCVの特徴点検出器には、鋭意研究された多くの方法が採用されている。いずれも甲乙つけがたい筈であるが、ここで用いた特定の画像に関する限りでは、AGASTがデフォルトでも素晴らしい結果を示し、BRISK、FAST、GFTT、ORBが詳細設定により納得できる結果になった。
 KAZEは、図形に対して少し特色のある性能を示す。パターンの中心部や、パターンのない部分の中心部も特徴点として検出する。AKAZEには、そのような傾向はなく、その代わり、画像の上辺部、左辺部の検出ができない。
 ただし、特徴検出は、これで終わりではなく、マッチングの対象としての優劣が問われるので、判断はもう少し待ちたい。

参考文献
AGAST
 E. Mair他、"Adaptive and Generic Corner Detection Based on the Accelerated Segment Test"(2010)
 http://www6.in.tum.de/Main/Publications/Mair2010c.pdf
AKAZE
 P. F. Alcantarilla他、"Fast Explicit Diffusion for Accerelated Features in Nonlinear Scale Spaces"(2013)
 http://isit.u-clermont1.fr/~ab/Publications/Alcantarilla_etal_BMVC13.pdf
BRISK
 S. Leutenegger他、"BRISK: Binary Robust Invariant Scalable Keypoints" (2011)
 http://www.robots.ox.ac.uk/~vgg/rg/papers/brisk.pdf
FAST
 E. Rosten他、 "Machine Learning for High-Speed Corner Detection"(2006)
 http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.60.3991&rep=rep1&type=pdf
GFTT
 J. Shi他、"Good Features to Track"(1994)
 https://users.cs.duke.edu/~tomasi/papers/shi/TR_93-1399_Cornell.pdf
KAZE
 P. F. Alcantarilla他、"KAZE Features"(2012)
 https://www.doc.ic.ac.uk/~ajd/Publications/alcantarilla_etal_eccv2012.pdf
MSER
 J. Matas他、"Robust Wide Baseline Stereo from Maximally Stable External Regions"(2002)
 https://www.robots.ox.ac.uk/~vgg/research/affine/det_eval_files/matas_bmvc2002.pdf
ORB
 E.Rublee他、"ORB: An Efficient Alternative to SIFT and SURF"(2011)
 http://www.vision.cs.chubu.ac.jp/CV-R/pdf/Rublee_iccv2011.pdf







「Visual C++の勉強部屋」(目次)へ