最近在用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());