0

我正在尝试使用 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);

这是我得到的错误。

在此处输入图像描述

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

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

4

2 回答 2

3

您需要找出对哪个向量的访问超出了它的界限。

你循环直到轮廓的大小,

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

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

我会冒险猜测 contoursPoly 已超出其界限,您可以按照建议通过闯入调试器进行检查。

将循环更改为

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

可以解决眼前的问题。

于 2013-07-15T08:48:24.933 回答
1

这里

(*contoursPoly)[i]

你试图访问不存在的东西。

更重要的是,文档说:

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

这里有输入 - Mat 和输出 - 矢量<Point>。也许这也有效,IDK。

于 2013-07-15T08:50:47.923 回答