0

画像を 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);
}
4

1 に答える 1

1

私もこれで噛まれました。のOpenCVドキュメントからfindContours

image – ソース、8 ビットのシングル チャネル イメージ。ゼロ以外のピクセルは 1 として扱われます。ゼロ ピクセルは 0 のままであるため、画像はバイナリとして扱われます。compare()inRange()threshold()adaptiveThreshold()、およびその他を使用Canny()して、グレースケールまたはカラー イメージからバイナリ イメージを作成できます。この関数は、輪郭を抽出しながら画像を修正します。

したがって、画像を変更したくない場合はskinMask、そのコピーを渡す必要があります...

于 2011-10-28T15:05:47.790 に答える