OpenCV3和OpenCV2类似,视频的读、写操作,分别通过下面两个类来实现:cv::VideoCapture和cv::VideoWriter两个类来实现。
1.VideoCapture类的构造函数:
C++: VideoCapture::VideoCapture()
C++: VideoCapture::VideoCapture(const string& filename)
C++: VideoCapture::VideoCapture(int device)
功能:创建一个VideoCapture类的实例,如果传入对应的参数,可以直接打开视频文件或者要调用的摄像头。
参数:
filename – 打开的视频文件名。
device – 打开的视频捕获设备id ,如果只有一个摄像头可以填0,表示打开默认的摄像头。
2.VideoCapture::open
功能:打开一个视频文件或者打开一个捕获视频的设备(也就是摄像头)
C++: bool VideoCapture::open(const string& filename)
C++: bool VideoCapture::open(int device)
参数:
filename – 打开的视频文件名。
device – 打开的视频捕获设备id ,如果只有一个摄像头可以填0,表示打开默认的摄像头。
通过对VideoCapture类的构造函数和open函数分析,可以发现opencv读入视频的方法一般有如下两种。比如读取当前目录下名为"dog.avi"的视频文件,那么这两种写法分别如下。
(1)先实例化再初始化:
VideoCapture capture;
capture.open("test1.mp4");
(2)在实例化的同时进行初始化:
VideoCapture("dog.avi");
3.VideoCapture::isOpened
C++: bool VideoCapture::isOpened()
功能:判断视频读取或者摄像头调用是否成功,成功则返回true。
4.VideoCapture::release
C++: void VideoCapture::release()
功能:关闭视频文件或者摄像头。
5.VideoCapture::grab
C++: bool VideoCapture::grab()
功能:从视频文件或捕获设备中抓取下一个帧,假如调用成功返回true。(细 节请参考opencv文档说明)
6.VideoCapture::retrieve
C++: bool VideoCapture::retrieve(Mat& image, int channel=0)
功能:解码并且返回刚刚抓取的视频帧,假如没有视频帧被捕获(相机没有连接或者视频文件中没有更多的帧)将返回false。
7.VideoCapture::read
C++: VideoCapture& VideoCapture::operator>>(Mat& image)
C++: bool VideoCapture::read(Mat& image)
功能:该函数结合VideoCapture::grab()和VideoCapture::retrieve()其中之一被调用,用于捕获、解码和返回下一个视频帧这是一个最方便的函数对于读取视频文件或者捕获数据从解码和返回刚刚捕获的帧,假如没有视频帧被捕获(相机没有连接或者视频文件中没有更多的帧)将返回false。
从上面的API中我们会发现获取视频帧可以有多种方法 :
// 方法一
capture.read(frame);
// 方法二
capture.grab();
// 方法三
capture.retrieve(frame);
// 方法四
capture >> frame;
8.VideoCapture::get
C++: double VideoCapture::get(int propId)
功能:一个视频有很多属性,比如:帧率、总帧数、尺寸、格式等,VideoCapture的get方法可以获取这些属性。
参数:属性的ID。
属性的ID可以是下面的之一:
员函数set(),设定相应属性的值。cv::VideoCapture中提供的属性标识如下:
CV_CAP_PROP_POS_MSEC 视频当前点的毫秒值或视频捕捉的时间戳
CV_CAP_PROP_POS_FRAMES 下次将被捕获的0基索引的帧
CV_CAP_PROP_POS_AVI_RATIO 视频文件的相关位置 : 0 - start of the film, 1 - end of the film.
CV_CAP_PROP_FRAME_WIDTH 视频流帧的宽度
CV_CAP_PROP_FRAME_HEIGHT 视频流帧的高.
CV_CAP_PROP_FPS 帧率.
CV_CAP_PROP_FOURCC 4字符编码的编码器.
CV_CAP_PROP_FRAME_COUNT 视频文件的帧数.
CV_CAP_PROP_FORMAT 由retrieve()返回矩阵对象的格式(CV_U8C3) .
CV_CAP_PROP_MODE 后端指定值指示当前捕捉的模式.
CV_CAP_PROP_BRIGHTNESS 图像亮度(只对摄像头).
CV_CAP_PROP_CONTRAST 图像对比度(only for cameras).
CV_CAP_PROP_SATURATION 图像饱和度(only for cameras).
CV_CAP_PROP_HUE 色调(only for cameras).
CV_CAP_PROP_GAIN 增益(only for cameras).
CV_CAP_PROP_EXPOSURE 曝光(only for cameras).
CV_CAP_PROP_CONVERT_RGB 布尔型标记图像是否应该被转换为RGB.
CV_CAP_PROP_WHITE_BALANCE 白平衡(only for cameras)
CV_CAP_PROP_RECTIFICATION 立体相机的矫正标记(note: only supported by DC1394 v 2.x backend currently)
Note: 当检索到一个不被VideoCapture类后端支持的特性,返回0值.
VideoCapture::set基本与VideoCapture::get相同。
.VideoCapture::set
C++: bool VideoCapture::set(int propertyId, double value)
功能:设置VideoCapture类的属性,设置成功返回ture,失败返回false。
参数:第一个是属性ID,第二个是该属性要设置的值。
属性ID如下:
CV_CAP_PROP_POS_MSEC 视频当前点的毫秒值或视频捕捉的时间戳
CV_CAP_PROP_POS_FRAMES 下次将被捕获的0基索引的帧
CV_CAP_PROP_POS_AVI_RATIO 视频文件的相关位置 : 0 - start of the film, 1 - end of the film.
CV_CAP_PROP_FRAME_WIDTH 视频流帧的宽度
CV_CAP_PROP_FRAME_HEIGHT 视频流帧的高.
CV_CAP_PROP_FPS 帧率.
CV_CAP_PROP_FOURCC 4字符编码的编码器.
CV_CAP_PROP_FRAME_COUNT 视频文件的帧数.
CV_CAP_PROP_FORMAT 由retrieve()返回矩阵对象的格式(CV_U8C3) .
CV_CAP_PROP_MODE 后端指定值指示当前捕捉的模式.
CV_CAP_PROP_BRIGHTNESS 图像亮度(只对摄像头).
CV_CAP_PROP_CONTRAST 图像对比度(only for cameras).
CV_CAP_PROP_SATURATION 图像饱和度(only for cameras).
CV_CAP_PROP_HUE 色调(only for cameras).
CV_CAP_PROP_GAIN 增益(only for cameras).
CV_CAP_PROP_EXPOSURE 曝光(only for cameras).
CV_CAP_PROP_CONVERT_RGB 布尔型标记图像是否应该被转换为RGB.
CV_CAP_PROP_WHITE_BALANCE 白平衡(only for cameras)
CV_CAP_PROP_RECTIFICATION 立体相机的矫正标记(note: only supported by DC1394 v 2.x backend currently)
Note: 当检索到一个不被VideoCapture类后端支持的特性,返回0值.
10、视频的写操作cv::VideoWriter
cv::VideoWriter对象的创建有两种方式,第一种是使用构造函数的形式,第二种使用open()的方式,具体如下:
cv::VideoWriter out(
const string& filename, // 输入文件名
int fourcc, // 编码形式,使用 CV_FOURCC()宏
double fps, // 输出视频帧率
cv::Size frame_size, // 单帧图片的大小
bool is_color = true // 如果是false,可传入灰度图像
);
cv::VideoWriter out;
out.open(
"my_video.mpg", //输出文件名
CV_FOURCC('D', 'I', 'V', 'X'), // MPEG-4 编码
30.0, // 帧率 (FPS)
cv::Size(640, 480), // 单帧图片分辨率为 640x480
true // 只输入彩色图
);
同样,向创建后的cv::VideoWriter对象写入图像也有两种方式,即write()操作和“<<”操作:
cv::VideoWriter::write(
const Mat& image // 写入图像作为下一帧
);
my_video_writer << my_frame;