2013-07-04 6 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 개구, 제 임계 5 .

#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; 
} 
: findContours이 6. 더 큰 영역 여기

으로 contourn을 그리는 것은 내 코드입니다

어떻게 해결할 수 있습니까 ??

+0

[짧은, 편집 가능한 예] (http://sscce.org)를 게시하십시오. 게시 된 코드가 컴파일되지 않으며 컴파일러 오류를 수정하려고 시도한 후에 문제를 다시 만들 수 없습니다. 코드를 복사하여 붙여 넣을 수 있다면 사람들이 쉽게 도울 수 있습니다! – Aurelius

+0

또한 [이 질문에] (http://stackoverflow.com/q/16948057/1601291) 동일한 문제를 설명하고 VS 2012 고유 것으로 나타납니다. – Aurelius

+0

편집 : 여기에 귀하의 짧은 컴파일 가능한 예제 –

답변

0

VS2012 문제인지 확인했습니다. VS2010에서 모든 것이 좋습니다.

0

이 wierd 버그는 VS2013에서도 발생합니다.

contourArea에 전달하기 전에 윤곽선 유형 [i]을 벡터에서 CV :: Mat로 변환 해보십시오.

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)); 

그게 효과가 있습니다.

관련 문제