Detección de esquinas con OpenCV

La detección de esquinas tiene muchas aplicaciones en la visión por computador, entre ellas tenemos: creación de imágenes panorámicas, reconstrucción de objetos tridimensionales (3D), reconocimiento de objetos o figuras, estabilización de video, seguimiento, entre otras cosas.

Uno de los métodos más conocidos para la detección de esquinas es el llamado Harris Corner Detector el cual busca los cambios de intensidad producidos en cada pixel para una región de un tamaño definido, en OpenCV este método esta implementado por la función: cv2.cornerHarris().

Harris Corner en OpenCV

Para utilizar la función: cv2.cornerHarris()debemos pasarle los siguientes parámetros:

  • img – imagen de entrada en escala de grises, el tipo debe ser float32.
  • blockSize – tamaño de los vecinos considerados para la detección.
  • ksize – parámetro de apertura de la derivada Sobel.
  • k – parámetro libre en la formula de Harris.
import cv2
import numpy as np

img = cv2.imread('blox.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

gray = np.float32(gray)
dst = cv2.cornerHarris(gray, 2, 3, 0.04)
 
height, width = dst.shape
color = (0, 255, 0)

for y in range(0, height):
    for x in range(0, width):
        if dst.item(y, x) > 0.01 * dst.max():
            cv2.circle(img, (x, y), 3, color, cv2.FILLED, cv2.LINE_AA)

cv2.imshow('Harris Result', dst)
cv2.imshow('Harris Corner', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Método de Harris para detectar esquinas Resultado de aplicar el método Harris Corner Detection

Explicando en código:

Cargar la imagen y convertir a escala de grises, estas funciones ya las conocemos de tutoriales anteriores por lo que no se entrará en detalles.

img = cv2.imread('blox.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Cambiar el tipo de imagen a float32 y aplicar el método de Harris Corner, prueba variar los parámetros para ver los distintos resultados.

gray = np.float32(gray)
dst = cv2.cornerHarris(gray, 2, 3, 0.04)

Marcar las esquinas encontradas, recorremos la imagen devuelta por el método anterior y verificamos cada uno de sus valores, si esta dentro del rango definido marcamos la posición dibujando un círculo.

height, width = dst.shape
color = (0, 255, 0)

for y in range(0, height):
    for x in range(0, width):
        if dst.item(y, x) > 0.01 * dst.max():
            cv2.circle(img, (x, y), 3, color, cv2.FILLED, cv2.LINE_AA)

El resto del código crea y muestra la ventana respectiva.

Good Feature To Track

Este es otro de los métodos implementados por OpenCV para la detección de esquinas, la función es cv2.goodFeaturesToTrack() debemos pasarle la imagen a escala de grises, la cantidad máxima de esquina que deseamos detectar, el nivel de calidad de las esquinas, la distancia mínima entre las mismas.

Código de ejemplo:

import numpy as np
import cv2

img = cv2.imread('blox.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

corners = cv2.goodFeaturesToTrack(gray, 40, 0.01, 10)
corners = np.int0(corners)
   
for i in corners:
    x,y = i.ravel()
    cv2.circle(img, (x,y), 3, 255, -1)
   
cv2.imshow('corner', img)
cv2.waitKey(0)

Detección de esquinas con cv2.goodFeaturesToTrack() en Python

Explicando el código:

Primero cargamos la imagen y la convertimos a escala de grises, igual que el método anterior, luego podemos aplicar el detector de esquinas con el siguiente código:

corners = cv2.goodFeaturesToTrack(gray, 40, 0.01, 10)
corners = np.int0(corners)

Los parámetros definen lo siguiente: 40 esquinas como máximo, 0.01 es el nivel de calidad permitido, y 10 la distancia mínima entre cada esquina, este método devuelve un conjunto de puntos para cada una de los corners encontrados, cambiamos el tipo a entero en lugar de float.

Recorremos los puntos y dibujamos un circulo en cada una de las respectivas posiciones:

for i in corners:
    x, y = i.ravel()
    cv2.circle(img, (x, y), 3, 255, -1)

Al finalizar mostramos las imágenes en la ventana.

Comentarios

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Procesamiento de imágenes en OpenCV

Conociendo la clase cv::Mat de OpenCV

Acceso a la webcam con OpenCV