OpenCV findContours 函数问题

Posted

技术标签:

【中文标题】OpenCV findContours 函数问题【英文标题】:OpenCV findContours function problem 【发布时间】:2010-06-21 19:15:40 【问题描述】:

我正在尝试在 OpenCV 中使用 findContours 函数,但 VS 2008 给出错误提示:

OpenCV 错误:错误标志(参数或结构字段)(无法识别或不支持 ed 数组类型)在未知函数中,文件 ........\ocv\opencv\src\cxcore\cxarr ay.cpp,第 2476 行

此应用程序已请求运行时以不寻常的方式终止它。 请联系应用程序的支持团队以获取更多信息。 按任意键继续 。 . .

代码如下:

Mat_<Vec<float,3>> originalimage;

Mat_<Vec<float,3>> resultingimage;

vector<vector<cv::Point>> v;

originalimage = cv::imread("Original.ppm");

cv::findContours(originalimage,v,CV_RETR_LIST,CV_CHAIN_APPROX_NONE);

提前致谢

【问题讨论】:

这些是正确的声明: Mat_> originalimage; Mat_> 结果图像;矢量> v; 【参考方案1】:

FindContours 只接受二值图像。也就是说,任何输出的图像 cvThreshold cvAdapiveThreshold cvCanny

尝试在 cv::findContours 之前添加此语句

cvThreshold(originalImage,resultingImage,100,100,CV_THRESH_BINARY) 

然后使用 resultImage 调用 findcontours。

如果它有效,那么你应该在 cvThreshold 中输入正确的参数(100 只是一个例子)。检查参考。

编辑:结果图像应该是单通道图像!!

【讨论】:

【参考方案2】:

我在使用该功能时遇到了同样的问题(或至少是类似的问题)。我无法修复它,所以我改用了旧的 C 风格的 cvFindContours 函数。我在其中包含了一个示例函数,我使用 cvFindContours 函数来清理 blob 图像。这可能不是最快的解决方案,但至少可行。

void filtBproject(Mat& Bproject)

    Scalar          color       = CV_RGB(255,255,255); // text color
    IplImage*       BprojectIpl =  &IplImage(Bproject);
    CvMemStorage*   storage     = cvCreateMemStorage(0);
    CvSeq*          contours    = 0;
    int             numCont     = 0;
    int             contAthresh = 45;

    numCont= cvFindContours( BprojectIpl, storage, &contours, sizeof(CvContour),
                    CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) );

    cvSet(BprojectIpl, cvScalar(0,0,0));
    for( ; contours != 0; contours = contours->h_next )
        

            if ( (cvContourArea(contours, CV_WHOLE_SEQ) > contAthresh) )
                cvDrawContours( BprojectIpl, contours, color, color, -1, CV_FILLED, 8 );
            
        

【讨论】:

【参考方案3】:

对于你的 v 向量,你需要像这样添加一个空格:

vector<vector<cv::Point> > v;

非常微妙和愚蠢,但它有效。

【讨论】:

以上是关于OpenCV findContours 函数问题的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV findContours函数

opencv findContours函数

OpenCV-Python教程:22.轮廓层级

OpenCV4.5 findContours函数崩溃的真正有效解决方案

为啥 opencv 中的 FindContours 函数会在如下图像中找到两个轮廓而不是一个?

OpenCV findContours 堆栈溢出