2010-06-21 94 views
8

我想使用OpenCV中的findContours功能,但VS 2008年给出了一个错误说:OpenCV的findContours功能问题

OpenCV的错误:错误标志(参数或结构域)(无法识别或UNSUPPORT 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); 

在此先感谢

+0

这些是正确的声明: Mat_ > originalimage; Mat_ >结果图像; vector > v; – user123668 2010-06-21 19:18:42

回答

3

FindContours只接受二进制图像。也就是说,这是 cvThreshold cvAdapiveThreshold cvCanny

试品种前加入这一声明:: findContours

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

的输出随后致电findcontours与resultingImage任何图像。

如果它的工作,那么你应该输入正确的参数cvThreshold(100只是一个例子)。检查这个问题的参考。

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

3

我有同样的问题(或至少类似的一个)与该功能。我无法修复它,所以我改用旧的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); 
      } 
     } 
} 
1

为了您的V向量,则需要添加一个空格,像这样:

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

非常微妙的,愚蠢的,但它的工作原理。

+0

仅供参考Point2d崩溃和点的作品 – 2011-09-30 22:25:16