2013-07-04 149 views
1

當我嘗試啓動我的應用程序時,它在執行contourArea時意外崩潰。OpenCV:contourArea聲明失敗

以下是錯誤:

OpenCV Error: Assertion Failed (contour.checkVector(2) >= 0 && (contour.depth() ==CV_32F || contour.depth() == CV_32S)) in unknown function, file ..\..\..\src\opencv\modules\imgproc\src\contours.cpp, line 1904 

我的程序很簡單:從相機 1.catch幀, 2.高斯和中值濾波, 3.形態學開, 4.閾值, 5 。findContours, 6.提請contourn與大面積

這裏是我的代碼:

#include <opencv2/opencv.hpp> 
#include <stdio.h> 

using namespace cv; 
using namespace std; 

Mat mask(480,640, CV_8UC1); 
vector<Vec4i> hierarchy; 
vector<vector<Point> > contours; 
vector<Point> my_contourn; 

int main(){ 
VideoCapture camera(0); 

if(!camera.isOpened()){ 
    return -1; 
} 

while(1){ 
    Mat cameraframe,filtered_img,mask2; 
    camera >> cameraframe; 

    GaussianBlur(cameraframe,filtered_img,Size(11,11),0,0); 
    medianBlur(filtered_img,filtered_img,11); 
    cvtColor(filtered_img,filtered_img,CV_BGR2HSV); 
    inRange(filtered_img, Scalar(0, 76, 97), Scalar(20, 143, 205), mask); 
    morphologyEx(mask,mask,MORPH_OPEN,getStructuringElement(MORPH_RECT,Size(9,9),Point(4,4))); 
    GaussianBlur(mask,mask,Size(3,3),0,0); 
    dilate(mask,mask,getStructuringElement(MORPH_ELLIPSE,Size(7, 7),Point(0, 0))); 


    mask.copyTo(mask2); 
    findContours(mask2,contours,hierarchy,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,Point(0, 0)); 

    double area,max_area=0.0; 


    for(int i=0;i<contours.size();i++){ 

     area = fabs(contourArea(contours[i])); 
     if (area>max_area) 
     { 
      max_area=area; 
      my_contourn=contours[i]; 
     } 
    } 

    drawContours(mask, my_contourn, 10, Scalar(255,0,0), 2, 8); 

    imshow("my cont",mask); 

    if(waitKey(30)>=0) 
     break; 
} 
return 0; 
} 

我該如何解決?

+0

請發佈一個[簡短,可編輯的例子](http://sscce.org)。您發佈的代碼無法編譯,並且在嘗試修復編譯器錯誤後,我無法重新創建您的問題。如果我們可以複製粘貼代碼並運行它,那麼人們可以更容易地提供幫助! – Aurelius

+0

此外,[這個問題](http://stackoverflow.com/q/16948057/1601291)描述了同樣的問題,它似乎是唯一的VS 2012. – Aurelius

+0

編輯:在這裏你的簡短和可編輯的例子 –

回答

0

我確認這是一個VS2012問題。在VS2010上,一切都很好。

0

這個奇怪的錯誤也發生在VS2013上。

嘗試將輪廓[i]從矢量類型轉換爲CV :: Mat,然後將其傳遞到contourArea。

Mat conMat(contours[i].size(), 2, CV_32FC1); 
for(int i = 0; i < contours[i].size(); i ++) 
{ 
    conMat.at<float>(i, 0) = contours[i].x; 
    conMat.at<float>(i, 1) = contours[i].y; 
}  
area = fabs(contourArea(conMat)); 

這對我很有用。