2013-07-15 56 views
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); 

这是我收到的错误。

enter image description here

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

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

请帮我解决这个问题。谢谢。

+3

我从来没有在一个地方见过这么多'新'。如果你绝对必须有指针**,请使用智能指针**。 – chris

+2

按重试,调试应用程序。有机会你没有用任何东西来填充你的矢量。 –

+0

@TheForest和TheTrees:我做到了。没有什么变化:( –

回答

3

您需要找到哪个向量超出了其界限。

你循环直到轮廓的大小,

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

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

我会大胆地猜测,该contoursPoly已经超越它的界限,你可以打破进入调试器检查如建议。

改变环路

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

可能解决眼前的问题。

+0

是的,正确。我用你的技术,直到我找到完整的修复。谢谢 :) –

1

这里

(*contoursPoly)[i] 

您尝试访问的东西不存在。

更重要的是,该文件说:

C++:无效approxPolyDP(InputArray曲线,OutputArray approxCurve,双ε,布尔关闭) ... approxCurve - (...)的类型应与输入曲线(...)

这里有输入的类型 - 垫和输出 - 矢量<点>。也许这也是可行的,IDK。