1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
Paramètres de ma fonction : img_src : tableau 2D image d'entrée, img_dst : tableau 2D image de sortie, Gauss : valeur de lissage gaussien, k : coefficient 0.04 (peut aller jusqu'à 0.06), threshold : ma valeur de seuil, corner_Harris : un vector remplie avec les coordonées en x et en y de mes points.
J'applique la dérivée de Sobel [-1 -2 -1; 0 0 0; 1 2 1] et [-1 0 1; -2 0 2; 1 0 2] pour obtenir deux tableaux 2D des dérivées en x et en y.
Si Gauss > 0, j'applique un lissage gaussien selon la valeur de Gauss.
Je parcours img_src pour obtenir 3 variables : A, qui correspond aux Ix²; B, qui correspond aux Ixy; et C, qui correspond aux Iy².
Je calcule la réponse : réponse = (A * C - B * B) - k * (A + B) * (A + B);
Si ma réponse est supérieur à threshold, je garde la valeur (que je ramène entre [0; 255]). Sinon, mon pixel vaut 0.
Il faut savoir que le calcul de A, B et C se faite dans une fenêtre 3*3 autour du pixel étudiée.
Une fois ce calcul fait sur tous les pixels de l'image, je calcule les maxima locaux pour n'obtenir que les plus forts points. Le calcule est fait sur une fenêtre 3*3 autours du pixel étudié.
Je refais un dernier tour pour obtenir la position [x, y] de chaque point pour remplir mon vecteur std::vector, ces points devant être des coins. |
Partager