2011-10-28 3 views
0

Chaque fois que je passe une image à cvStartFindContours, au lieu de trouver les contours, mon image devient complètement noire. Je n'ai absolument aucune idée de pourquoi. Je sais que ce n'est pas causé par une autre partie du code même si je commente tout, mais laissez dans l'appel de fonction à cvStartFindContours, mon image devient toujours noire. Cependant la seconde je commente l'appel à cvStartFindContours, mon image reste normale. Pourquoi cela arrive-t-il? L'image que je passe (skinMask) est une image 8 bits, 1 canal (IPL_DEPTH_8U) avec des données CONTAINS. (ce n'est pas noir, il y a des morceaux de blanc).Problème étrange avec cvStartFindContours?

Pourquoi mon image devient-elle noire? Merci

void connectedComponents() 
{ 
    cvMorphologyEx (skinMask, skinMask, 0, 0, CV_MOP_OPEN, 1); 
    cvMorphologyEx (skinMask, skinMask, 0, 0, CV_MOP_CLOSE, 1); 

    CvMemStorage *connectedCompStorage = cvCreateMemStorage (0); 
    CvSeq *temp = NULL; //used to loop through contour perimeter checking 
    CvSeq *connectedComp = NULL; //stores all derived connected component contours 

    CvContourScanner connectedCompScanner = cvStartFindContours (skinMask, connectedCompStorage); //FUNCTION CALL CAUSING PROBLEMS 

    while ((temp = cvFindNextContour (connectedCompScanner)) != NULL) 
    { 
     double perimeter = cvContourPerimeter (temp); 

     if (perimeter < CC_PERIMETER_THRESH) 
     { 
      cvSubstituteContour (connectedCompScanner, NULL); 
     } 

     else 
     { 
      temp = cvApproxPoly (temp, sizeof (CvContour), connectedCompStorage, CV_POLY_APPROX_DP, 2, 0); 
      cvSubstituteContour (connectedCompScanner, temp); 
     } 
    } 

    connectedComp = cvEndFindContours (&connectedCompScanner); 

    cvZero (skinMask); 

    for (temp = connectedComp; temp != NULL; temp = temp -> h_next); 
    { 
     cvDrawContours (skinMask, temp, cvScalar (255, 255, 255), cvScalar (0, 0, 0), -1, CV_FILLED, 8); 
    } 

    cvReleaseMemStorage (&connectedCompStorage); 
} 
+0

Avez-vous déboguer le code? Est-ce que l'un des contours a un périmètre plus grand que votre seuil? – Adrian

Répondre

1

J'ai été mordu par cela aussi. À partir de la documentation OpenCV pour findContours:

image - Source, image monocanal 8 bits. Les pixels non nuls sont traités comme des 1. Les pixels zéro restent des 0, donc l'image est traitée comme binaire. Vous pouvez utiliser compare(), inRange(), threshold(), adaptiveThreshold(), Canny() et d'autres pour créer une image binaire à partir d'une échelle de gris ou de couleur. La fonction modifie l'image tandis que extrait les contours.

Donc, si vous ne voulez pas votre image skinMask à modifier, vous devez passer une copie ...

+0

MERCI! : D J'ai essayé de comprendre cela pendant 2 semaines, et vous l'avez résolu parfaitement! :) – user1017485

+0

Pas de problème! Désolé, vous avez passé 2 semaines dessus :(Stack Overflow est une ressource incroyable! – mevatron