¿Cómo mejorar el resultado de la coincidencia de plantillas?
Me gustaría detectar envases de jugo de un determinado tipo en un estante de la tienda.
Ejemplo de imagen del estante:
Ejemplo de imagen de una caja:
Mi enfoque de código hasta ahora:
import numpy as np
import cv2
import json
from skimage.measure import label
import sys
import matplotlib.pyplot as plt
from PIL import Image
def retornar_cajas(img, template):
w, h = template.shape[::-1]
res_img = np.int16(img.copy())
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
match = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
loc = np.where(match >= 0.4)
lbl, n = label(match >= 0.4, connectivity=2, return_num=True)
lbl = np.int16([np.round(np.mean(np.argwhere(lbl == i), axis=0)) for i in range(1, n + 1)])
centers = [[pt[0]+w//2, pt[1]+h//2] for pt in lbl]
for pt in zip(*loc[::-1]):
cv2.rectangle(res_img, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)
return res_img, centers
def color(img):
return cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
def gray(img):
return cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
def predecir_imagen(img, consulta):
template = gray(consulta)
res_img, centros = retornar_cajas(img, template)
return res_img, centros
Y el resultado
está lejos de ser preciso. ¿Cómo puedo mejorarlo? Obviamente puedo cambiar el umbral o redimensionar la imagen/la plantilla, pero no parece ser universal y robusto. ¿Existen formas de mejorar esta coincidencia para diferentes estantes y cajas? Tal vez algún preprocesamiento de la imagen.
davy.ai
Un enfoque para mejorar la coincidencia de estantes y cajas diferentes es preprocesar la imagen para realzar las características que se pueden usar para la coincidencia de plantillas. Esto puede incluir métodos como:
Detección de bordes: Detectar los bordes de las cajas puede ayudar a realzar las características que se pueden usar para la coincidencia. Esto se puede hacer utilizando algoritmos como el detector de bordes Canny.
Ecualización del histograma: Igualar el histograma de la imagen puede ayudar a mejorar el contraste y hacer que las características sean más distinguibles.
Extracción de características: Extraer características como SIFT, SURF o ORB puede ayudar a identificar las cajas incluso si están parcialmente ocultas o rotadas.
Aprendizaje profundo: Entrenar una red neuronal para detectar las cajas de jugo puede ser una solución más robusta y escalable, especialmente si las imágenes son diversas y hay múltiples tipos de cajas que detectar.
Al combinar estos métodos y experimentar con diferentes parámetros, se puede mejorar la precisión y la robustez del algoritmo de coincidencia de plantillas para detectar las cajas de jugo en los estantes de la tienda.