【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を指定
入力画像は次の画像である。
出力結果は前述の通り次のようなエラーである。
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を指定
出力結果は以下の画像となる。 無事に画像の特徴点を記述している。