質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.80%

python 特徴量マッチングde

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,320

soepu

score 41

PythonのOpenCVでインターネットのサイトから、
下記のような、特徴量マッチングのプログラム実行しました。
そしたら、
error: OpenCV(4.1.0) C:\projects\opencv-python\opencv\modules\core\src\batch_distance.cpp:303: error: (-215:Assertion failed) K == 1 && update == 0 && mask.empty() in function 'cv::batchDistance'

というエラーが発生しました。

matches・・・ のところでエラーが発生しているらしいのですが、
原因、対応について教えて頂けますでしょうか?

以上です。

img1 = cv2.imread("src/star_ptn.png")
img2 = cv2.imread("src/star.png")
detector1 = cv2.ORB_create()
kps1,des1 = detector1.detectAndCompute(img1,None)
kps2,des2 = detector1.detectAndCompute(img2,None)

bf = cv2.BFMatcher(cv2.NORM_HAMMING,crossCheck = True)
good = []
for m,n in matches:
    if m.distance < 0.5 * n.distacne:
        good.append([m])

img3 = cv2.drawMatchesKnn(img1,kps1,img2,kps2,good,None,flags = 2)
cv2.imshow("kp1",img3)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • amahara_waya

    2019/05/21 08:48

    そもそもmatchesの定義がコード内にありませんが、どこか別の場所で定義してはいないでしょうか?

    キャンセル

  • soepu

    2019/05/21 12:56

    すいません。記入し忘れました。
    bf = ・・・ の次の行に
    matches = bf.knnMatch(des1, des2, k=2)
    がはいります。

    キャンセル

  • tiitoi

    2019/05/21 14:22

    以下の点を確認してみてください。
    1. img1、img2 が None でないかどうか: None の場合、imread() での画像読み込みに失敗しています。
    2. kps1, kps2 がともに空でないかどうか: 空の場合、特徴点マッチングに失敗しています。その場合、今回のケースでは特徴点マッチングは適していないということになります。

    キャンセル

  • soepu

    2019/05/21 18:19

    print で1、2ともに確認したところ、両方ともNoneではありませんでした。

    キャンセル

回答 1

checkベストアンサー

0

原因、対応について教えて頂けますでしょうか?

crosscheck は「画像1の i 番目の特徴点が画像2の j 番目の特徴点と最も距離が近い」、かつ「画像2の j 番目の特徴点が画像1の i 番目の特徴点と最も距離が近い」という条件でマッチングするように設定するフラグですが、knnmatch() は1対1対応でなく、1対k対応なので、そのような処理が定義できないのでエラーになる。

対応は、「crosscheck=True の場合、match() を使う」または「crosscheck=Falseにする」

knnmatch() でマッチングする場合

knnmatch() でマッチングする場合、画像1の各特徴点と距離が近い上位 k 個の画像2の特徴点を返します。

import cv2

img1 = cv2.imread('1.png')
img2 = cv2.imread('2.png')

akaze = cv2.ORB_create()
kp1, des1 = akaze.detectAndCompute(img1, None)
kp2, des2 = akaze.detectAndCompute(img2, None)

bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)

# ratio test
ratio = 0.5
good = []
for m, n in matches:
    if m.distance < ratio * n.distance:
        good.append([m])

# 対応する特徴点同士を描画
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, None, flags=2)

cv2.imwrite('img.png', img3)

match() でマッチングする場合

match() でマッチングする場合、最も距離が近い特徴点同士をマッチングします。

import cv2

img1 = cv2.imread('1.png')
img2 = cv2.imread('2.png')

akaze = cv2.ORB_create()
kp1, des1 = akaze.detectAndCompute(img1, None)
kp2, des2 = akaze.detectAndCompute(img2, None)

bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)

# 対応する特徴点同士を描画
img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches, None, flags=2)

cv2.imwrite('img.png', img3)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る