我正在尝试使用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
保留为指针而不是局部变量非常重要,因为局部变量以令人难以置信的方式降低了程序的速度。
最佳答案
您需要找到对哪个 vector 的访问超出了范围。
循环直到轮廓的大小,
for(int i=0;i<contours->size();i++)
但是然后访问
(*contoursPoly)[i]
我可能会冒昧地认为contoursPoly已超出其范围,您可以按照建议进入调试器进行检查。
将循环更改为
for(int i=0;i<contours->size() && i<contoursPoly->size();i++)
也许可以解决眼前的问题。
关于visual-studio-2010 - 向量超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17649955/