Объяснение нескольких строк: сопоставление шаблонов в python с использованием openCV - PullRequest
0 голосов
/ 04 июня 2019

Мне нужен кто-то, чтобы объяснить мне эти четыре строки кода:

res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)    
threshhold = 0.70
loc = np.where( res >= threshhold)
for pt in zip(*loc[:: -1]):

Я вроде знаю, что означают первые два.Но часть цикла сводит меня с ума.

  • Что делает zip () в этой ситуации?
  • Почему мы перевернули список
  • , что означает "* loc"?Я имею в виду звёздочки
  • Что вообще такое pt?

Остальная часть кода (важная часть):

while True:
    for i in range(4):
        img_gray = cv2.cvtColor(imageGrab(), cv2.COLOR_BGR2GRAY)
        f = str(files[i])
        template = cv2.imread(f, 0)

        w, h = template.shape[:: -1]

        res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
        threshhold = 0.70
        loc = np.where( res >= threshhold)
        for pt in zip(*loc[:: -1]):

            x=pt[0]
            y=pt[1]
            center_x = (x + 0.5 * w) + 415
            center_y = (y + 0.5 * h) + 287

            pyautogui.click(center_x , center_y)
            time.sleep(4)
            count = count + 1
            break

Я ставлю перерыв вконец, потому что я хочу использовать цикл только один раз (как вы думаете, есть ли лучший способ сделать это?)

Я буду очень благодарен за всех людей, которые отвечают.Вам не нужно отвечать на все мои вопросы, если вы знаете только ответ на один вопрос, то поделитесь.Спасибо <3 </p>

1 Ответ

0 голосов
/ 04 июня 2019

res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)

matchTemplate рассчитывает для каждого пикселя, насколько хорошо шаблон соответствует изображению в этом месте.Возвращает 2d массив с этими значениями.Используемый метод - TM_CCOEFF_NORMED, значение NORMED означает, что результаты нормализованы, поэтому значения отображаются в диапазоне от 0 до 1. Вы можете отобразить res, наилучшее совпадение будет белым.Это изображение взято из документов здесь , где вы можете найти дополнительную информацию.

enter image description here

threshhold = 0.70
loc = np.where( res >= threshhold)

np.where возвращаетиндексы, где значение res / качество соответствия больше или равно пороговому значению, которое установлено на 0,70.Индексы соответствуют значениям x и y изображения.Индексы возвращаются как кортеж из двух массивов - один для x, один для y. Хорошие примеры

for pt in zip(*loc[:: -1]):
Здесь происходит несколько отдельных вещей:
*loc[:: -1] An * допускает произвольное количество аргументов.Он используется для распаковки кортежа loc. пример
zip(loc[1],loc[0]) делает то же самое, что и zip(*loc[:: -1])

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

for pt in zip()
zip () возвращает итеративный объект, который можно использовать для зацикливания.Он создает кортежи входных аргументов и, используя for pt in, возвращает их один за другим.В этом случае входные данные представляют собой массив значений x и массив значений y, поэтому он вернет кортеж (x, y).Кортеж хранится в pt.

Попробуйте отобразить / распечатать некоторые шаги, это поможет вам понять.

===

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

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
max_loc будет содержать x, y лучшего совпадения.(верхний левый угол)

...