勉強しないとな~blog

ちゃんと勉強せねば…な電気設計エンジニアです。

OpenCVやってみる-15. SURFによる特徴点検出

前回のSIFTに続いて、今度はSURFでの特徴点検出です。

SURF (Speeded-Up Robust Features)の導入 — OpenCV-Python Tutorials 1 documentation

SURFはSIFTに比べて高速化を目指したアルゴリズムとのこと。
発表は2006年になります。特許が取られていて、まだ終了していないようです。

画像処理の数式を見て石になった時のための、金の針 - Qiita

またもやざっくりまとめをすると、

  • SIFTでのLaplacian of Gaussianの代わりにBox filterを使ってのアルゴリズム積分画像を使って高速に計算ができる
  • 特徴点の回転角も計算する、6sx6sの領域の横、縦方向のwavelet係数を使うと書かれていますが、詳細はよくわからず。Wikipediaにはもう少し説明がありました。
    近傍(半径6s: sは特徴点を検出したスケール)の各点について縦、横方向のHaar waveletへの応答を計算、この応答を2次元空間にマッピングして、\pi/3の角度ごとに、その中に含まれる応答の総和を計算、最も大きいベクトルとなった角度が主要な回転角となる、
    という感じか?

Speeded up robust features - Wikipedia

実施

SIFTと同じ感じになります。と思いきや、エラーになりました。

>>> surf = cv2.SURF(400)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'cv2.cv2' has no attribute 'SURF'

今入れているOpenCVのままではだめなよう。opencv-contrib-pythonを入れる必要があります。

SIFT, SURFが利用できるPython用OpenCVをインストールする - はしくれエンジニアもどきのメモ

これを入れましたが、結局だめなようでした。

>>> surf = cv2.SURF(400)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'cv2.cv2' has no attribute 'SURF'
>>> surf = cv2.xfeatures2d.SURF_create(400)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
cv2.error: OpenCV(4.5.3) C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-_xlv4eex\opencv_contrib\modules\xfeatures2d\src\surf.cpp:1029: error: (-213:The function/feature is not implemented) This algorithm is patented and is excluded in this configuration; Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function 'cv::xfeatures2d::SURF::create'

>>>

cv2.SURF()ではなくcv2.xfeatures2d.SURF_create()を使わないといけませんでした。

Python+OpenCV|SURF特徴量 | βshort Lab

ただ、それを使ってもライセンスの問題で使わせてくれないよう。
ビルドし直せばいいらしいですが、面倒なのでパスで。

以上

SURFはまたライセンスが切れたら試してみるということで。
残念。

次はFASTアルゴリズムでのコーナー検出をやります。