利用OpenCV实现视频帧按间隔提取为图片
本文介绍如何使用OpenCV库将视频文件逐帧转换为图片。针对视频帧数过多的情况,通过设置采样间隔(如每30帧提取一次)来优化处理效率。代码演示了视频读取、帧计数判断及图片保存的完整流程,适用于需要批量处理视频素材的场景。
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");
}
程序执行后的输出结果如下:

以上即为利用OpenCV将视频帧转换为图片的完整实现方法。希望该示例能为相关开发工作提供参考,欢迎继续关注与分享。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









