OpenCV Python中与多个对象的模板匹配

Sal*_*man 4 python opencv image-processing computer-vision template-matching

根据此链接,我正在尝试使用 opencv python 在图像中查找多个模板。

但问题是,单个对象返回的多个点在位置上略有不同。像这样的东西:

在此处输入图片说明

我不想使用,cv2.minMaxLoc()因为图像中有多个模板。我写了一个删除平仓的函数,但我想知道这个问题有什么简单的解决方案吗?谢谢。

bfr*_*ris 7

查找多个匹配项的一种方法是覆盖找到的匹配项并再次运行匹配项。编辑:查找多个匹配项的更好方法是覆盖结果。在第一个示例中,我们用零填充结果的匹配部分(对 SQDIFF 或 CCORR_NORMED 使用零),然后在循环中查找下一个匹配项。

import cv2
import numpy as np
import time

image = cv2.imread('smiley.png', cv2.IMREAD_COLOR )
template = cv2.imread('template.png', cv2.IMREAD_COLOR)

h, w = template.shape[:2]

method = cv2.TM_CCOEFF_NORMED

threshold = 0.90

start_time = time.time()

res = cv2.matchTemplate(image, template, method)

# fake out max_val for first run through loop
max_val = 1
while max_val > threshold:
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

    if max_val > threshold:
        res[max_loc[1]-h//2:max_loc[1]+h//2+1, max_loc[0]-w//2:max_loc[0]+w//2+1] = 0   
        image = cv2.rectangle(image,(max_loc[0],max_loc[1]), (max_loc[0]+w+1, max_loc[1]+h+1), (0,255,0) )

cv2.imwrite('output.png', image)
Run Code Online (Sandbox Code Playgroud)

输入图像:

在此处输入图片说明

使用眼睛作为模板图像(因为有不止一只眼睛!)

在此处输入图片说明

输出:

在此处输入图片说明

这是我通过写在图像上的原始方式。这种方式要慢得多,因为我们matchTemplate对 n 次匹配进行 n+1 次操作。通过一次测量,这种技术慢了 1000 倍。

import cv2
import numpy as np

image = cv2.imread('smiley.png', cv2.IMREAD_COLOR )
template = cv2.imread('template.png', cv2.IMREAD_COLOR)

h, w = template.shape[:2]

method = cv2.TM_CCOEFF_NORMED

threshold = 0.95

# fake out max_val for first run through loop
max_val = 1
while max_val > threshold:
    res = cv2.matchTemplate(image, template, method)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

    # using top ranked score, fill in that area with green
    image[max_loc[1]:max_loc[1]+h+1:, max_loc[0]:max_loc[0]+w+1, 0] = 0    # blue channel
    image[max_loc[1]:max_loc[1]+h+1:, max_loc[0]:max_loc[0]+w+1, 1] = 255  # green channel
    image[max_loc[1]:max_loc[1]+h+1:, max_loc[0]:max_loc[0]+w+1, 2] = 0    # red channel


cv2.imwrite('output.png', image)
Run Code Online (Sandbox Code Playgroud)

输出图像:

在此处输入图片说明