Detecção de recurso OpenCV

Detecção de Harris Corner

 

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

  • img  - Imagem de entrada, deve ser em tons de cinza e tipo float32.
  • blockSize  - é o tamanho da vizinhança considerada para detecção de canto, para cada pixel (x, y) ele calcula uma matriz de covariância de gradiente 2 × 2 M (x, y) sobre uma vizinhança de blockSize × blockSize. Para cada pixel, a covariância de gradiente matriz de pixels de tamanho de bloco próximos será calculada.
  • ksize  -Parâmetro de abertura da derivada de Sobel usado. Tamanho do kernel de convolução do operador de Sobel
  • k  -Parâmetro livre do detector de Harris na equação Parâmetro livre?

exemplo:

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()

Canto com precisão de SubPixel

Às vezes, você pode precisar encontrar os cantos com precisão máxima. OpenCV vem com uma função cv.cornerSubPix ()  que refina ainda mais os cantos detectados com precisão de subpixel. Às vezes, pode ser necessário encontrar os cantos com precisão máxima.  Portanto, OpenCV Uma função cv.cornerSubPix () é fornecida para obter precisão de subpixel.

corners = cv.cornerSubPix (imagem, cantos, winSize, zeroZone, critérios)

 

imagem Entrada de imagem de canal único, 8 bits ou flutuante. A imagem de entrada deve ser de 8 bits ou flutuante
cantos Coordenadas iniciais dos cantos de entrada e coordenadas refinadas fornecidas para a saída. 得到 的 cantos 坐标
winSize Metade do comprimento lateral da janela de pesquisa. Por exemplo, se winSize = Tamanho (5,5), então uma janela de pesquisa (5 ∗ 2 + 1) × (5 ∗ 2 + 1) = 11 × 11 é usada. Definição Metade do tamanho da janela de pesquisa, por exemplo, se você definir winSize = (5,5), a janela de pesquisa será (5 ∗ 2 + 1) × (5 ∗ 2 + 1) = 11 × 11
zeroZone Metade do tamanho da região morta no meio da zona de busca sobre a qual o somatório na fórmula abaixo não é feito. É usado às vezes para evitar possíveis singularidades da matriz de autocorrelação. O valor de (-1, -1) indica que esse tamanho não existe.
critério Critérios para término do processo iterativo de refinamento de canto. Ou seja, o processo de refinamento da posição do canto para após as iterações de critérios.maxCount ou quando a posição do canto se move menos do que critérios.epsilon em alguma iteração.

 

exemplo:

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)

Na figura acima, o vermelho é o algoritmo Harris Corners e o verde é modificado pelo algoritmo Subpixel. Pode-se ver que o subpixel é mais preciso. 

Acho que você gosta

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