矢量超出范围

时间:2013-07-15 08:38:11

标签: visual-studio-2010 opencv image-processing vector c++-cli

我正在尝试使用OpenCV在轮廓周围绘制一个边界框。这是一个实时应用程序,所有图像都是从摄像头实时抓取的,而以下是代码的重要部分

RTMotionDetector.h

vector<vector<Point>> *contours;
    vector<vector<Point>> *contoursPoly;

RTMotionDetector.cpp

RTMotionDetector::RTMotionDetector(void)
{
    current = new Mat();
    currentGrey = new Mat();
    canny = new Mat();
    next = new Mat();
    absolute = new Mat();

    cam1 = new VideoCapture();
    cam2 = new VideoCapture();

    contours = new vector<vector<Point>>();
    contoursPoly = new vector<vector<Point>>();
    boundRect = new vector<Rect>();

}

double RTMotionDetector::getMSE(Mat I1, Mat I2)
{
    Mat s1;

    //Find difference
    cv::absdiff(I1, I2, s1);       // |I1 - I2|
    imshow("Difference",s1);

    //Do canny to get edges
    cv::Canny(s1,*canny,30,30,3);
    imshow("Canny",*canny);

    //Find contours
    findContours(*canny,*contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
    //System::Windows::Forms::MessageBox::Show(""+contours->size());

    //Draw contours
    drawContours(*current,*contours,-1,Scalar(0,0,255),2);
    for(int i=0;i<contours->size();i++)
    {
        cv::approxPolyDP(Mat((*contours)[i]),(*contoursPoly)[i],3,true);
        //boundRect[i] = boundingRect(contoursPoly[i]);
    }
}

下一部分执行后,我收到错误

cv::approxPolyDP(Mat((*contours)[i]),(*contoursPoly)[i],3,true);

这是我得到的错误。

enter image description here

如果我注释掉那段代码,那么没有问题。我知道这是ArrayIndexOutOfBounds问题,但我真的找不到修复方法。可能是因为我是Windows编程新手。

contours作为指针而不是局部变量保持非常重要,因为局部变量以令人难以置信的方式减慢了程序的速度。

2 个答案:

答案 0 :(得分:3)

您需要找到哪个向量超出其范围的访问权限。

你循环直到轮廓的大小,

for(int i=0;i<contours->size();i++)

但随后访问(*contoursPoly)[i]

我猜测contoursPoly超出了它的范围,你可以按照建议进入调试器来检查。

将循环更改为

for(int i=0;i<contours->size() && i<contoursPoly->size();i++)

可以解决眼前的问题。

答案 1 :(得分:1)

下面

(*contoursPoly)[i]

您尝试访问不存在的内容。

更重要的是,文档说:

  

C ++:void approxPolyDP(InputArray curve,OutputArray approxCurve,double epsilon,bool closed)   ...    approxCurve - (...)类型应与输入曲线的类型匹配(...)

这里有输入 - Mat和输出 - 矢量&lt;点&gt;。也许这也有效,IDK。