1、添加头文件
#include<thread>
#include<chrono>
2、传参数据结构体
typedef struct videoWriterParam
{
std::string filename;
int fourcc;
double fps;
cv::Size size;
}videoP;
3、录制线程函数
queue<cv::Mat> vec;//备注:在其他地方使用的时候,只需要将处理后的结果图像压入队列即可,用于图像处理函数将处理完的数据进行push进队列中,全局
std::mutex mx;
void* run(void* param){
videoP* p = (videoP*)param;
cv::VideoWriter writer;
writer.open(p->filename, p->fourcc, p->fps, p->size);
while (overFlag && (vec.size() != 0))
{
std::cout << vec.size() << std::endl;
if (vec.size() > 0) {
cv::Mat frame = vec.front().clone();
writer << frame;
mx.lock()
vec.pop();
mx.unlock();
//cv::waitKey(1);
}
else
{
std::this_thread::sleep_for(std::chrono::milliseconds(30));
}
}
writer.release();
return nullptr;
}
其中“overFlag”用于标记帧数据,如果没有可写的帧数据则退出录制;
4、初始化线程
videoP* param = new videoP;
param->filename = "./videOut_test.avi";
param->fourcc = cv::VideoWriter::fourcc('M', 'J', 'P', 'G');
param->fps = 25.0;
param->size = cv::Size(640,480);
std::thread thr(run, param);
thr.detach();