Comenzamos con el aprendizaje de los conceptos básicos de OpenCV y luego hicimos algunas manipulaciones y procesamiento de imágenes básicos en imágenes seguidas de segmentaciones de imágenes y muchas otras operaciones utilizando OpenCV y lenguaje Python. Aquí, en esta sección, realizaremos algunas técnicas simples de detección de objetos utilizando la coincidencia de plantillas. Encontraremos un objeto en una imagen y luego describiremos sus características. Las características son los atributos comunes de la imagen, como esquinas, bordes, etc. También veremos algunos algoritmos de detección de objetos comunes y populares como SIFT, SURF, FAST, BREIF & ORB.
Como se dijo en los tutoriales anteriores, OpenCV es una biblioteca Commuter Vision de código abierto que tiene interfaces C ++, Python y Java y es compatible con Windows, Linux, Mac OS, iOS y Android. Por lo que se puede instalar fácilmente en Raspberry Pi con entorno Python y Linux. Y la Raspberry Pi con OpenCV y la cámara adjunta se puede utilizar para crear muchas aplicaciones de procesamiento de imágenes en tiempo real como detección de rostros, bloqueo de rostros, seguimiento de objetos, detección de matrículas de automóviles, sistema de seguridad para el hogar, etc.
La detección y el reconocimiento de objetos forman el caso de uso más importante para la visión por computadora, se utilizan para hacer cosas poderosas como
- Etiquetado de escenas
- Navegación del robot
- Coches autónomos
- Reconocimiento corporal (Microsoft Kinect)
- Detección de enfermedades y cáncer
- Reconocimiento facial
- Reconocimiento de escritura a mano
- Identificación de objetos en imágenes de satélite
Detección de objetos VS reconocimiento
El reconocimiento de objetos es el segundo nivel de detección de objetos en el que la computadora puede reconocer un objeto de varios objetos en una imagen y puede ser capaz de identificarlo.
Ahora, realizaremos algunas funciones de procesamiento de imágenes para encontrar un objeto a partir de una imagen.
Encontrar un objeto a partir de una imagen
Aquí usaremos la coincidencia de plantillas para encontrar caracteres / objetos en una imagen, use la función cv2.matchTemplate () de OpenCV para encontrar ese objeto
importar cv2 importar numpy como np
Cargue la imagen de entrada y conviértala en gris
imagen = cv2.imread ('WaldoBeach.jpg') cv2.imshow ('gente', imagen) cv2.waitKey (0) gris = cv2.cvtColor (imagen, cv2.COLOR_BGR2GRAY)
Cargar la imagen de la plantilla
template = cv2.imread ('waldo.jpg', 0) #resultado de la coincidencia de la plantilla del objeto sobre una imagen result = cv2.matchTemplate (gris, plantilla, cv2.TM_CCOEFF) sin_val, max_val, min_loc, max_loc = cv2.minMaxLoc (resultado)
Crear cuadro delimitador
top_left = max_loc # aumentar el tamaño del rectángulo delimitador en 50 píxeles bottom_right = (top_left + 50, top_left + 50) cv2.rectangle (image, top_left, bottom_right, (0,255,0), 5) cv2.imshow ('objeto encontrado', imagen) cv2.waitKey (0) cv2.destroyAllWindows ()
En cv2.matchTemplate (gris, plantilla, cv2.TM_CCOEFF) , ingrese la imagen en escala de grises para encontrar el objeto y la plantilla. Luego aplique el método de coincidencia de plantillas para encontrar los objetos de la imagen, aquí se usa cv2.TM_CCOEFF .
Toda la función devuelve una matriz que se ingresa como resultado, que es el resultado del procedimiento de coincidencia de la plantilla.
Y luego usamos cv2.minMaxLoc (resultado) , que da las coordenadas o el cuadro delimitador donde se encontró el objeto en una imagen, y cuando obtenemos esas coordenadas dibujamos un rectángulo sobre él y estiramos un poco las dimensiones del cuadro para que el El objeto puede caber fácilmente dentro del rectángulo.
Hay una variedad de métodos para realizar la coincidencia de plantillas y en este caso estamos usando cv2.TM_CCOEFF que significa coeficiente de correlación.
Aquí los puntos clave son coordenadas (X, Y) extraídas usando un detector de tamizado y dibujadas sobre la imagen usando la función cv2 draw keypoint.
NAVEGAR
importar cv2 importar numpy como np image = cv2.imread ('paris.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Crear objeto SURF Feature Detector, aquí establecemos el umbral de arpillera en 500
surf = cv2.xfeatures2d.SURF_create (500) puntos clave, descriptores = surf.detectAndCompute (gris, Ninguno) print ("Número de puntos clave detectados:", len (puntos clave))
Dibuja puntos clave enriquecidos en la imagen de entrada
imagen = cv2.drawKeypoints (imagen, puntos clave, Ninguno, banderas = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Método de característica - SURF', imagen) cv2.waitKey () cv2.destroyAllWindows ()
Salida de consola:
RÁPIDO
importar cv2 importar numpy como np image = cv2.imread ('paris.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Crear objeto FAST Detector
rápida cv2.FastFeatureDetector_create = () # obtener puntos clave, no por la supresión máximo predeterminado es ON # para desactivar el conjunto fast.setBool ('nonmaxSuppression', False) puntos clave = fast.detect (gris, Ninguno) print ("Número de puntos clave Detectado: ", len (puntos clave))
Dibuja puntos clave ricos en la imagen de entrada
imagen = cv2.drawKeypoints (imagen, puntos clave, Ninguno, banderas = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Método de función - FAST', imagen) cv2.waitKey () cv2.destroyAllWindows ()
Salida de consola:
BREVE
importar cv2 importar numpy como np image = cv2.imread ('paris.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Crear objeto detector FAST
breve = cv2.xfeatures2d.BriefDescriptorExtractor_create ()
Crear objeto extractor BRIEF
#brief = cv2.DescriptorExtractor_create ("BRIEF") # Determinar puntos clave keypoints = fast.detect (gris, Ninguno)
Obtenga descriptores y nuevos puntos clave finales utilizando BRIEF
puntos clave, descriptores = breve.compute (gris, puntos clave) print ("Número de puntos clave detectados:", len (puntos clave))
Dibuja puntos clave ricos en la imagen de entrada
imagen = cv2.drawKeypoints (imagen, puntos clave, Ninguno, banderas = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Método de característica - BREVE', imagen) cv2.waitKey () cv2.destroyAllWindows ()
Salida de consola:
ORBE
importar cv2 importar numpy como np image = cv2.imread ('paris.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Crear objeto ORB, podemos especificar el número de puntos clave que deseamos
orb = cv2.ORB_create () # Determinar puntos clave keypoints = orb.detect (gris, Ninguno)
Obtenga los descriptores
puntos clave, descriptores = orbe.compute (gris, puntos clave) print ("Número de puntos clave detectados:", len (puntos clave))
Dibuja puntos clave ricos en la imagen de entrada
image = cv2.drawKeypoints (imagen, puntos clave, Ninguno, banderas = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Método de función - ORB', imagen) cv2.waitKey () cv2.destroyAllWindows ()
Salida de consola:
Podemos especificar el número de puntos clave que tiene un límite máximo de 5000, sin embargo, el valor predeterminado es 500, es decir, ORB detectaría automáticamente los mejores 500 puntos clave si no se especifica para ningún valor de puntos clave.
Así es como se lleva a cabo la detección de objetos en OpenCV, los mismos programas también se pueden ejecutar en Raspberry Pi con OpenCV instalado y se pueden usar como un dispositivo portátil como los teléfonos inteligentes con Google Lens.
Este artículo es una referencia del curso Master Computer Vision ™ OpenCV4 en Python con Deep Learning en Udemy, creado por Rajeev Ratan, suscríbase para obtener más información sobre Computer Vision y Python.