C++ OpenCV:contourArea断言失败

C++ OpenCV:contourArea断言失败,c++,opencv,visual-studio-2012,C++,Opencv,Visual Studio 2012,当我尝试启动应用程序时,它在执行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,

当我尝试启动应用程序时,它在执行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.从摄像机捕捉帧, 2.高斯和中值滤波, 3.形态开放,, 4.门槛 5.发现的恐龙, 6.绘制面积较大的轮廓线

这是我的密码:

#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;
}
#包括
#包括
使用名称空间cv;
使用名称空间std;
垫罩(480640,CV_8UC1);
向量层次;
矢量等值线;
向量我的轮廓;
int main(){
摄像机(0);
如果(!camera.isOpened()){
返回-1;
}
而(1){
Mat cameraframe,过滤图像,mask2;
照相机>>照相机框架;
GaussianBlur(摄像机帧,滤波图像,大小(11,11),0,0);
medianBlur(过滤后的img,过滤后的img,11);
CVT颜色(过滤的、过滤的、CV的);
范围(过滤的img,标量(0,76,97),标量(20,143,205),掩码);
morphologyEx(遮罩、遮罩、变形打开、getStructuringElement(变形、大小(9,9)、点(4,4));
高斯模糊(掩模,掩模,尺寸(3,3),0,0);
放大(遮罩,遮罩,getStructuringElement(变形椭圆,大小(7,7),点(0,0));
mask.copyTo(mask2);
findContours(mask2、等高线、层次、CV_RETR_外部、CV_链_近似_简单、点(0,0));
双面积,最大面积=0.0;
对于(int i=0;imax_区域)
{
最大面积=面积;
我的轮廓n=轮廓[i];
}
}
绘制轮廓(蒙版,我的轮廓,10,标量(255,0,0),2,8);
imshow(“我的控制”,面具);
如果(等待键(30)>=0)
打破
}
返回0;
}

如何修复它???

我确认这是VS2012问题。在VS2010上,一切正常。

此wierd错误也发生在VS2013上

尝试将轮廓类型[i]从vector转换为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));
matconmat(等高线[i].size(),2,CV_32FC1);
对于(int i=0;i<轮廓[i].size();i++)
{
(i,0)=等高线[i].x;
(i,1)=等高线[i].y;
}    
面积=晶圆厂(轮廓面积(conMat));

这对我很有用。

请发一封邮件。您发布的代码无法编译,在尝试修复您的编译器错误后,我无法重新创建您的问题。如果我们可以复制粘贴您的代码并运行它,人们就更容易提供帮助!此外,还描述了相同的问题,它似乎是VS 2012独有的。编辑:这里是您的简短可编译示例