Sal*_*man 4 python opencv image-processing computer-vision template-matching
根据此链接,我正在尝试使用 opencv python 在图像中查找多个模板。
但问题是,单个对象返回的多个点在位置上略有不同。像这样的东西:
我不想使用,cv2.minMaxLoc()因为图像中有多个模板。我写了一个删除平仓的函数,但我想知道这个问题有什么简单的解决方案吗?谢谢。
查找多个匹配项的一种方法是覆盖找到的匹配项并再次运行匹配项。编辑:查找多个匹配项的更好方法是覆盖结果。在第一个示例中,我们用零填充结果的匹配部分(对 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)
输出图像:
| 归档时间: |
|
| 查看次数: |
4901 次 |
| 最近记录: |