利用OpenCV实现视频帧按间隔提取为图片

听雨眠
听雨眠
发布时间:2026-10-13 | 4人浏览过
原创

本文介绍如何使用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将视频帧转换为图片的完整实现方法。希望该示例能为相关开发工作提供参考,欢迎继续关注与分享。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表