Странная проблема с cvStartFindContours? - PullRequest
0 голосов
/ 28 октября 2011

Всякий раз, когда я передаю изображение в cvStartFindContours, вместо нахождения контуров мое изображение становится полностью черным. Я понятия не имею, почему. Я знаю, что это не вызвано другой частью кода, даже если я закомментирую все, но оставлю в вызове функции cvStartFindContours, мое изображение по-прежнему становится черным. Однако, как только я закомментирую вызов cvStartFindContours, мое изображение остается нормальным. Почему это происходит? Изображение, которое я передаю (skinMask), представляет собой 8-битное 1-канальное изображение (IPL_DEPTH_8U) с данными CONTAINS. (он не черный, на нем кусочки белого).

Почему мое изображение становится черным? Спасибо

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);
}

1 Ответ

1 голос
/ 28 октября 2011

Меня это тоже укусило. Из документации OpenCV для findContours:

image - Источник, 8-битное одноканальное изображение. Ненулевые пиксели рассматривается как 1. Нулевые пиксели остаются 0, поэтому изображение рассматривается как двоичный Вы можете использовать compare(), inRange(), threshold(), adaptiveThreshold(), Canny() и другие для создания бинарного изображения из оттенков серого или цвета. Функция изменяет изображение, пока извлечение контуров.

Итак, если вы не хотите, чтобы ваше skinMask изображение было изменено, вам нужно передать его копию ...

...