ベイジアン研究所

プログラミング言語(アルゴリズム的な話が中心)やガジェットの紹介をしています。時々心理学の話も。

【opencv-python】SIFT()のsegmentation fault: 11エラー

1. エラー内容
opencv-pythonのSIFTアルゴリズムを使った、特徴点記述を公式チュートリアル(http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_feature2d/py_sift_intro/py_sift_intro.html#sift-intro)を参考に実行すると、次のエラーが発生した。

Segmentation fault: 11

2. 実行環境
Mac OS Catalina バージョン 10.15.7
Python 3.8.5

3. 実行コード

import cv2
import numpy as np

img = cv2.imread('../images/camel.png') # 画像のpathを指定
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

sift = cv2.SIFT()
kp = sift.detect(gray, None)

img = cv2.drawKeypoints(gray, kp, flags=cv2.DRAWMATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imwrite('../images/camel_shift.png', img) # 画像を保存するpathを指定

入力画像は次の画像である。

f:id:camelsan:20201128100534p:plain
図1. 入力画像

出力結果は前述の通り次のようなエラーである。

Segmentation fault: 11

4. 原因と解決策
原因としては、opencv-pythonのバージョンにあった。opencv-python 4.4.0の場合には
SIFT()
の代わりに
SIFT_create()
を使用する必要があった。

5. 修正コード
基本的には、SIFT()をSIFT_create()に変更すれば良い。ただし、今回はバージョンのせいか、drawKeypoins関数の第3引数にNoneを指定する必要があったので、そこも変更している。(出力画像の指定のため。今回は保存するようにしているのでNoneとした。)

import cv2
import numpy as np

img = cv2.imread('../images/camel.png') # 画像のpathを指定
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

sift = cv2.SIFT_create() # SIFT_create()に変更
kp = sift.detect(gray, None)

img = cv2.drawKeypoints(gray, kp, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) # 第3引数にNoneを追加
cv2.imwrite('../images/camel_sift.png', img) # 保存先のpathを指定

出力結果は以下の画像となる。

f:id:camelsan:20201128101702p:plain
図2. 出力結果
無事に画像の特徴点を記述している。

6. まとめ
opencv-python 4.4.0ではSIFT()の代わりに、SIFT_create()を使用する。