web-dev-qa-db-ja.com

OpenCVの機能マッチングからピクセル座標を取得する方法Python

提供されたコードでフィーチャーマッチャーが選択するピクセルのxおよびy座標のリストを取得する必要があります。 PythonとOpenCVを使用しています。誰か助けてもらえますか?

img1=cv2.imread('DSC_0216.jpg',0)
img2=cv2.imread('DSC_0217.jpg',0)

orb=cv2.ORB(nfeatures=100000)
kp1,des1=orb.detectAndCompute(img1,None)
kp2,des2=orb.detectAndCompute(img2,None)

img1kp=cv2.drawKeypoints(img1,kp1,color=(0,255,0),flags=0)
img2kp=cv2.drawKeypoints(img2,kp2,color=(0,255,0),flags=0)
cv2.imwrite('m_img1.jpg',img1kp)
cv2.imwrite('m_img2.jpg',img2kp)

bf=cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches=bf.match(des1,des2)
matches=sorted(matches, key= lambda x:x.distance)
13
kotopanda

キーポイントは_kp1_と_kp2_に保存されており、それぞれ1番目と2番目の画像の特徴の一致のリストです。 _cv2.ORB_パースペクティブでは、特徴記述子は2D行列であり、各行は1番目と2番目の画像で検出されるキーポイントです。

_cv2.BFMatch_を使用しているため、matchesは_cv2.DMatch_オブジェクトのリストを返します。各オブジェクトには複数のメンバーが含まれ、その中に2つの重要なメンバーがあります。

  • queryIdx-一致する_kp1_インタレストポイント行列のインデックスまたはrow
  • trainIdx-一致する_kp2_インタレストポイント行列のインデックスまたはrow

したがって、queryIdxtrainIdxは、最初の画像と2番目の画像の間で一致するORB機能を示します。これらを使用して、_kp1_および_kp2_にインデックスを付け、ptメンバーを取得します。これは、一致の実際の空間座標を決定する_(x,y)_座標のタプルです。 。

matches内の各_cv2.DMatch_オブジェクトを反復処理し、_kp1_と_kp2_の両方の座標のリストに追加するだけで完了です。

このようなもの:

_# Initialize lists
list_kp1 = []
list_kp2 = []

# For each match...
for mat in matches:

    # Get the matching keypoints for each of the images
    img1_idx = mat.queryIdx
    img2_idx = mat.trainIdx

    # x - columns
    # y - rows
    # Get the coordinates
    (x1, y1) = kp1[img1_idx].pt
    (x2, y2) = kp2[img2_idx].pt

    # Append to each list
    list_kp1.append((x1, y1))
    list_kp2.append((x2, y2))
_

list_kp1.append(kp1[img1_idx].pt)と_list_kp2_についても同じことができたかもしれませんが、空間座標の解釈方法を明確にしたかったことに注意してください。さらに一歩進んで、リスト内包表記を行うこともできます。

_list_kp1 = [kp1[mat.queryIdx].pt for mat in matches] 
list_kp2 = [kp2[mat.trainIdx].pt for mat in matches]
_

_list_kp1_には、_list_kp2_の対応する位置と一致する特徴点の空間座標が含まれます。言い換えると、_list_kp1_の要素iには、_img1_の_img2_の対応する特徴点と一致する_list_kp2_の特徴点の空間座標が含まれています。その空間座標は要素iにあります。


マイナーな補足として、OpenCV 2.4.xの場合、Python C++のラッパーであるため、 drawMatches の回避策を作成するときにこの概念を使用しました。関数が存在しないため、上記の概念を使用して、2つの画像間の一致する特徴の空間座標を特定し、独自の実装を作成しました。

よろしければチェックしてください!

モジュール 'オブジェクトには属性' drawMatches'opencv pythonがありません