OpenCV视频处理:帧提取与视频合成实战代码解析
本文详细讲解如何使用OpenCV将视频分解为单帧图片,以及如何将有序图片序列重新合成视频。通过C++代码示例,演示了如何设置采样间隔(如每30帧提取一次)以优化处理效率,并介绍了批量读取图片及生成AVI格式视频文件的具体实现步骤与参数配置。
OpenCV视频处理概述
本文介绍基于OpenCV库将视频帧转换为图片输出的方法。由于视频通常包含大量帧,直接全部转换往往不必要且效率低下,因此建议设置采样间隔(例如每30帧提取一次)来筛选关键帧。此外,若仅需处理视频的前N帧,也可通过调整代码逻辑轻松实现。
以下是第一个程序示例,主要演示视频帧到图片的转换逻辑。
视频帧提取代码实现
#include <iostream>
#include "cv.h"
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
// 描述:将视频帧转成图片输出
void main()
{
// 获取视频文件
VideoCapture cap("J:\\CQH\\DLFR\\lab_face\\video\\DSC_0023.MOV");
// 获取视频总帧数
long totalFrameNumber = cap.get(CV_CAP_PROP_FRAME_COUNT);
cout << "total frames: " << totalFrameNumber << endl;
Mat frame;
bool flags = true;
long currentFrame = 0;
while (flags){
// 读取视频每一帧
cap.read(frame);
stringstream str;
str << "cqh" << currentFrame << ".jpg";
cout << "正在处理第" << currentFrame << "帧" << endl;
printf("\n");
// 设置每30帧获取一次帧
if (currentFrame % 30 == 0){
// 将帧转成图片输出
imwrite("J:\\CQH\\DLFR\\lab_face\\videoToImages\\DSC_0023\\" + str.str(), frame);
}
// 结束条件
if (currentFrame >= totalFrameNumber){
flags = false;
}
currentFrame++;
}
system("pause");
}
第二个程序示例展示了如何批量且有序地读取图片文件。
批量图片读取示例
#include<opencv2/opencv.hpp>
using namespace cv;
void main()
{
//批量读取图片(有序)
char filename[50];
char winName[50];
Mat srcImg;
for (int i = 1; i < 100; i++)
{
sprintf(filename,"%d.bmp",i);
sprintf(winName,"NO--%d",i);
srcImg=imread(filename);
if (srcImg.empty())
break;
imshow(winName,srcImg);
}
waitKey(0);
destroyAllWindows();
}
二、视频分解成图片
执行前需确保在E盘已创建名为pic的文件夹,且图片文件需按1, 2...等数字顺序命名,以便程序正确读取。
视频分解为图片流程
#include<opencv2/opencv.hpp>
using namespace cv;
void main()
{
Mat frame;
char outfile[50];
VideoCapture cap("E:\\2.avi");
if (!cap.isOpened())//打开失败
return;
int totalFrame=cap.get(CV_CAP_PROP_FRAME_COUNT);//获取视频总帧数
for (int i = 1; i <=totalFrame; i++)
{
cap>>frame;
if (frame.empty())
break;
sprintf(outfile,"E:\\pic\\%d.bmp",i);
imwrite(outfile,frame);
imshow("video",frame);
waitKey(15);
}
cap.release();
destroyAllWindows();
}
三、图片合成视频
图片合成视频流程
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
void main()
{
VideoWriter writer("E:\\out.avi",CV_FOURCC('X','V','I','D'),20,Size(320,240),true);//Size要和图片尺寸保持一致
char filename[50];
Mat frame;
for (int i = 1; i < 644; i++)
{
sprintf(filename,"E:\\pic\\%d.bmp",i);
frame=imread(filename);
if(frame.empty()) break;
writer<<frame;
}
cout<<"write end!"<<endl;
destroyAllWindows();
}
处理完成后,程序将在E盘根目录生成名为out.avi的视频文件。输出路径及图片源路径均支持自定义修改。
以上即为利用OpenCV将视频分解为单帧图片,以及将图片合成视频的完整示例。希望上述内容能为您提供参考,欢迎继续支持本站获取更多技术分享。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













