OpenCV поиск, учитывая цвет
Как сделать, чтобы matchTemplate находил совпадения, учитывая цвет? Любое изменение кода даёт ошибку. Я понимаю, что в коде используется cv2.COLOR_BGR2GRAY, меняю на cv2.COLOR_BGR2RGB - возникает ошибка. Приведу пример: есть шарики одинаковой формы, но разных цветов и почти одинаковых размеров. Нужно найти шарик определенного цвета. Решить эту задачу я смог, вырезав найденный объект, чтобы определить его цвет, но хотелось бы иметь более чистый код..
Документация. https://docs.opencv.org/master/d4/dc6/tutorial_py_template_matching.html
import cv2
import numpy as np
from PIL import Image
def searchObjectInImage(img, tpl, acc):
img = cv2.imread(img)
gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
template = cv2.imread(tpl, cv2.IMREAD_GRAYSCALE)
w,h = template.shape[::-1]
result = cv2.matchTemplate(gray_img,template, cv2.TM_CCOEFF_NORMED)
loc = np.where(result >= acc)
for pt in zip(*loc[::-1]):
cv2.rectangle(img, pt,(pt[0] + w,pt[1] +h), (0,255,0),3)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Ответы (2 шт):
cv2.COLOR_BGR2GRAY, меняю на cv2.COLOR_BGR2RGB - возникает ошибка.
Могу только предположить, что это связано с разной размерностью gray_img и template. То есть вы пытаетесь по изображению с тремя каналами искать совпадение с шаблоном с одним каналом.
Иными словами, замените строчку template = cv2.imread(tpl, cv2.IMREAD_GRAYSCALE)
на template = cv2.imread(tpl, cv2.IMREAD_COLOR) или вовсе не указывайте параметр flag (по умолчанию cv2.IMREAD_COLOR). Изображение template будет в трех каналах BGR. То есть вам нужно сделать либо еще одну конвертацию template в RGB, или убрать конвертацию gray_img в RGB.
Смотрим официальную документацию и видим, что входное изображение должно быть либо 8-битное, либо 32-битное float-point. При этом шаблон должен иметь тот же тип, что и входное изображение. Можете попробовать разбить изображение по каналам и применять шаблон к каждому каналу отдельно