我正在追逐一个我正在玩的想法的帮助。我想采用图像中的功能,其代码类似于
上的示例See sample image at bottom of page here 最后一节/示例是我正在谈论的那个
特别是对于我的问题,我想使用图像中指示的匹配来找到场景图像中的目标,如图所示,看似简单的添加。我想在场景框中找到目标周围的边界框
如果有意义的话,我宁愿有一个四个轮廓点的列表,它们代表场景框架上的变换目标,而不仅仅是在特征周围放置一个边界框。
大图,我想拍摄包含我的目标的场景图像的子部分并将其从场景图像中裁剪出来,将剩余的图像中的非目标区域遮住,然后将其用作进一步处理的源
此时我已经成功完成了所需的一切,用一组硬编码的点来表示目标图像的角落在场景图像中旋转和变换,所以一切正常我只需要一个例子如何确定该场景中目标每个角落的x,y co-ords
我不想发布代码,因为它有点笨拙而且它是我之后的概念,而不是一个完整的'为我做这件事'修复
任何建议都非常感激,如果你能告诉我使用附带的示例代码如何做到这一点我非常感激,干杯。
import numpy as np
import cv2
from matplotlib import pyplot as plt
img1 = cv2.imread('box.png',0) # queryImage
img2 = cv2.imread('box_in_scene.png',0) # trainImage
# Initiate SIFT detector
sift = cv2.SIFT()
# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)
# FLANN parameters
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50) # or pass empty dictionary
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(des1,des2,k=2)
# Need to draw only good matches, so create a mask
matchesMask = [[0,0] for i in xrange(len(matches))]
# ratio test as per Lowe's paper
for i,(m,n) in enumerate(matches):
if m.distance < 0.7*n.distance:
matchesMask[i]=[1,0]
draw_params = dict(matchColor = (0,255,0),
singlePointColor = (255,0,0),
matchesMask = matchesMask,
flags = 0)
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,**draw_params)
plt.imshow(img3,),plt.show()
答案 0 :(得分:0)
您需要找到两个图像之间的规定性转换。
根据匹配的要素创建一组对应的坐标。
例如,您发现图像1中的特征FtI1对应于图像2中的FtJ1,因此您知道FtI1(xi,yi)的坐标对应于FtJ1(xj,yj)的坐标,并且您对所有的坐标都有相应的功能。 在两个图像之间有相应坐标列表后,您可以使用opecv getPerspectiveTransform计算规定变换。
最后使用您在第一张图像中的封闭形状的4个坐标上找到的变换,以获得第二张图像中封闭形状的坐标。 opencv函数就是warpPerspective。
在opecv中如何做到这一点的一个例子是: http://docs.opencv.org/3.1.0/da/d6e/tutorial_py_geometric_transformations.html