Я попробовал это с методом TM_CCOEFF_NORMED
и не сработало ... каким-то образом он дал все как 1.0 (все максимальное значение) .... но с методом TM_SQDIFF_NORMED
на самом деле дает что-то разумное.
Давайте начнем с создания образца изображения, я сделал это следующим образом:
import numpy as np
import cv2
randVal = lambda : np.random.randint(0,high=255, dtype=np.uint8)
randomColor = lambda : (randVal(), randVal(), randVal())
targetColor = randomColor()
width = 500
height = 500
x = 20
y = 20
img = np.zeros((height, width,3), dtype=np.uint8)
target = np.full((100, 100,3), targetColor, dtype=np.uint8)
while y < height-100:
x = 20
while x < width-100:
img[y:y+100, x:x+100] = randomColor()
x += 120
y += 120
img[20:120, 20:120] = targetColor
Это создаст 2 изображения img
и target
, которые являются случайными и в моем тестеэто дает что-то вроде этого:
img:
цель:
Теперь я использовал сопоставление шаблона как есть, поскольку в документации сказано, что он может занять 1 или 3 канала и будет работать правильно, но с другим методом
res = cv2.matchTemplate(img[:,:,0], target[:,:,0], cv2.TM_SQDIFF_NORMED )
threshold = 0.00001
loc = np.where( res <= threshold )
img_rgb = img.copy()
for pt in zip(*loc[::-1]):
cv2.rectangle(img_rgb, pt, (pt[0] + 100, pt[1] + 100), (0,0,255), 2)
Это дает мне следующий результат:
Надеюсь, это поможет ... Мне нужно проверить метод, который вы используете в другой версии, чтобы увидетьесли это проблема в моей версии или что-то конкретное с этим набором изображений ...