2010-06-21 97 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