【opencv2】对视频的操作
opencv2中,提供了两个视频操作相干的类,VideoCapture和VideoWriter,固然也有相对应的构造函数。 对VideoCapture,其有以下几个操作函数: open(const string &filename) //打开视频文件 open(int device) //打开摄像头,device为装备序号 isOpened() //判断视频文件或摄像头是不是打开,其返回值为bool型 release() //关闭视频文件或摄像头 grab() //获得视频或摄像头下1帧,若获得成功,则返回TRUE,其函数类型也是bool型。 retrieve(Mat& image , int channel=()) //解码刚刚获得到的1帧图象,并将其赋给image,这个函数的返回值也是bool型。 read(Mat& image) //获得、解码和读取视频的下1帧。在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 视频的4字符代码 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函数的取值1样
对VideoWriter,其有以下几个操作函数: open(const string &filename, int fourcc, double fps, Size frameSize, color = true) 以上几个参数在上文中均已介绍过了。 isOpened() //与前面的是1个意思 write(const Mat& image) //opencv中也一样重载了这个函数,即用操作符<<
下面看段程序,程序的功能是将1个段视频变小,即原来1024*780的视频,变成320*280,为了多使用几个视频操作函数,所以有些地方可以大大简化或修改的我没有修改,为了展现1下各个函数的用法。 #include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
int main(int argc,const char** argv)
{
Mat frame;
VideoCapture video;
VideoWriter newVideo;
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); //得到视频的1些参数
//新建1个新的视频
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;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |