cvStartFindContours的奇怪问题?

时间:2011-10-28 00:29:14

标签: c++ image opencv contour

每当我将图像传递给cvStartFindContours,而不是找到轮廓时,我的图像会变成完全黑色。我完全不知道为什么。我知道这不是由代码的另一部分引起的,即使我将所有内容都注释掉,但是在函数调用cvStartFindContours中,我的图像仍然变黑。然而第二个我注释掉对cvStartFindContours的调用,我的图像仍然正常。为什么会这样?我传入的图像(skinMask)是带有CONTAINS数据的8位1通道图像(IPL_DEPTH_8U)。 (它不是黑色的,上面有白色的碎片)。

为什么我的图像会变黑?感谢

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 个答案:

答案 0 :(得分:1)

我也被这个咬过了。来自findContours的OpenCV文档:

  

image - Source,一个8位单通道图像。非零像素   被视为1。零像素保持为0,因此图像被视为   二进制。您可以使用compare()inRange()threshold(),   adaptiveThreshold()Canny()和其他人创建二进制图片   超出灰度或颜色。 该功能可修改图像   提取轮廓。

因此,如果您不希望修改skinMask图像,则需要传递一份副本...