OpenCV读取视频并跳帧保存为图片
[TOC]
介绍几个有关视频读取的函数:
VideoCapture::VideoCapture
VideoCapture可以从文件中或者摄像头中读取视频,这是提供给C++的接口的,C的接口是CvCapture结构。
1 | VideoCapture::VideoCapture(conststring& filename) |
上面是初始化VideoCapture对象的,第一个是从文件中读取,第二个是从设备中读取,默认设备在这里是0;
例子:
1 | VideoCapturecapture(“sample.avi”); /*读取sample.avi文件*/ |
VideoCapture::Open
打开视频文件或者视频设备(例如摄像头)。
1 | bool VideoCapture::open(const string& filename) |
例子:
1 | VideoCapturecapture; |
上面的视频文件打开,用完后,最好调用 capture.release() 来关闭刚刚打开的文件
VideoCapture::release
1 | void VideoCapture::release() |
例子:
1 | capture.release(); /*释放打开的视频*/ |
VideoCapture::isOpened
判断视频是否被打开,成功打开返回ture,否则false。
1 | bool VideoCapture::open(const string& filename) |
VideoCapture::grab
从视频文件中或者设备中获取下一帧,该方法成功调用返回ture;主要用于多摄像头情况下,特别当那些摄像头没有实现硬件同步。
1 | bool VideoCapture::grab() |
grab之后,需要调用retrive对获取的帧进行解码。
VideoCapture::retrieve
对grab()得到的帧进行解码。
1 | bool VideoCapture::retrieve(Mat& image, int channel=0) |
VideoCapture::read
获取、解码,这个方法结合了grab和retrieve,比较方便,
1 | VideoCapture& VideoCapture::operator>>(Mat& image) |
例子1:
1 | // 方法一 |
这两个方法都可以,不过第一个能够判断,建议使用第一个,程序更健壮。
VideoCapture::get
返回VideoCapture的一些属性
1 | double VideoCapture::get(int propId) |
probId可以是下面的:
· CV_CAP_PROP_POS_MSEC Current position of the video file in milliseconds or video capture timestamp.
· CV_CAP_PROP_POS_FRAMES 0-basedindex of the frame to be decoded/captured next.
· CV_CAP_PROP_POS_AVI_RATIO Relativeposition of the video file: 0 - start of the film, 1 - end of the film.
· CV_CAP_PROP_FRAME_WIDTH Width of theframes in the video stream.
· CV_CAP_PROP_FRAME_HEIGHT Height ofthe frames in the video stream.
· CV_CAP_PROP_FPS Frame rate.
· CV_CAP_PROP_FOURCC 4-character code of codec.
· CV_CAP_PROP_FRAME_COUNT Number of frames in the video file.
· CV_CAP_PROP_FORMAT Format ofthe Mat objects returned by retrieve() .
· CV_CAP_PROP_MODE Backend-specificvalue indicating the current capture mode.
· CV_CAP_PROP_BRIGHTNESS Brightness of the image (only for cameras).
· CV_CAP_PROP_CONTRAST Contrast of the image (only for cameras).
· CV_CAP_PROP_SATURATION Saturation of the image (only for cameras).
· CV_CAP_PROP_HUE Hue of theimage (only for cameras).
· CV_CAP_PROP_GAIN Gain of theimage (only for cameras).
· CV_CAP_PROP_EXPOSURE Exposure(only for cameras).
· CV_CAP_PROP_CONVERT_RGB Boolean flags indicating whether images should be converted to RGB.
· CV_CAP_PROP_WHITE_BALANCE Currently not supported
· CV_CAP_PROP_RECTIFICATION Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backendcurrently)
VideoCapture::set
VideoCapture类的set方法可以允许我们取出视频中某个位置的帧,它有一些参数,可以按时间,也可以按帧号,还可以按视频长短的比例。
1 | bool VideoCapture::set(int propId, double value) |
例子:
1 | // 第100帧 |
实例:
下面的是视频读取和将视频内的画面转化为图片的代码,里面的注释应该足够解释了。
1 |
|
结果:
读取后的图片,因为图片很多,上面代码在设置的时候,只读取了300帧