Как найти один шаблон в нескольких изображениях? - PullRequest
2 голосов
/ 23 мая 2019

У меня есть один шаблон и несколько изображений. Таким образом, проблема состоит в том, чтобы узнать, является ли этот шаблон на изображении или нет. Я написал некоторый цикл, но я думаю, что он не возвращает логическое значение ...

    for i in images:
        res = cv2.matchTemplate(i,templateDealer,cv2.TM_CCOEFF_NORMED)
        min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
        top_left = max_loc
        bottom_right = (top_left[0] + w, top_left[1] + h)
        cv2.rectangle(i, top_left, bottom_right, (0, 255, 0), 2)
        result.append(res)

Пожалуйста, помогите мне сделать это ...

Ответы [ 3 ]

0 голосов
/ 23 мая 2019

minMaxLoc всегда даст вам что-то.

enter image description here

Это полностью зависит от твоей задачи. Есть несколько возможностей, о которых я могу подумать

(1) Вы ищете только 1 изображение наиболее вероятного случая среди N изображений.

В этом случае объединяются все изображения в одном направлении. Затем запустите стандартное сопоставление tempcte в opencv и minmaxloc, чтобы найти наиболее вероятную локацию

vis = np.concatenate((img1, img2), axis=0) # do it for N image if necessary

(2) Вы просто хотите проверить сходство шаблона со всеми N изображениями.

Затем вам нужно объявить порог после minmax, чтобы увидеть, есть ли в нем точка, которая выше порога, если есть возврат 1, если нет возврата 0

0 голосов
/ 03 июня 2019
def getBestMatch():
images = [
    cv2.imread('tmp/1.png'),
    cv2.imread('tmp/2.png'),
    cv2.imread('tmp/3.png'),
    cv2.imread('tmp/4.png'),
    cv2.imread('tmp/5.png'),
    cv2.imread('tmp/6.png')
]
template = cv2.imread('template.png')

result = []
for i in images:
    match = cv2.matchTemplate(i, template, cv2.TM_CCOEFF_NORMED)
    _, confidence, _, _ = cv2.minMaxLoc(match)
    result.append(confidence)

posNum = result.index(max(result))
return posNum
0 голосов
/ 23 мая 2019

matchTemplate возвращает двумерный массив со значениями соответствия для каждого местоположения пикселя - насколько хорошо шаблон соответствует этому местоположению.
cv2.minMaxLoc(res) возвращает значение и местоположение наилучшего соответствия в изображении.Это может быть не реальное совпадение, когда вы сравниваете его визуально, но это самое высокое значение, возвращаемое алгоритмом.Вы можете сравнить это самое высокое значение для нескольких изображений, самое высокое общее значение - это то, которое вы ищете.
Примечание: для этого не следует использовать нормализующий алгоритм, используйте cv2.TM_CCOEFF вместо cv2.TM_CCOEFF_NORMED

Чтовам нужно добавить кортеж с самым высоким значением и его местоположением:
result.append((max_val, max_loc)).
После того, как вы обработали все изображения, найдите максимальное значение max_val и нарисуйте прямоугольник, используя его max_loc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...