python で opencv を利用していて、SIFT や SURF が入っている xfeatures2d を参照しようとしたら以下のエラーメッセージが表示されます。
Traceback (most recent call last): File "test.py", line 7, in <module> sift = cv2.xfeatures2d.SIFT_create() AttributeError: 'module' object has no attribute 'xfeatures2d'
原因
opencv 3以降、SIFT や SURF などのアルゴリズムが入っている xfeatures2d が opencv の標準機能から外されました。ソースコードも別のレポジトリに格納されています。
外された機能は non-free 機能と言い、xfeatures2d の他にもたくさんあります。その全てが opencv_contrib に入っています。opencv と opencv_contrib の Git レポジトリは以下の通りです。
Git レポジトリ | |
opencv | https://github.com/opencv/opencv.git |
opencv_contrib | https://github.com/opencv/opencv_contrib.git |
python の opencv 拡張モジュールである cv2.so
ファイルに non-free のライブラリが入っていないのが原因です。
解決案
解決のため、non-free 機能が入っている cv2.so
をビルドし直します。手順は以下の通りです。
opencv と opencv-contrib のソースコードを両方とも git でダウンロードします。
git clone https://github.com/opencv/opencv.git git clone https://github.com/opencv/opencv_contrib.git
opencv を CMake を使ってビルドします。CMake では opencv_contrib のパスを設定します。 extra_module
を検索して OPENCV_EXTRA_MODULES_PATH
を opencv_contrib/modules
に設定します。
上記gitのダウンロードパス/opencv_contrib/modules
また、念のため BUILD_opencv_xfeatures2d
も ON になっているかを確認します。(デフォルトではONです)
これで Configure、Generate して make でビルドします。opencv のビルド方法と python に組み込む方法は以下の2つの文書をご参照ください。
non-free 機能について
opencv_contrib に入っている non-free 機能やアルゴリズムは、学術や研究目的であれば自由に利用でき、商用(利益を得る)の場合、作者からのライセンス/許可が必要な場合があるそうです。それぞれのライセンス(利用許可)をご確認ください。