基于opencv的c++图像处理(视频抽帧转为图像)

前言

基于opencv的c++接口,视频抽帧转为图像的示例

相关的opencv接口解析

 CV_WRAP explicit VideoCapture(const String& filename, int apiPreference = CAP_ANY);

函数用于打开视频文件或捕获设备或 IP 视频流,以使用 API 首选项进行视频捕获。
@param filename 可以是:
- 视频文件的名称(例如video.avi
- 或图像序列(例如,img_%02d.jpg,它将读取像img_00.jpg、img_01.jpg、img_02.jpg、...这样的样本)
- 或视频流的 URL(例如 protocol://host:port/script_name?script_params|auth
- 或 gst-launch 工具格式的 GStreamer 管道字符串,以防 GStreamer 用作后端
请注意,每个视频流或 IP 摄像机源都有自己的 URL 方案。
@param apiPreference 首选 Capture API 后端使用。 如果多个可用,可用于强制执行特定的读取器实现:例如 cv::CAP_FFMPEG 或 cv::CAP_IMAGES 或 cv::CAP_DSHOW。

 CV_WRAP virtual bool isOpened() const;

如果视频捕获已经初始化,则返回 true。
如果先前对 VideoCapture 构造函数或 VideoCapture::open() 的调用成功,则该方法返回 true。

CV_WRAP virtual double get(int propId) const;

函数返回指定的 VideoCapture 属性
@param propId 来自 cv::VideoCaptureProperties 的属性标识符(例如cv::CAP_PROP_POS_MSEC、cv::CAP_PROP_POS_FRAMES、…)
或者来自@ref videoio_flags_others
@return 指定属性的值。 查询 VideoCapture 实例使用的后端不支持的属性时,返回值 0。

示例代码

#include <opencv2/core/core.hpp>  
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<iostream>
#include<string>
using namespace cv;
using namespace std;

void main()
{
    
    
	//类VideoCapture实例化再初始化
	//VideoCapture capture;
	//capture.open("Megamind.avi");
	//类VideoCapture实例化的同时初始化

	VideoCapture capture("video\\1.mp4");
	if (!capture.isOpened())
	{
    
    
		return;
	}
	int frameH = capture.get(CAP_PROP_FRAME_HEIGHT);
	int frameW = capture.get(CAP_PROP_FRAME_WIDTH);
	int fps = capture.get(CAP_PROP_FPS);
	long numFrames = capture.get(CAP_PROP_FRAME_COUNT);
	printf("vedio's width = %d\t height = %d\nvideo's fps = %d\t nums = %d", frameW, frameH, fps, numFrames);

	int imgIndex = 1;
	while (1)
	{
    
    
		std::cout << "第" << imgIndex << "幅图像" << std::endl;
		Mat frame;
		capture >> frame;
		if (frame.empty())
		{
    
    
			break;
		}

		//char* imageSaveName = new char[200];
		char imageSaveName[256];
		//将图片的路径及名称输入到imageSaveName中
		sprintf_s(imageSaveName, "pictures\\%05d.jpg", imgIndex);

		//将每一帧图像frame保存到imageSaveName指定的文件中
		imwrite(imageSaveName, frame);
		//delete[] imageSaveName;
		imgIndex++;
		if (waitKey(20)>0)
		{
    
    
			break;
		}
		if (imgIndex>4000)
		{
    
    
			break;
		}
	}
	capture.release();
	cout << "total frames: " << imgIndex << endl;
}

猜你喜欢

转载自blog.csdn.net/qq_40118285/article/details/126928575