Сопоставление шаблонов с несколькими объектами OpenCV

Рейтинг: 1Ответов: 1Опубликовано: 29.04.2023

Столкнулся с такой проблемой. Как найти похожие объекты на картинке код нашел, как найти координаты этих объектов на картинке не могу найти. Можно найти координаты когда ищем 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)