【OpenCV3】视频读写——cv::VideoCapture和cv::VideoWriter详解

OpenCV3和OpenCV2类似,视频的读、写操作,分别通过cv::VideoCapture和cv::VideoWriter两个类来实现。


1、视频的读取操作cv::VideoCapture

cv::VideoCapture既支持视频文件的读取,也支持从摄像机中视频的读取。cv::VideoCapture对象的创建方式有以下三种:

	cv::VideoCapture capture(
	const string& filename, // 输入文件名
	);
	cv::VideoCapture capture(
	int device // 视频捕捉设备 id
	);
	cv::VideoCapture capture();


第一种方式是从文件(.MPG或.AVI格式)中读取视频,对象创建以后,OpenCV将会打开文件并做好准备读取它,如果打开成功,我们将可以开始读取视频的帧,并且cv::VideoCapture的成员函数isOpened()将会返回true(建议在打开视频或摄像头时都使用该成员函数判断是否打开成功)。

第二种方式是从摄像机中读取视频,这种情况下,我们会给出一个标识符,用于表示我们想要访问的摄像机,及其与操作系统的握手方式。对于摄像机而言,这个标志符就是一个标志数字——如果只有1个摄像机,那么就是0,如果系统中有多个摄像机,那么只要将其向上增加即可。标识符另外一部分是摄像机域(camera domain),用于表示摄像机的类型,这个域值可以是下面任一预定义常量。


以这种方式创建视频捕获对象时,我们所传递的标识符是域索引和摄像机索引的和。例如:

cv::VideoCapture capture(cv::CAP_IEEE1394 + 1);

这个例子中cv::VideoCapture将尝试打开第2个(编号从0开始)1394摄像机。多数情况下,由于我们只有一个摄像机,因此没必要指定摄像机的域,此时使用cv::CAP_ANY是一种高效的方式(也即是0,所以不用特意指定)。

第三种方式仅仅创建一个捕获对象,而不提供任何关于打开的信息。创建以后通过成员函数open()来设定打开的信息。open()操作也有以上两种方式。

	cv::VideoCapture cap;
	cap.open( "my_video.avi" );

将视频帧读取到cv::Mat矩阵中,有两种方式:一种是read()操作;另一种是 “>>”操作。

	cv::Mat frame;
	cap.read(frame); //读取方式一
	cap >> frame; //读取方式二

下面是读取视频并显示的示例代码:

#include <opencv2/opencv.hpp>
#include <iostream>

void video_capture_test()
{
	cv::VideoCapture capture("test.mp4");

	if (!capture.isOpened())
	{
		std::cout << "Read video Failed !" << std::endl;
		return;
	}

	cv::Mat frame;
	cv::namedWindow("video test");

	int frame_num = capture.get(cv::CAP_PROP_FRAME_COUNT);
	std::cout << "total frame number is: " << frame_num << std::endl;

	for (int i = 0; i < frame_num - 1; ++i)
	{
		capture >> frame;
		//capture.read(frame); 第二种方式
		imshow("video test", frame);
		if (cv::waitKey(30) == 'q')
		{
			break;
		}
	}

	cv::destroyWindow("video test");
	capture.release();
	return;
}

上面的代码,我们使用了cv::VideoCapture的成员函数get()并设定标识cv::CAP_PROP_FRAME_COUNT获取了读取视频的帧总数。同样,我们可以指定其他标识,来获取读取视频或摄像头的其他属性。另外,我们也可以使用成员函数set(),设定相应属性的值。cv::VideoCapture中提供的属性标识如下图所示。



2、视频的写操作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;


2017.03.30

  • 27
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值