提供されたコードでフィーチャーマッチャーが選択するピクセルの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)
キーポイントは_kp1
_と_kp2
_に保存されており、それぞれ1番目と2番目の画像の特徴の一致のリストです。 _cv2.ORB
_パースペクティブでは、特徴記述子は2D行列であり、各行は1番目と2番目の画像で検出されるキーポイントです。
_cv2.BFMatch
_を使用しているため、matches
は_cv2.DMatch
_オブジェクトのリストを返します。各オブジェクトには複数のメンバーが含まれ、その中に2つの重要なメンバーがあります。
queryIdx
-一致する_kp1
_インタレストポイント行列のインデックスまたはrowtrainIdx
-一致する_kp2
_インタレストポイント行列のインデックスまたはrowしたがって、queryIdx
とtrainIdx
は、最初の画像と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つの画像間の一致する特徴の空間座標を特定し、独自の実装を作成しました。
よろしければチェックしてください!