我需要有人给我解释这四行代码:
res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
threshhold = 0.70
loc = np.where( res >= threshhold)
for pt in zip(*loc[:: -1]):
我知道前两个是什么意思。但循环部分让我发疯了。在
代码的其余部分(重要的部分):
^{pr2}$我把中断放在末尾,因为我只想使用循环一次(你觉得有没有更好的方法来做这个?)在
我将非常感谢所有回答的人。你不必回答我所有的问题,如果你只知道一个问题的答案,那就分享吧。谢谢<;3
res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
matchTemplate为每个像素计算模板与该位置的图像匹配的程度。它返回一个包含这些值的2d数组。您使用的方法是
TM_CCOEFF_NORMED
,NORMED表示结果被规范化,因此值被映射到0和1之间。您可以显示res
,最佳匹配将是白色。这张图片取自文档here,你可以在那里找到更多信息。在np.where
返回res
/quality of match大于或等于阈值(设置为0.70)的索引。与图像的x和y值相对应的索引。索引作为2个数组的元组返回-一个用于x,一个用于y。Nice examplesfor pt in zip(*loc[:: -1]):
这里发生了一些分离的事情:
*loc[:: -1]
An*允许任意数量的参数。它用于解压缩loc
-元组。examplezip(loc[1],loc[0])
与{列表的反转似乎是任意的,并且没有必要,只要您在代码的其余部分中对其进行说明。在
for pt in zip()
zip()返回一个iterable,一个可用于循环的对象。它创建输入参数的元组,并使用
for pt in
逐个返回这些元组。在本例中,输入是一个x值数组和一个y值数组,因此它将返回一个(x,y)元组。元组存储在pt
。在尝试显示/打印出一些步骤,这将有助于您理解。在
===
如果你只想要一次循环,我想你想要最好的匹配。您可以使用以下方法:
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
max_loc
将保存最佳匹配的x,y。(左上角)相关问题 更多 >
编程相关推荐