我正在尝试使用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
作为指针而不是局部变量保持非常重要,因为局部变量以令人难以置信的方式减慢了程序的速度。
答案 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。