我正试图在另一个图像中找到一个图像。
im = cv.LoadImage('1.png', cv.CV_LOAD_IMAGE_UNCHANGED)
tmp = cv.LoadImage('e1.png', cv.CV_LOAD_IMAGE_UNCHANGED)
w,h = cv.GetSize(im)
W,H = cv.GetSize(tmp)
width = w-W+1
height = h-H+1
result = cv.CreateImage((width, height), 32, 1)
cv.MatchTemplate(im, tmp, result, cv.CV_TM_SQDIFF)
print result
当我运行这个程序时,一切都执行得很好,不会抛出任何错误。但我不确定接下来该怎么办。文档说result
存储"比较结果的映射"。我试着打印它,但它给了我宽度、高度和步长。
如何使用这些信息来确定一个图像是否在另一个图像中/它的位置?
这可能对您有用!:)
def FindSubImage(im1, im2):
needle = cv2.imread(im1)
haystack = cv2.imread(im2)
result = cv2.matchTemplate(needle,haystack,cv2.TM_CCOEFF_NORMED)
y,x = np.unravel_index(result.argmax(), result.shape)
return x,y
CCD_ 2只是众多比较方法中的一种。请参阅:http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html查看完整列表。
不确定这是否是最好的方法,但速度很快,对我来说效果很好!:)
MatchTemplate
返回相似性映射,而不是位置。然后,您可以使用此地图查找位置。
如果你只想找一场比赛,你可以做这样的事情来找到一个位置:
minVal,maxVal,minLoc,maxLoc = cv.MinMaxLoc(result)
则minLoc
具有最佳匹配的位置,并且minVal
描述模板的拟合程度。您需要为minVal
设置一个阈值,以确定您是否认为此结果匹配。
如果你要为每张图像寻找一个以上的匹配,你需要使用像非最大抑制这样的算法。