#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QFileDialog>
#include <stdio.h>
#include <string>
#include <queue>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <qaction.h>
void test()
{
queue<Mat> videoframes;
Mat frame;
VideoCapture capture;
capture.open("./data/output.mp4");
if (!capture.isOpened())
{
return;
}
videoframes = queue<Mat>();
while (capture.read(frame))
{
qDebug("add one frame");
videoframes.push(frame.clone());
videoframes.push(frame.clone()); //方法1
//videoframes.push(move(frame)); //方法2
}
capture.release();
qDebug("getFrameOk");
while (!videoframes.empty())
{
Mat frame = videoframes.front();
videoframes.pop();
namedWindow("Display");
//显示图像
imshow("Display", frame);
//暂停,等待按键结束
waitKey(10);
qDebug("Detect frame tid:%x", this_thread::get_id());
}
}
问题:
这串代码会显示完全一样的图片
原因:
opencv的Mat对象的拷贝构造和赋值都是浅拷贝,也就是说队列中的对象最终都指向最后输入的图像
解决方法:
使用clone()方法,进行深拷贝
调用move函数也可