转载请注明出处:http://blog.csdn.net/autocyz/article/details/44099179
opencv2中,提供了两个视频操作相关的类,VideoCapture和VideoWriter,当然也有相对应的构造函数。
对于VideoCapture,其有如下几个操作函数:
open(const string &filename) //打开视频文件
open(int device) //打开摄像头,device为设备序号
isOpened() //判断视频文件或者摄像头是否打开,其返回值为bool型
release() //关闭视频文件或者摄像头
grab() //获取视频或者摄像头下一帧,若获取成功,则返回TRUE,其函数类型也是bool型。
retrieve(Mat& image , int channel=()) //解码刚刚获取到的一帧图像,并将其赋给image,这个函数的返回值也是bool型。
read(Mat& image) //获取、解码和读取视频的下一帧。在opencv中,其用“>>”操作符重载了这个函数,即 video >> image
get(int propId) //返回视频的属性
propId取值不同,则返回的属性也不同。当propId取如下值时:
CV_CAP_PROP_POS_MSEC 以毫秒或者时间戳的形式当前视频文件的位置
CV_CAP_PROP_POS_FRAMES 以0开始的视频帧解码捕获索引
CV_CAP_PROP_POS_AVI_RATIO 视频的相对位置,0为开始,1为结束
CV_CAP_PROP_FRAME_WIDTH 视频帧图片的宽度
CV_CAP_PROP_FRAME_HEIGHT 视频帧图片的高度
CV_CAP_PROP_FPS 帧率
CV_CAP_PROP_FOURCC 视频的四字符代码
CV_CAP_PROP_FRAME_COUNT 视频的总帧数
CV_CAP_PROP_FORMAT 视频的图片格式
CV_CAP_PROP_MODE 后端特定值指示当前捕获模式
下面几个属性只在摄像模式下有效:
CV_CAP_PROP_BRIGHTNESS 图像的亮度
CV_CAP_PROP_CONTRAST 图像对比度
CV_CAP_PROP_SATURATION 图像的饱和度
CV_CAP_PROP_HUE 图像的色度
CV_CAP_PROP_EXPOSURE 图像的曝光
CV_CAP_PROP_CONVERT_RGB图像是否转换为RGB型
set(int propId) //设置属性,其参数的取值和get函数的取值一样
对于VideoWriter,其有如下几个操作函数:
open(const string &filename, int fourcc, double fps, Size frameSize, color = true)
以上几个参数在上文中均已经介绍过了。
isOpened() //与前面的是一个意思
write(const Mat& image) //opencv中也同样重载了这个函数,即用操作符<<
下面看段程序,程序的功能是将一个段视频变小,即原来1024*780的视频,变为320*280,为了多使用几个视频操作函数,所以有些地方可以大大简化或者修改的我没有修改,为了展示一下各个函数的用法。
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include
#include
#include
using namespace std;
using namespace cv;
int main(int argc, const char** argv)
{
Mat frame;
VideoCapture video;
VideoWriter markVideo;
double fourcc, fps, width, height;
video.open("25.avi"); //打开视频
fourcc = video.get(CV_CAP_PROP_FOURCC);
fps = video.get(CV_CAP_PROP_FPS);
width = video.get(CV_CAP_PROP_FRAME_WIDTH);
height = video.get(CV_CAP_PROP_FRAME_HEIGHT); //得到视频的一些参数
//新建一个新的视频
markVideo.open("markVideo10.avi", fourcc, fps);
if (video.isOpened() && markVideo.isOpened() )
{
while(true){
video >> frame; //读取视频的每一个帧
resize(frame, frame, Size(320, 280)); //将视频的每一帧都缩小
if (!frame.empty()){
markVideo << frame; //将缩小后的每一个帧都写进新的视频
}
else{printf(" --(!) No captured frame -- Break!"); break;}
if ((char)waitKey(1) == 'c') {
video.release(); markVideo.release();
break;
}
}
}
return 0;
}