检查模板匹配为True OpenCV

时间:2018-10-01 16:30:31

标签: python opencv

如何检查是否找到模板并将其返回为true或false?以帧为单位,我希望当对象丢失时该值变为false,否则您会知道。这是我的脚本的样子:

zmatch = cv2.matchTemplate(gray_frame, template2, cv2.TM_CCOEFF_NORMED)
loc = np.where(zmatch >= threshold)

for pt in zip(*loc[::-1]):
    cv2.rectangle(gray_frame, pt, (pt[0]+w, pt[1]+ h), (0, 225, 0), 2)

我尝试了所有可以通过谷歌搜索找到的解决方案,没有帮助。 -检查pt是否有效(始终有效) -检查zmatch.any()是否大于或小于阈值

我不知道该如何处理,请帮忙! :3

1 个答案:

答案 0 :(得分:0)

我知道这有点陈旧,但是对于用谷歌搜索的人来说,这是我用来解决该问题的解决方案(如果您不希望看到我的bs解释,那么该解决方案位于底部):

这是opencv website中matchTemplate的代码:

res = cv.matchTemplate(img_gray,template,cv.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)
for pt in zip(*loc[::-1]):
    print(pt) #this line I added myself to see the print result of pt
    cv.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)

现在,它找到了比赛的位置,我发现的位置的长度始终为正,并且不会真正根据比赛的数量而改变(至少在经过测试的情况下是有限的)。

这似乎是一类数组,用于存储不同点的位置(可能不是一个)(我不太了解zip部分或如何获取点,但是确实如此)。

但是,pt部分(我认为从打印出来的是大(原始,干草堆,无论您叫什么)图像上的匹配项的原点坐标,它将从无更改为某些内容。

解决方案

其中添加了一个if语句来检查if pt != None:

res = cv.matchTemplate(img_gray,template,cv.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)
for pt in zip(*loc[::-1]):
    cv.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)
    if pt != None:
        #the things you want to do
        break #to allow the else function to work
else:
    #the things you want it to do when no template is detected
    

希望它可以解决您的问题