Обнаружить есть ли часть картинки в другой картинке

у меня есть фотография куска кнопки, как можно определить есть ли данная кнопка на другой фотографии? Пытался с помощью получения всех пикселей куска кнопки, а затем сверять есть ли список этих пикселей в той картинке, но все безуспешно, может есть какой-то вариант?

Кнопка

Фотография с кнопкой


Ответы (1 шт):

Автор решения: gil9red

Можно попробовать сделать скрин, через opencv найти ту кнопку, например по ее форме, а после кликнуть по расположению кнопки.

В качестве основы скрипта взял пример поиска книг, немного его модифицировал и получил расположение кнопки. Я не особо работал с opencv :)

А так, для работы нужно:

  1. Загрузить картинку (скриншот можно сделать, например, через PIL или pyautogui.screenshot())
  2. Сделать предобработку, чтобы убрать лишнее
  3. Сделать поиск контуров
  4. Фильтрация контуров, например по количеству вершин и размеру

Пример:

# pip install opencv-python
import cv2

# Загрузка изображения
image = cv2.imread("img.jpg")
cv2.imshow('image', image)

# Черно-белое изображение
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Размытие
gray = cv2.GaussianBlur(gray, (3, 3), 0)
# cv2.imshow('gray', gray)

# Распознавание контуров
edged = cv2.Canny(gray, 10, 250)
# cv2.imshow('edged', edged)

# Закрытие открытых контуров
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
closed = cv2.morphologyEx(edged, cv2.MORPH_CLOSE, kernel)
# cv2.imshow('closed', closed)

# Нахождение контуров в изображении
contours, _ = cv2.findContours(closed, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
total = 0

image_result = image.copy()

# Перебор контуров
for c in contours:
    # Аппроксимирование (сглаживание) контура
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.05 * peri, True)

    # Если у контура 6 вершины, предполагаем, что это нужная нам кнопка
    if len(approx) != 6:
        continue

    # Дополнительно фильтруем по размеру
    rect = cv2.boundingRect(c)
    width, height = rect[2:]

    # Нужно подбирать
    if height != 50 and width != 169:
        continue

    print(f'Кнопка: {rect}')

    cv2.drawContours(image_result, [approx], -1, (0, 0, 255), 4)
    total += 1

print(f"На картинке найдено: {total}")
cv2.imwrite("output.jpg", image_result)
cv2.imshow('image_result', image_result)

cv2.waitKey()

Немного картинок.

Например, картинка из вопроса после обработки становится такой (строка cv2.imshow('closed', closed)):

введите сюда описание изображения

А после пунктов 3. и 4., скрипт определил расположение кнопки в (196, 454, 169, 50) (т.е. по x, y, width, height) и рисования найденного контура:

введите сюда описание изображения

→ Ссылка