1
我的OpenCV和C++写了一个短程序来跟踪与摄像头的对象。网络摄像头的配方很快没有滞后,但在周末下班前,我记录了一个典型的序列,作为测试模板,直到我工作到星期一。代码中的这一点和相应的变化使得视频以非常慢的速度播放。这里是代码,打开“Test.avi”,约20秒长,而不是运行网络摄像头的恒定流:慢速视频,使用OpenCV的
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <vector>
using namespace cv;
using namespace std;
Mat drawBoundingBoxes (Mat canvasImage, vector<vector<Point>> contours);
int main(int argc, char** argv[])
{
Mat frame;
Mat back;
Mat fGround;
BackgroundSubtractorMOG2 bGround;
bGround.nmixtures = 3;
//bGround.nShadowDetection = 0;
bGround.fTau = .5;
VideoCapture cap;
cap.open("Test.avi");
if (!cap.isOpened())
{
cout << "Can't open video" << endl;
return -1;
}
vector<vector<Point>> contours;
namedWindow("video", CV_WINDOW_AUTOSIZE);
while (true)
{
static int count = 1;
cap >> frame;
if (frame.empty())
break;
bGround.operator()(frame, fGround);
bGround.getBackgroundImage(back);
erode(fGround, fGround, Mat(), Point(-1,-1), 2, BORDER_DEFAULT);
dilate(fGround, fGround, Mat(), Point(-1,-1), 10, BORDER_DEFAULT);
if (count > 50)
{
findContours(fGround, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
drawContours(frame, contours, -1, Scalar(239,255,0), 2);
drawBoundingBoxes(frame, contours);
}
imshow("video", frame);
if(waitKey(30) >= 0)
break;
count++;
}
return 0;
}
Mat drawBoundingBoxes (Mat canvasImage, vector<vector<Point>> contours)
{
vector<Rect> boundRect(contours.size());
for (int i=0; i<contours.size(); i++)
{
boundRect[i] = boundingRect(contours[i]);
rectangle(canvasImage, boundRect[i], Scalar(153,0,76), 2, 8, 0);
}
return canvasImage;
}
任何想法?内存泄漏的地方?谢谢,
托尼
“在代码中相应的变化” - 这你们没有找出任何影响。它的工作,你做了*某事*,现在它播放得太慢了。嗯... – 2013-02-16 04:27:22
对不起,我认为任何有OpenCV经验的人都会知道这个变化是非常非常小的。基本变化回去摄像头饲料版本将删除这些两行: cap.open(“Test.avi”); namedWindow(“video”,CV_WINDOW_AUTOSIZE); 而更换: VideoCapture帽; 用: VideoCapture帽(0); 对不起,感谢您的回复! – TonyRo 2013-02-16 04:38:24
新视频中的图像与您在直接使用网络摄像头时测试的图像非常相似吗?背景减法器或轮廓搜索阶段是否有可能比平时花费更长的时间,因为图像更具有“挑战性”。 – 2013-02-16 04:48:56