C++视频与图像的读写操作

最近在用C++编写工程代码,才发现自己的C++水平已经捉襟见肘,很多东西都要学习,今天就先总结一下利用opencv里面的VideoCapture和VideoWriter,以及std::vector<cv::Mat> 型变量与cv::Mat型变量的区别和数据交互。

cv::VideoCapture

一般来说,VideoCapture用于读取avi格式或mp4格式的视频,或者是从摄像头读取数据。

cv::VideoCapture capture(const string& filename);  // 从视频文件读取 
 cv::VideoCapture capture("C:/Users/DADA/DATA/gogo.avi");  // 从视频文件读取 

在创建对象时,有两张方法:

方式一:
cv::VideoCapture capture(const string& filename);
方式二:
cv::VideoCapture capture;
capture.open(const string& filename);

这样就打开了视频读取的流。当我们需要读取一张图片时,也有两种方法:

方式一:
cv::Mat frame;  
cap.read(frame); //读取方式一  
if(!frame.data){
	std::cout<<"frame extract error!!!"<<std::endl;
}
方式二:
cv::mat frame;
capture >> frame;

这个类别还有一个.get()函数,输入不同的参量就会得到视频的各种属性,如得到帧率:

capture.get(CV_CAP_PROP_FPS); //获取帧率

VideoCapture.get(0)		CV_CAP_PROP_POS_MSEC	视频文件的当前位置(播放)以毫秒为单位
VideoCapture.get(1)		CV_CAP_PROP_POS_FRAMES	基于以0开始的被捕获或解码的帧索引
VideoCapture.get(2)		CV_CAP_PROP_POS_AVI_RATIO	视频文件的相对位置(播放):0=电影开始,1=影片的结尾
VideoCapture.get(3)		CV_CAP_PROP_FRAME_WIDTH	在视频流的帧的宽度
VideoCapture.get(4)		CV_CAP_PROP_FRAME_HEIGHT	在视频流的帧的高度
VideoCapture.get(5)		CV_CAP_PROP_FPS	帧速率/帧数/fps
VideoCapture.get(6)		CV_CAP_PROP_FOURCC	编解码的4字-字符代码
VideoCapture.get(7)		CV_CAP_PROP_FRAME_COUNT	视频文件中的帧数
VideoCapture.get(8)		CV_CAP_PROP_FORMAT	返回对象的格式
VideoCapture.get(9)		CV_CAP_PROP_MODE	返回后端特定的值,该值指示当前捕获模式
VideoCapture.get(10)	CV_CAP_PROP_BRIGHTNESS	图像的亮度(仅适用于照相机)
VideoCapture.get(11)	CV_CAP_PROP_CONTRAST	图像的对比度(仅适用于照相机)
VideoCapture.get(12)	CV_CAP_PROP_SATURATION	图像的饱和度(仅适用于照相机)
VideoCapture.get(13)	CV_CAP_PROP_HUE	色调图像(仅适用于照相机)
VideoCapture.get(14)	CV_CAP_PROP_GAIN	图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升)
VideoCapture.get(15)	CV_CAP_PROP_EXPOSURE	曝光(仅适用于照相机)
VideoCapture.get(16)	CV_CAP_PROP_CONVERT_RGB	指示是否应将图像转换为RGB布尔标志
VideoCapture.get(17)	CV_CAP_PROP_WHITE_BALANCE	× 暂时不支持
VideoCapture.get(18)	CV_CAP_PROP_RECTIFICATION	立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能)

cv::VideoWriter

cv::VideoWritor也是一样的操作,打开方式也是有两种:

方式一:
cv::VideoWriter wrt(		
		"my_video.mpg", //输出文件名
		CV_FOURCC('D','I','V','X'), // MPEG-4 编码
		30.0, // 帧率 (FPS)
		cv::Size( 640, 480 ), // 单帧图片分辨率为 640x480
		true // 只输入彩色图
		);
方式二:
cv::VideoWriter wrte;
wrt.open(		
		"my_video.mpg", //输出文件名
		CV_FOURCC('D','I','V','X'), // MPEG-4 编码
		30.0, // 帧率 (FPS)
		cv::Size( 640, 480 ), // 单帧图片分辨率为 640x480
		true // 只输入彩色图
		);

但是目前我只了解到了一种写入的方式:

cv::Mat frame
wrte << frame

std::vector<cv::Mat> 与cv::Mat

根据我现在的了解,这两者的区别主要在于“类型不同,无法直接传值”,并且cv::Mat无法像前者一样调用vector的一些函数,比如.clean()等等。
但是也有传值的办法:

 std::vector<cv::Mat> frame1;
  cv::Mat frame2;
  frame1.push_back(frame2.clone());

如果我们想在一个函数里面一直读取视频流的一帧图片,那么我们就必须要在读帧之前清除存放图片的变量中包含的上一张图片的信息,这个时候,我们用std::vector<cv::Mat>会好一点,因为可以直接调用.clear()函数,然后再把数据读取到cv::Mat里面,再用push_back进行数据的赋值。

 std::vector<cv::Mat> frame1
cv::Mat frame2;  
cap.read(frame2); //读取方式一  
if(!frame2.data){
	std::cout<<"frame extract error!!!"<<std::endl;
}
 frame1.clear();
 frame1.push_back(frame2.clone());
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值