前言
基于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;
}