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