(4)OpenCVでの機能検出のSURF導入(高速で堅牢な機能)



Surf Introduction Feature Detection Opencv Fast



注:この記事は、OpenCV3.0.0ドキュメント-> OpenCV-Pythonチュートリアルから翻訳されたもので、元のドキュメントのエラーコードの修正が含まれています。

1.目的



  • SURFの基本を学ぶ
  • OpenCVのSURF関数を参照してください

2.理論

前の章では、キーポイントの検出とSIFTの説明を見ました。ただし、速度は比較的遅いため、より高速なバージョンが必要です。 2006年、Bay、H.、Tuytelaars、T.、Van Gool、Lなどは、SURFと呼ばれる新しいアルゴリズムを導入した別の記事「SURF、SpeededUpRobustFeatures」を公開しました。名前が示すように、それはSIFTの加速バージョンです。



SIFTでは、Lowerはガウス差を使用してラプラスガウス分布を近似し、スケール空間を見つけます。 SURFはさらに進んで、ボックスフィルターを使用してLoGにアプローチします。次の図は、この近似のデモンストレーションを示しています。この近似の大きな利点は、ボックスフィルターを使用した畳み込みが、統合された画像を使用して簡単に計算できることです。さまざまな規模で並行して行うことができます。

SURFは、ヘッセ行列の行列式と位置の行列式に依存します。



方向割り当ての場合、SURFは水平および垂直ウェーブレット応答を使用して6sフィールドを計算します。十分なグアシアンの重みもそれに適用されます。次に、下の図に示されているスペースにそれらを描画します。支配的な方向は、60度の角度でスライディングオリエンテーションウィンドウ内のすべての応答の合計を計算することによって推定されます。興味深いことに、ウェーブレット応答は、任意のスケールの積分画像を使用して簡単に見つけることができます。多くのアプリケーションでは、回転不変性の必要がないため、この方向を見つける必要がなく、処理が高速化されます。 SURFは、Upright-SURFまたはU-SURFと呼ばれる機能を提供します。それは速度を上げ、15分まで安定したままでした。ロゴによると、OpenCVは2つの標準をサポートしています。 0の場合、方向は1の場合に計算され、方向は計算されず、高速になります。

特性評価のために、SURFは水平および垂直ウェーブレット応答を使用します(ここでも、統合された画像を使用すると簡単になります)。サイズsの要点の周りに20s×20sの近傍を取ります。 4x4のサブリージョンに分割されています。サブリージョンごとに、水平および垂直のウェーブレット応答を使用して、次のようなベクトルを形成します。 。ベクトルとして表現すると、SURF機能記述子には合計64の次元があります。次元を減らし、計算速度とマッチング速度を上げますが、関数の一意性を向上させます。

さらにユニークにするために、SURF機能記述子には拡張された128次元バージョンがあります。 の合計は 計算。同様に、 による シンボルは、特徴の数を2倍にするために分割されます。計算の複雑さはそれほど増しません。 OpenCVは、64-dimと128-dimの拡張フラグ値0と1を設定する2つの方法をサポートしています(デフォルト値は128-dimです)

もう1つの重要な改善点は、潜在的な関心のあるポイントとしてラプラス演算子(ヘッセ行列のトレース)を使用することです。検査時に計算されているため、計算コストは​​増加しません。ラプラスのロゴは、暗い背景の明るいスポットとその反対のスポットを区別します。マッチング段階では、同じタイプのコントラストを持つフィーチャのみを比較します(下の図を参照)。この最小限の情報により、記述子のパフォーマンスを低下させることなく、より高速なマッチングが可能になります。


つまり、SURFは、各ステップの速度を上げるために多くの機能を追加します。分析によると、SIFTの3倍の速度であり、パフォーマンスはSIFTに匹敵します。 S URFは、ぼやけた画像や回転した画像の処理には優れていますが、視点や照明の変化の処理には適していません。

3.OpenCVのSURF

OpenCVは、SIFTのようなSURF機能を提供します。 64 / 128-dim記述子、Uright / Normal SURFなど、いくつかのオプションの条件を使用してSURFオブジェクトを開始します。すべての詳細はドキュメントで詳しく説明されています。次に、SIFTで行ったように、SURF.detect()、SURF.compute()を使用してキーポイントと記述子を見つけることができます。

この栗を見てください:

# -*- coding: utf-8 -*- ''' SURF: 1. SIFT found the key points and descriptions in the previous section, but it is slower and requires a faster version. SURF is 3 times faster than SIFT, and its performance is comparable to SIFT. 2. SURF is good at dealing with blurred and rotating images, but not good at dealing with changes in viewpoint and lighting 3. SURF in OpenCV: SURF.detect(), SURF.compute() to find key points and descriptors ''' import cv2 from matplotlib import pyplot as plt img = cv2.imread('5.jpg', 0) surf = cv2.xfeatures2d.SURF_create(20000) print('help of surf', help(surf)) print('getHessianThreshold', surf.getHessianThreshold()) surf.setUpright(True) # Display all directions as one direction kp, des = surf.detectAndCompute(img, None) print('len of kp', len(kp)) # Display 1253 key points too print('des.shape', des.shape) img2 = cv2.drawKeypoints(img, kp, None, (255, 0, 0,), 4) plt.imshow(img2), plt.show() # Reduce the key points to around 50 to draw on the image, we may need all these features when matching. So increase the hessian threshold

結果:





つまり、SURFは、各ステップの速度を上げるために多くの機能を追加します。分析によると、SIFTの3倍の速度であり、パフォーマンスはSIFTに匹敵します。 S URFは、ぼやけた画像や回転した画像の処理には優れていますが、視点や照明の変化の処理には適していません。