Python

Как реализовать поиск изображения на питоне

суть такая хочу написать для себя бота, который будет передвигаться по острову и собирать ресурсы(камень), пытался написать поиск шаблона по картинке камня через pyautogui, но он не определяет камень если он другой формы или если сменилось освещение либо же если текстура камня частично закрыта текстурами деревьев и тп, будет ли работать поиск такого объекта через cv2.matchtemplate или отрисовку контуров ? примеры изображений https://postimg.cc/gallery/g2zcN9D
Вы можете использовать функцию cv2.matchTemplate библиотеки OpenCV для выполнения сопоставления шаблонов в Python. Эта функция принимает изображение "шаблона" и изображение "поиска" и возвращает матрицу, указывающую уровень сходства между шаблоном и всеми подобластями изображения поиска. Затем вы можете использовать функцию cv2.minMaxLoc, чтобы найти местоположение субрегиона на поисковом изображении, который имеет наибольшее сходство с шаблоном.

Ниже приведен пример кода, демонстрирующий использование cv2.matchTemplate и cv2.minMaxLoc для поиска изображения шаблона в большом поисковом изображении:
 import cv2 
import numpy as np

# Load the template and search images
template = cv2.imread('template.jpg', cv2.IMREAD_GRAYSCALE)
search_image = cv2.imread('search.jpg', cv2.IMREAD_GRAYSCALE)

# Perform pattern matching using cv2.matchTemplate
result = cv2.matchTemplate(search_image, template, cv2.TM_CCOEFF_NORMED)

# Use cv2.minMaxLoc to find the location of the highest similarity
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

# Calculate the top-left and bottom-right coordinates of the template in the search image
template_width, template_height = template.shape[::-1]
top_left = max_loc
bottom_right = (top_left[0] + template_width, top_left[1] + template_height)

# Draw a rectangle around the template in the search image
cv2.rectangle(search_image, top_left, bottom_right, 255, 2)

# Display the search image with the template highlighted
cv2.imshow('Result', search_image)
cv2.waitKey(0)
В качестве альтернативы можно использовать определение контуров, чтобы найти на изображении фигуры, соответствующие определенному шаблону. Для этого можно использовать функцию cv2.findContours для поиска всех контуров на изображении, а затем использовать функцию cv2.matchShapes для сравнения формы каждого контура с формой вашего шаблона. Затем вы можете выбрать контур с наибольшим сходством с вашим шаблоном.

Вот пример кода, демонстрирующий, как использовать cv2.findContours и cv2.matchShapes для поиска контуров на изображении, соответствующих определенному шаблону:
 import cv2 
import numpy as np

# Load the template and search images
template = cv2.imread('template.jpg', cv2.IMREAD_GRAYSCALE)
search_image = cv2.imread('search.jpg', cv2.IMREAD_GRAYSCALE)

# Find the contours in the search image
contours, _ = cv2.findContours(search_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

# Find the contour with the highest similarity to the template
best_match = None
best_similarity = 0
for contour in contours:
similarity = cv2.matchShapes(contour, template, cv2.CONTOURS_MATCH_I1, 0)
if similarity > best_similarity:
best_match = contour
best_similarity = similarity

# Draw the best matching contour on the search image
cv2.drawContours(search_image, [best_match], -1, (0, 255, 0), 2)

# Display the search image with the best matching contour highlighted
cv2.imshow('Result', search_image)
cv2.waitKey(0)
Этот код сначала загружает шаблон и поисковые изображения, а затем находит все контуры на поисковом изображении с помощью cv2.findContours. Затем выполняется итерация по каждому контуру и сравнение формы контура с формой шаблона с помощью cv2.matchShapes. Контур с наибольшим сходством выбирается как наилучшее совпадение. Наконец, код рисует контур с наилучшим совпадением на поисковом изображении и отображает результат.
Александр Коновалов
Александр Коновалов
917
Лучший ответ