Comparaison de contour en OpenCV (Conversion de C en C ++)

Je suis toujours nouveau en C ++ et je dois maintenant convertir certaines parties de mon ancien programme du C au C ++, car je souhaite appliquer BackgroundSubtractorMOG2 à mon programme car il n’est disponible qu’en C ++. Fondamentalement, ce programme détectera les contours d’une caméra vidéo sur la base d’une soustraction d’arrière-plan et choisira les plus grands contours disponibles.

J’ai un problème en particulier sur cette partie (tirée de l’ ancien programme ):

 double largestArea = 0; //Const. for the largest area CvSeq* largest_contour = NULL; //Contour for the largest area while (current_contour != NULL){ //If the current contour available double area = fabs(cvContourArea(current_contour,CV_WHOLE_SEQ, false)); //Get the current contour's area as "area" if(area > largestArea){ //If "area" is larger than the previous largest area largestArea = area; largest_contour = current_contour; } current_contour = current_contour->h_next; //Search for the next contour } 

Cette partie est l’endroit où le programme va scanner chaque contour disponible en tant que current_contour , trouver sa surface et la comparer au précédent contour le plus grand. Ma question est de savoir comment obtenir le current_contour , sa zone et passer au prochain contour en C ++? Aussi, qu’est-ce qui est indiqué par contours.size() en C ++? S’agit-il du nombre de contours balayés ou de la surface totale des contours?

C’est ce que j’ai fait jusqu’à présent:

 for(;;) { cap >> frame; // get a new frame from camera if( frame.empty() ) break; image=frame.clone(); mog(frame,foreground,-1); threshold(foreground,foreground,lowerC,upperC,THRESH_BINARY); medianBlur(foreground,foreground,9); erode(foreground,foreground,Mat()); dilate(foreground,foreground,Mat()); findContours(foreground,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE); if(contours.empty()) continue; //Starting this part double largest_area = 0; for(int i= 0; i = largest_area){ largest_area = area; largest_contours = contours; } } //Until this part drawContours(image,largest_contours,-1,Scalar(0,0,255),2); imshow( "Capture",image ); imshow("Contours",foreground); if(waitKey(30) >= 0) break; } 

Merci d’avance.

PS: L’ancien programme contenait des bogues, mais l’algorithme fonctionnait parfaitement. Gratuit comme moi si vous avez besoin du programme mis à jour. Utilise actuellement OpenCV 2.4.3 + VS C ++ 2010 Exp.

MODIFIER:

Merci à tous ceux qui essaient de m’aider mais j’ai déjà la réponse qui vient d’ ici . Cependant, pour ceux qui ne savent toujours pas, OpenCV en C N’EST PAS EXACTEMENT LA MEME OpenCV en C++ .

C’est une partie du code, où je trouve tous les contours sur l’image et calcule leur périmètre et leur surface:

 IplImage* bin = cvCreateImage( cvGetSize(_image), IPL_DEPTH_8U, 1); cvConvertImage(_image, bin, CV_BGR2GRAY); cvCanny(bin, bin, 50, 200); CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* contours=0; //Number of all contours on image @contoursCont@ int contoursCont = cvFindContours( bin, storage,&contours,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0)); assert(contours!=0); // iterate through all contours --> current = current->h_next for( CvSeq* current = contours; current != NULL; current = current->h_next ) { //calculate perimeter and area of each contour double area = fabs(cvContourArea(current)); double perim = cvContourPerimeter(current); cvDrawContours(_image, current, cvScalar(0, 0, 255), cvScalar(0, 255, 0), -1, 1, 8); //the rest code } 

De la documentation OpenCV:

La fonction cvFindContours extrait les contours de l’image binary et renvoie le nombre de contours récupérés. Le pointeur CvSeq * contours = 0 est rempli par la fonction. Il contiendra un pointeur sur le premier contour extérieur ou NULL si aucun contour n’est détecté (si l’image est complètement noire). D’autres contours peuvent être atteints à partir de first_contour à l’aide des liens h_next et v_next.