slt, s'il ya qq qui peut m'aider d'expliquer comme elle fonctionne cette instruction en détail et avec quelle méthode : gradient ou laplacien. s'il y a des tutoriels qui explique bien cette instruction et merci d'avance
slt, s'il ya qq qui peut m'aider d'expliquer comme elle fonctionne cette instruction en détail et avec quelle méthode : gradient ou laplacien. s'il y a des tutoriels qui explique bien cette instruction et merci d'avance
Dans quel but veux-tu l'utiliser ?
La doc est fourni sur le sujet : http://docs.opencv.org/modules/imgpr... Point offset)
En entrée, findContours prend une image en niveau de gris (CV_8UC1), une variable de stockage des points formant les contours trouvées (std::vector<std::vector<cv:oint> > contours) et des paramètres sur la forme dans laquelle tu veux que les points soit stockés.
par exemple :
Avec ces paramètres, tu vas récupérer chaque contours séparément (CV_RETR_LIST) et tu aura tous les points formant le contours (pas d'approximation polygonale ou autre) (CV_CHAIN_APPROX_NONE).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 cv::Mat image_en_niveau_de_gris = cv::imread("image.jpg", CV_LOAD_IMAGE_GRAYSCALE); std::vector<std::vector<cv::Point> > contours; cv::findContours(image_en_niveau_de_gris, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
Une méthode qui peut te permettre d'afficher les contours ainsi obtenu :
appelé comme ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void drawContour(cv::Mat& image, std::vector<cv::Point> contour) { for(int i = 0; i < contour.size(); i++) { cv::Vec3b couleur (rand()%127 + 127, rand()%127 + 127, rand()%127 + 127); for(int j = 0; j < contour.at(i).size(); j++) { image.at<cv::Vec3b>(contour.at(i).at(j)) = couleur; } } }
Il existe d'autres paramètres suivant les cas qui peuvent être intéressant, je te laisse la doc.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 cv::Mat image = cv::Mat::zeros(image_en_niveau_de_gris.size(), CV_8UC3); drawContour(image, contours); cv::imwrite("resultat_contour.jpg", image);
merci pour la réponse, j'ai utilisé cette fonction dans mon code et j'ai compris sa fonctionnement pratiquement mais j'ai pas trouvé comment elle fonctionne théoriquement. s'il ya quelques théories de base de cette fonction
2 choses:
- En lisant la documentation donnée en lien par supernovagm, tu aurais pu voir ceci:
qui référence ce livre:The function retrieves contours from the binary image using the algorithm [Suzuki85]
Ca fait un bon point de départ si tu veux plus de renseignements. Ensuite, tu as toujours la possibilité d'aller farfouiller dans le code.Suzuki, S. and Abe, K., Topological Structural Analysis of Digitized Binary Images by Border Following. CVGIP 30 1, pp 32-46 (1985)
- Pour afficher les contours trouvés, nul besoin d'écrire une méthode drawContour! Il y en a déjà une toute faite dans OpenCV.
Partager