kot*_*nda 12 python opencv image-processing matching feature-detection
我需要获取功能匹配器在提供的代码中选择的像素列表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)
Run Code Online (Sandbox Code Playgroud)
ray*_*ica 23
我们知道您的关键点存储在其中,kp1并且kp2它们分别与第一个和第二个图像匹配.在cv2.ORB透视图中,这些是2D矩阵,其中每行是在第一图像中检测到的关键点,kp1以及第二图像,kp2.
在你的情况下,因为你正在使用cv2.BFMatch,matches返回一个cv2.DMatch对象列表,其中每个对象包含几个成员....其中有两个重要成员:
queryIdx- 匹配的兴趣点矩阵的索引或行kp1trainIdx- 匹配的兴趣点矩阵的索引或行kp2因此,queryIdx并trainIdx告诉您哪些ORB功能匹配kp1和kp2.因此,你会使用这些索引kp1并kp2和获得pt成员,这是一个元组(x,y)决定比赛的实际空间坐标的坐标.
您所要做的就是遍历每个cv2.DMatch对象matches,附加到两者的坐标列表中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))
Run Code Online (Sandbox Code Playgroud)
请注意,我可能刚刚完成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]
Run Code Online (Sandbox Code Playgroud)
list_kp1将包含与相应位置匹配的特征点的空间坐标list_kp2.换句话说,元件i的list_kp1包含从特征点的空间坐标img1从与对应的特征点匹配img2在list_kp2其空间坐标是在元件i.
作为次要的旁注,我在编写解决方法时使用了这个概念,drawMatches因为对于OpenCV 2.4.x,C++函数的Python包装器不存在,所以我在定位匹配特征的空间坐标时利用了上述概念两个图像之间写我自己的执行.
如果你愿意,看看吧!
module'对象没有属性'drawMatches'opencv python
| 归档时间: |
|
| 查看次数: |
11855 次 |
| 最近记录: |