0

ここで説明した最初の冒険である openCV の作業を続けています。順調に進んでいますが、別のトリッキーなことに出くわしました。適応しきい値を適用した画像の輪郭を見つけたい:

ここに画像の説明を入力

そのため、cvFindContours非常にうまく機能しているようで、結果は次のとおりです。

ここに画像の説明を入力

問題は、見つかった輪郭を反復しようとすると、輪郭が 1 つしかないと表示されることです (contours->total次のコードでは 1 に等しい)。コードは次のとおりです。

IplImage* img;
if((img = cvLoadImage( "photos/img-000012.ppm", 1)) == 0 )
{
    perror("cvLoadImage");
    return 1;
}
cvNamedWindow( "Image view", 1 );
cvShowImage( "Image view", img );

IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 ); // allocate a 1 channel byte image
cvCvtColor( img, gray, CV_BGR2GRAY );
cvShowImage( "Image view", gray );
cvWaitKey(0);

cvAdaptiveThreshold(gray, gray,
        255,    //  Non-zero value assigned to the pixels for which the condition is satisfied
        CV_ADAPTIVE_THRESH_MEAN_C, // adaptiveMethod
        CV_THRESH_BINARY_INV,   // thresholdType
        11, // blockSize
        5); // Constant subtracted from the mean or weighted mean
cvShowImage( "Image view", gray );
cvWaitKey(0);

IplConvKernel *se = cvCreateStructuringElementEx(3, 3, 1,  1,  CV_SHAPE_RECT, NULL);
cvErode(gray, gray, se, 1);
cvShowImage( "Image view", gray );
cvWaitKey(0);

IplImage *canny_out = cvCreateImage(cvGetSize(gray), 8, 1);
cvCanny(gray, canny_out, 50, 100, 3);
cvShowImage( "Image view", canny_out );
cvWaitKey(0);

CvMemStorage *storage = cvCreateMemStorage(0);
CvSeq *contours = cvCreateSeq(0, sizeof(CvSeq), sizeof(CvPoint), storage);
cvFindContours(gray, storage, &contours, sizeof(CvContour), CV_RETR_LIST,
        CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
printf("contours->total = %d\n", contours->total);

cvDrawContours(img, contours, CV_RGB(0,255,0), CV_RGB(0,0,255),
        2, 1, 8, cvPoint(0, 0));
cvShowImage( "Image view", img );
cvWaitKey(0);

輪郭が1つしかないのは、このようにする必要がありますか?輪郭のopenCVの定義を理解していないのでしょうか?よろしくお願いします。

4

2 に答える 2

2

実際cvFindContoursには、確立された輪郭の数を返します (私はあなたの写真をテストし、>1 を返しました)。ドキュメントを参照してください。totalしかし、なぜ1に等しいのかわかりません。

于 2012-08-07T19:13:17.233 に答える
0
  1. cvCreateSeq()あなたは前にする必要はありませんcvFindContours()
  2. 輪郭->合計の代わりに、それらを繰り返します。

    for (; contours != 0; contours = contours->h_next)

于 2013-10-30T06:33:16.470 に答える