2017-02-20 6 views
1

私はOpenCV3を使ってPython3で単純なプロジェクトを構築しています。ジグソーパズルを「完成」のジグソー画像に合わせようとしています。私はSIFTを使ってテストを始めました。OpenCV Python機能の検出:マスクを提供する方法は? (SIFT)

私はジグソーパズルの輪郭を抽出して画像を切り取ることができますが、高周波数の大部分はもちろんピース(ピースの終わりと床が始まる部分)の周りにあるので、 SIFT detectAndCompute()メソッドを呼び出すと、アルゴリズム内でキーポイントのみをピース内で探す必要があります。テストマスクを(それはUINT8だことを確認する)を通過した後

test_mask = np.ones(img1.shape, np.uint8) 
kp1, des1 = sift.detectAndCompute(img1, mask = test_mask) 

、私は次のエラーを取得する:

kp1, des1 = sift.detectAndCompute(img1,mask = test_mask) cv2.error: /home/pyimagesearch/opencv_contrib/modules/xfeatures2d/src/sift.cpp:772: error: (-5) mask has incorrect type (!=CV_8UC1) in function detectAndCompute

私の研究から、UINT8は同じであるCV_8U、ためだけの別名でありますCV_8UC1。 Pythonの任意のフィーチャ検出アルゴリズムにマスクを渡すコードサンプルが見つかりませんでした。

+0

'img1'がカラーイメージの場合、3つのチャンネルを持つので、' [rows、cols、3] 'のような' img1.shape'を使うので、あなたのマスクは 'CV_8UC3'型になります。単一のチャネルマスクを作成する必要があります。 – Miki

+0

私は別の方法で作成されたバイナリマスクも使用していましたが、それは[rows、cols、1]と仮定しましたが、あなたの答えのおかげで、3チャンネル画像に変換されました。ありがとうございました!とにかく問題を残して申し訳ありません(まだPythonの型管理を理解しようとしています)。あなたのコメントを回答として受け入れる方法はありますか? – m3h0w

+0

喜んで助けました。正しいコードと説明で自分で答えを書くだけです – Miki

答えて

1

私はバグを見つけることができました。

しきい値操作を使用して作成したオリジナルのマスクは、バイナリに見えても、3チャンネルの画像([rows], [cols], 3)でした。したがって、マスクとして受け入れることはできませんでした。

種類や形状を確認した後(UINT8なければならないと[行、colsの、1]):

print(mask.dtype) 
print(mask.shape) 

それでも3チャネルの場合はグレーにマスクを変換する:

mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY) 
関連する問題