c - OpenCV cvFindContours 只查找一个轮廓

标签 c opencv computer-vision contour feature-detection

我正在继续使用 openCV,这是我描述的第一次冒险 here 。一切进展顺利,但我偶然发现了另一件棘手的事情。我想在应用了自适应阈值的图像上找到轮廓:

enter image description here

因此,cvFindContours 似乎工作得很好,结果如下:

enter image description here

问题是,当我尝试迭代找到的计数时,它说只有一个轮廓(以下代码中的轮廓->总计等于 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);

应该是这样吗,只有一个轮廓吗?也许我不明白openCV对轮廓的定义?我将非常感谢您的帮助。

最佳答案

实际上cvFindContours返回已找到轮廓的数量(我测试了你的图片,它返回>1)。请参阅docs 。但我不知道为什么 total 等于 1。

关于c - OpenCV cvFindContours 只查找一个轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11851815/

相关文章:

python - 加载 TrueType 字体到 OpenCV

c++ - 深度上的时间去除会导致鬼影

matlab - 通过图像处理识别纸币

C : Write multiple arrays with one function.

c - 我试图使用一个函数将文本文件的每 3 个字符放入一个数组指针中。

C 从配置文件中读取值

python - 如何在opencv python中使用分水岭分割

javascript - 如何在 webkit2gtk 中将 native 代码公开给 javascript

opencv - ROS Melodic & OpenCV - CompressedImage 不发布

python - 使用 Pytesseract OCR 对具有表结构的图像进行错误字符识别