私は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の任意のフィーチャ検出アルゴリズムにマスクを渡すコードサンプルが見つかりませんでした。
'img1'がカラーイメージの場合、3つのチャンネルを持つので、' [rows、cols、3] 'のような' img1.shape'を使うので、あなたのマスクは 'CV_8UC3'型になります。単一のチャネルマスクを作成する必要があります。 – Miki
私は別の方法で作成されたバイナリマスクも使用していましたが、それは[rows、cols、1]と仮定しましたが、あなたの答えのおかげで、3チャンネル画像に変換されました。ありがとうございました!とにかく問題を残して申し訳ありません(まだPythonの型管理を理解しようとしています)。あなたのコメントを回答として受け入れる方法はありますか? – m3h0w
喜んで助けました。正しいコードと説明で自分で答えを書くだけです – Miki