C++(和 openCV):在向量<Mat>中积累许多垫子
C++ (and openCV): Accumulating a number of Mat in vector<Mat>
我正在从网络摄像头上获取帧,并将其显示在窗口上。为了进行时间分析,我在抓取帧时将其保持在向量上。为了测试它,当我的向量大小达到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);
}
从VideoCapture获得的Mat都指向同一个驱动程序内存。
Mat a=b;浅层复制(相同像素指针)
所以你需要:
seq.push_back(frame.clone());
此处(即深度复制)
帧仍将指向相同的数据字段。因此,每当您获取新图像时,所有先前捕获的图像也将更新。
解决方案是在将帧放入向量后,通过调用frame.release()
来释放帧
相关文章:
- Difference in displaying cv2 Mat
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- EASTL矢量<向量<int>>连续的
- 将CHW格式的浮点向量转换为cv::Mat
- C++中的openCV Mat访问冲突
- OpenCV 和从 OutputArrays 或 (Mat) 读取数据
- 使用 mat.at<uchar>(i,j) 的 opencv C++中的矩阵赋值错误
- C++:从GPU内存(cudaMemcpy2D)获取BGR图像(cv::Mat)
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 将 cv::mat 转换为 QImage
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 将 cv::Mat 转换为 std::vector 的通用函数
- 如何通过引用传递OpenCV MAT
- 在 QML VideoOutput 中将 cv::mat 显示为 QVideoFrame
- Read OpenCV Mat 16bit to QImage 8bit Greyscale
- 将本地 OpenCV Mat 变量声明为静态以防止重新分配
- 将 OpenCv Mat 从 C++ 传递给 Python
- 如何发送 Mat H=findHomography 返回 Matlab
- 将帧从 h264 流解码到 OpenCV Mat
- 将图像加载到Mat-vvector<向量<垫子>>