Обнаружить есть ли часть картинки в другой картинке
у меня есть фотография куска кнопки, как можно определить есть ли данная кнопка на другой фотографии? Пытался с помощью получения всех пикселей куска кнопки, а затем сверять есть ли список этих пикселей в той картинке, но все безуспешно, может есть какой-то вариант?
Ответы (1 шт):
Можно попробовать сделать скрин, через opencv найти ту кнопку, например по ее форме, а после кликнуть по расположению кнопки.
В качестве основы скрипта взял пример поиска книг, немного его модифицировал и получил расположение кнопки. Я не особо работал с opencv :)
А так, для работы нужно:
- Загрузить картинку (скриншот можно сделать, например, через
PILилиpyautogui.screenshot()) - Сделать предобработку, чтобы убрать лишнее
- Сделать поиск контуров
- Фильтрация контуров, например по количеству вершин и размеру
Пример:
# 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) и рисования найденного контура:



