Detección de funciones OpenCV

Detección de esquinas de Harris

 

dst = cv.cornerHarris (src, blockSize, ksize, k)

  • img  -Imagen de entrada, debe ser en escala de grises y tipo float32.
  • blockSize  -Es el tamaño de la vecindad considerada para la detección de esquinas, para cada píxel (x, y) calcula una matriz de covarianza de gradiente 2 × 2 M (x, y) sobre una vecindad blockSize × blockSize. Para cada píxel, la covarianza de gradiente Se calculará la matriz de píxeles de tamaño de bloque cercanos.
  • ksize  - Parámetro de apertura del derivado de Sobel utilizado. Tamaño del kernel de convolución del operador de Sobel
  • k  -Parámetro libre del detector Harris en la ecuación ¿Parámetro libre?

ejemplo:

import numpy as np
import cv2 as cv
filename = 'chessboard.png'
img = cv.imread(filename)
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv.cornerHarris(gray,2,3,0.04)
#result is dilated for marking the corners, not important
dst = cv.dilate(dst,None)
# Threshold for an optimal value, it may vary depending on the image.
img[dst>0.01*dst.max()]=[0,0,255]
cv.imshow('dst',img)
if cv.waitKey(0) & 0xff == 27:
    cv.destroyAllWindows()

Esquina con precisión de subpíxeles

A veces, es posible que necesite encontrar las esquinas con la máxima precisión. OpenCV viene con una función cv.cornerSubPix ()  que refina aún más las esquinas detectadas con una precisión de subpíxeles. A veces, es posible que necesite encontrar las esquinas con la máxima precisión.  Por lo tanto, OpenCV Se proporciona una función cv.cornerSubPix () para obtener una precisión de subpíxeles.

esquinas = cv.cornerSubPix (imagen, esquinas, winSize, zeroZone, criterios)

 

imagen Imagen de entrada de un solo canal, 8 bits o flotante. La imagen de entrada debe ser de 8 bits o flotante
esquinas Las coordenadas iniciales de las esquinas de entrada y las coordenadas refinadas proporcionadas para la salida.
winSize La mitad de la longitud lateral de la ventana de búsqueda. Por ejemplo, si winSize = Size (5,5), entonces se utiliza una ventana de búsqueda (5 ∗ 2 + 1) × (5 ∗ 2 + 1) = 11 × 11. Definición La mitad del tamaño de la ventana de búsqueda, por ejemplo, si establece winSize = (5,5), entonces la ventana de búsqueda es (5 ∗ 2 + 1) × (5 ∗ 2 + 1) = 11 × 11
zeroZone La mitad del tamaño de la región muerta en el medio de la zona de búsqueda sobre la cual no se realiza la suma en la fórmula siguiente. A veces se utiliza para evitar posibles singularidades de la matriz de autocorrelación. El valor de (-1, -1) indica que no existe tal tamaño.
Criterios Criterios para la terminación del proceso iterativo de refinamiento de esquinas. Es decir, el proceso de refinamiento de la posición de la esquina se detiene después de las iteraciones de criteria.maxCount o cuando la posición de la esquina se mueve menos que criteria.epsilon en alguna iteración.

 

ejemplo:

import numpy as np
import cv2 as cv
filename = 'chessboard2.jpg'
img = cv.imread(filename)
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# find Harris corners
gray = np.float32(gray)
dst = cv.cornerHarris(gray,2,3,0.04)
dst = cv.dilate(dst,None)
ret, dst = cv.threshold(dst,0.01*dst.max(),255,0)
dst = np.uint8(dst)
# find centroids
ret, labels, stats, centroids = cv.connectedComponentsWithStats(dst)
# define the criteria to stop and refine the corners
criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 100, 0.001)
corners = cv.cornerSubPix(gray,np.float32(centroids),(5,5),(-1,-1),criteria)
# Now draw them
res = np.hstack((centroids,corners))
res = np.int0(res)
img[res[:,1],res[:,0]]=[0,0,255]
img[res[:,3],res[:,2]] = [0,255,0]
cv.imwrite('subpixel5.png',img)

En la figura anterior, el rojo es el algoritmo de Harris Corners y el verde es modificado por el algoritmo de subpíxeles. Se puede ver que el subpíxel es más preciso. 

Supongo que te gusta

Origin blog.csdn.net/weixin_40244676/article/details/104319135
Recomendado
Clasificación