Сопоставление шаблонов с несколькими объектами OpenCV
Столкнулся с такой проблемой. Как найти похожие объекты на картинке код нашел, как найти координаты этих объектов на картинке не могу найти. Можно найти координаты когда ищем 1 объект методом:
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # функция для определения координат
a, b = max_loc
Код адаптировал с https://pythonpip.ru/opencv/sopostavlenie-s-shablonom-v-opencv Все работает:
import cv2
import numpy as np
# Загружаем картинку на которой ищем
img_rgb = cv2.imread(r'C:\Users\gundr\Desktop\Sk\Screenshot_13.png') # вписать ваш путь
# преобразовываем её
img_rgb = np.array(img_rgb)
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2HSV)
# загружаем картинку которую ищем
template = cv2.imread(r'C:\Users\gundr\Desktop\Sk\coin1.png')
# высота ширана искомого объекта
w, h = template.shape[:-1]
# стравниваем
res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where(res >= threshold)
# Находим контуры
for pt in zip(*loc[::-1]):
cv2.rectangle(img_rgb, pt,(pt[0] + w, pt[1] + h),(0,255,255), 2)
while True:
cv2.imshow('Detected', img_rgb)
key_press = cv2.waitKey(30)
if key_press == ord('q'):
cl_pr = True
break
# ВОПРОС: КАК НАЙТИ КООРДИНАТЫ НАЙДЕННЫХ ОБЪЕКТОВ?
Подскажите пожалуйста, как найти координаты найденных объектов на картинке!
Ответы (1 шт):
Автор решения: Петр -Орк
→ Ссылка
Нашел ответ, в этой теме
import cv2
from imutils.object_detection import non_max_suppression # pip install imutils
# Load the image and template
image = cv2.imread(img_path, cv2.IMREAD_COLOR)
template = cv2.imread(template_path, cv2.IMREAD_COLOR)
# Perform template matching
result = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)
# Filter results to only good ones
threshold = 0.90 # Larger values have less, but better matches.
(yCoords, xCoords) = np.where(result >= threshold)
# Perform non-maximum suppression.
template_h, template_w = template.shape[:2]
rects = []
for (x, y) in zip(xCoords, yCoords):
rects.append((x, y, x + template_w, y + template_h))
pick = non_max_suppression(np.array(rects))
# Optional: Visualize the results
for (startX, startY, endX, endY) in pick:
cv2.rectangle(image, (startX, startY), (endX, endY),(0, 255, 0), 2)
cv2.imshow('Results', image)

