O que é um canto?
Um canto pode ser interpretado como a junção de duas arestas (onde uma aresta é uma mudança repentina no brilho da imagem).

Detecção de canto Shi-Tomasi -

Shi-Tomasi Corner Detection foi publicado por J.Shi e C.Tomasi em seu artigo ' Good Features to Track '. Aqui, a intuição básica é que os cantos podem ser detectados procurando mudanças significativas em todas as direções.

Consideramos uma pequena janela na imagem e então examinamos a imagem inteira, procurando cantos.

Deslocar essa pequena janela em qualquer direção resultaria em uma grande mudança na aparência, se essa janela específica estiver localizada em um canto.

As regiões planas não sofrerão alterações em nenhuma direção.



Se houver uma borda, não haverá nenhuma mudança significativa ao longo da direção da borda.

Visão geral matemática -

Para uma janela (W) localizada em (X, Y) com intensidade de pixel I (X, Y), a fórmula para a detecção de canto de Shi-Tomasi é -

f (X, Y) = Σ (I (X k , Y k ) - I (X k + ΔX, Y k + ΔY)) 2   onde (X k , Y k ) ϵ W

De acordo com a fórmula:
Se estivermos digitalizando a imagem com uma janela da mesma forma que faríamos com um kernel e percebermos que há uma área onde há uma grande mudança, não importa a direção em que digitalizamos, então temos uma boa intuição que provavelmente há um canto ali.

O cálculo de f (X, Y) será muito lento. Portanto, usamos a expansão de Taylor para simplificar a função de pontuação, R.

R = min (λ 1 , λ 2 )
onde λ 1 , λ 2 são autovalores da matriz resultante

Usando a goodFeaturesToTrack()função -

Sintaxe: cv2.goodFeaturesToTrack (gray_img, maxc, Q, minD)

Parâmetros:
gray_img - Imagem em tons de cinza com valores integrais
maxc - Número máximo de cantos que queremos (dê um valor negativo para obter todos os cantos)
Q - Parâmetro de nível de qualidade (valor preferencial = 0,01)
maxD - Distância máxima (valor preferencial = 10)

    
import cv2 
import numpy as np 
import matplotlib.pyplot as plt 
%matplotlib inline 
img = cv2.imread('chess.png') 
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
  
corners = cv2.goodFeaturesToTrack(gray_img, 100, 0.01, 10) 
corners = np.int0(corners) 
for i in corners: 
    x, y = i.ravel() 
    cv2.circle(img, (x, y), 3, (255, 0, 0), -1) 
plt.imshow(img) 
if cv2.waitKey(0) & 0xff == 27
    cv2.destroyAllWindows() 

Entrada :

Resultado :