cv2.matchTemplate находит неправильный шаблон в изображении - PullRequest
2 голосов
/ 15 января 2020

Я пытаюсь создать программу, которая знает, какое число на изображении, с помощью следующей функции:

def img_in_img(big_picture, small_picture, tamper):
    big_picture = str(big_picture)
    small_picture = str(small_picture)
    if os.path.isfile(big_picture) == False or os.path.isfile(small_picture) == False:
        return "Image does not exist"

    img = cv2.imread(big_picture,0)
    templace_loc = small_picture
    template = cv2.imread(templace_loc,0)
    w, h = template.shape[::-1]
    method = cv2.TM_CCOEFF

    tamper = int(tamper)

    res = cv2.matchTemplate(img,template,method)
    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)

    height, width, channels = cv2.imread(templace_loc).shape

    if int(top_left[0]) < int(height + tamper) and int(top_left[0]) > int(height - tamper) and int(top_left[1]) < int(width + tamper) and int(top_left[1]) > int(width - tamper):
        return True
    else:
        return False

Но тогда, когда я проверяю, есть ли 7.png в img.png с кодом

nur = "7"
if img_in_img("2020-01-14-17-36-08.537043/verification_image2.png", "verifynr/" + "old_orange" + "/" + nur + ".png", 25):
    print(Style.BRIGHT + Fore.GREEN + "Color: " + "old_orange" + ", Num: " + nur + Fore.RESET)
else:
    print(Style.BRIGHT + Fore.RED + "Color: " + "old_orange" + ", Num: " + nur + Fore.RESET)

это дает мне КРАСНЫЙ: Color: old_orange, Num: 7

, но затем, если я проверю, находится ли 6.png в img.png, изменив nur с 7 на 6 это дает мне зеленый цвет: Color: old_orange, Num: 6, но это неправильное изображение.

Я также попробовал следующий код:

img_rgb = cv2.imread("2020-01-14-17-36-08.537043/verification_image2.png")
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('verifynr/old_orange/7.png',0)
w, h = template.shape[::-1]

res = cv2.matchTemplate(img_gray,template,cv2.TM_SQDIFF)
threshold = 0.8
loc = np.where( res >= threshold)
pt = list(zip(*loc[::-1]))

if len(pt) >= 1:
    print("True")

, который печатает True, но это делает что для каждого числа png я сохранил.

Как мне заставить мою программу распознавать 7.png в img.png без распознавания каждого отдельного числа png?

img.png:

img.png

6.png:

6.png

7.png:

7.png

Ответы [ 2 ]

0 голосов
/ 17 января 2020

Вот пример использования маски шаблона для сопоставления шаблона на одном уровне разрешения с использованием Python / OpenCV. Черная область маски указывает шаблону сопоставления игнорировать эти области при сопоставлении, поэтому, когда шаблон имеет цвет фона, отличный от цвета на большом изображении, он не ухудшает оценку соответствия. Только цветовые области шаблона, соответствующие белому цвету в маске, влияют на оценку соответствия. Обратите внимание, что сопоставление маскированных шаблонов в OpenCV работает только для методов TM_SQDIFF и TM_CCORR_NORMED.

Ввод:

enter image description here

Шаблон:

enter image description here

Маска шаблона:

enter image description here

import cv2
import numpy as np

# read image
img = cv2.imread('logo.png')

# read template
tmplt = cv2.imread('hat.png')
hh, ww, cc = tmplt.shape

# read template mask as grayscale
tmplt_mask = cv2.imread('hat_mask.png', cv2.COLOR_BGR2GRAY)

# do template matching
corrimg = cv2.matchTemplate(img,tmplt,cv2.TM_CCORR_NORMED, mask=tmplt_mask)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(corrimg)
max_val_ncc = '{:.3f}'.format(max_val)
print("correlation match score: " + max_val_ncc)
xx = max_loc[0]
yy = max_loc[1]
print('xmatch =',xx,'ymatch =',yy)

# draw red bounding box to define match location
result = img.copy()
pt1 = (xx,yy)
pt2 = (xx+ww, yy+hh)
cv2.rectangle(result, pt1, pt2, (0,0,255), 1)

cv2.imshow('image', img)
cv2.imshow('template', tmplt)
cv2.imshow('template_mask', tmplt_mask)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

# save results
cv2.imwrite('logo_hat_match.png', result)


Результат:

enter image description here

Перечень текстовой информации:

correlation match score: 1.000
xmatch = 417 ymatch = 44

(Извинения за заимствование и изменение ImageMagick lo go. У меня уже было это пример соответствия шаблона)

0 голосов
/ 16 января 2020

Соответствие шаблонам не для обнаружения объектов или распознавания образов, его функция - найти наиболее похожую позицию патча. Для обнаружения используйте детекторы (haar, на основе dnn, ...), для распознавания используйте классификаторы (на основе дескрипторов или nn). «

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