cv::mat 保存为视频的方式
时间: 2024-06-12 21:07:13 浏览: 188
有两种常见的方式可以将cv::Mat保存为视频:
1. 使用cv::VideoWriter类:这是OpenCV提供的API,可以将cv::Mat保存为视频文件,使用方法如下:
```
cv::VideoWriter writer;
writer.open("output.avi", cv::VideoWriter::fourcc('M','J','P','G'), 25, cv::Size(640, 480), true);
if (writer.isOpened())
{
writer.write(frame); // frame为要保存的cv::Mat
}
writer.release();
```
其中,第一个参数为要保存的视频文件名,第二个参数指定视频编码方式(这里使用MJPG),第三个参数为帧率,第四个参数为视频分辨率,最后一个参数表示是否保存为彩色视频。
2. 使用ffmpeg库:如果需要更多的视频编码方式,可以使用ffmpeg库。使用方法如下:
```
cv::VideoWriter writer;
writer.open("output.avi", cv::VideoWriter::fourcc('X','2','6','4'), 25, cv::Size(640, 480), true);
if (writer.isOpened())
{
AVFormatContext* formatContext = nullptr;
avformat_alloc_output_context2(&formatContext, nullptr, nullptr, "output.avi");
AVStream* stream = avformat_new_stream(formatContext, nullptr);
stream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
stream->codecpar->codec_id = AV_CODEC_ID_H264;
stream->codecpar->width = 640;
stream->codecpar->height = 480;
stream->codecpar->format = AV_PIX_FMT_YUV420P;
avio_open(&formatContext->pb, "output.avi", AVIO_FLAG_WRITE);
avformat_write_header(formatContext, nullptr);
AVPacket pkt = { 0 };
av_init_packet(&pkt);
for (int i = 0; i < 100; i++)
{
writer.write(frame); // frame为要保存的cv::Mat
av_new_packet(&pkt, frame.total() * 3);
pkt.data = frame.data;
pkt.size = frame.total() * 3;
av_write_frame(formatContext, &pkt);
av_packet_unref(&pkt);
}
av_write_trailer(formatContext);
avio_close(formatContext->pb);
avformat_free_context(formatContext);
}
writer.release();
```
其中,第一个参数和第五个参数与使用cv::VideoWriter类一样。第二个参数指定视频编码方式(这里使用H264),第三个参数为帧率,第四个参数为视频分辨率,最后一个参数表示是否保存为彩色视频。在写入每一帧时,需要将cv::Mat转换为AVPacket,并调用av_write_frame函数写入。写入完成后,需要调用av_write_trailer函数结束写入。
阅读全文