我正在从网络摄像头抓取框架在窗口上显示它们。为了进行时间分析,我在抓取它时将帧保持在矢量上。 为了测试它,当我的矢量大小达到100时,我试图可视化到目前为止存储的所有帧。
奇怪的是,实际上矢量内部有100帧,但它们都是相同的,并且对应于捕获的最后一帧。
代码:
Mat frame;
_cap.start(0); //VideoCapture object
vector<Mat> seq;
while(1)
{
_cap.getFrame(frame);
seq.push_back(frame);
imshow("a", seq[0]);
if (seq.size() == 100)
{
for (int n = 0; n < seq.size(); n++)
{
cout << "I'm in" << endl;
imshow("b", seq[n]);
waitKey(0);
}
}
waitKey(30);
}
答案 0 :(得分:3)
你从VideoCapture得到的Mat都指向相同的驱动程序内存。
Mat a = b;做一个浅拷贝(相同的像素指针)
所以你需要:
seq.push_back(frame.clone());
这里(即深拷贝)
答案 1 :(得分:0)
帧仍将指向相同的数据字段。因此,无论何时获取新图像,所有先前捕获的图像也将更新。
解决方案是在通过调用frame.release()