OpenCV成长之路(10):视频的处理
视频中包含的信息量要远远大于图片,对视频的处理分析也越来越成为计算机视觉的主流,而本质上视频是由一帧帧的图像组成,所以视频处理最终还是要归结于图像处理,但在视频处理中,有更多的时间维的信息可以利用。本文主要介绍OpenCV在处理视频时的一些基本函数。
一、视频帧的读取
OpenCV为视频的读入提供了一个类VideoCapture,下面我们说明一下类的几个重要的方法:
1,打开一段视频或默认的摄像头
有两种方法,一种是在定义类的时候,一种是用open()方法。
VideoCapture capture("../video.avi"); // 方法1
capture.open("../video.avi"); // 方法2
如果把文件名换为设置ID,则可打开摄像头,默认摄像头为0。
2,获取视频帧
获取视频帧可以有多种方法
// 方法一
capture.read(frame);
// 方法二
capture.grab();
capture.retrieve(frame);
// 方法三
capture>>frame;
3,获取视频的参数
一个视频有很多参数,比如:帧率、总帧数、尺寸、格式等,VideoCapture的get方法可以获取大量这些参数。
double rate=capture.get(CV_CAP_PROP_FPS); // 获取
long nFrame=static_cast<long>(capture.get(CV_CAP_PROP_FRAME_COUNT)); // 获取总帧数
更加相关的参数可以参考手册。
4,设置视频帧的读取位置
VideoCapture类的set方法可以允许我们取出视频中某个位置的帧,它有一些参数,可以按时间,也可以按帧号,还可以按视频长短的比例。
// 第100帧
double position=100.0;
capture.set(CV_CAP_PROP_POS_FRAMES,position);
// 第1e6毫秒
double position=1e6;
capture.set(CV_CAP_PROP_POS_MSEC,position);
// 视频1/2位置
double position=0.5;
capture.set(CV_CAP_PROP_POS_AVI_RATIO,position);
当然,set方法仅用于取视频帧的位置,还可以设置视频的帧率、亮度。
下面是一个将canny边缘检测应用于视频的程序:
int main()
{
VideoCapture capture("../track.avi");
if(!capture.isOpened())
return ;
double rate=capture.get(CV_CAP_PROP_FPS);
bool stop(false);
Mat frame; namedWindow("Canny Video");
int delay=/rate; while(!stop)
{
if(!capture.read(frame))
break;
Mat result;
Canny(frame,result,,);
threshold(result,result,,,THRESH_BINARY);
imshow("Canny Video",result); if(waitKey(delay)>=)
stop=true;
}
capture.release();
}
二、视频的写入
视频的写入与读取类似,OpenCV中是使用VideoWriter类来实现的,这个类有几个方法,都很简单。除了构造函数外,提供了open、IsOpen、write、和重载操作符<<
值得注意的是OpenCV里对视频的编码解码等支持并不是很良好,所以不要希望用这个类去实现摄像头图像的获取与转码,有兴趣的可以参考FFmpeg库。
VideoWriter::VideoWriter(const string& filename, int fourcc,
double fps, Size frameSize, bool isColor=true);
bool VideoWriter::open(const string& filename, int fourcc,
double fps, Size frameSize, bool isColor=true);
上面是类的构造函数与open方法,它们的参数相同,首先指定文件名,第二个参数是编码格式,OpenCV里提供了很多种的编码格式,如CV_FOURCC(‘P’,’I’,’M’,’1’)是MPEG-1格式,CV_FOURCC(‘M’,’G’,’P’,’G’)为motion-jpeg格式。
第三个参数为帧率,第4个参数为视频的尺寸大小。
VideoCapture capture("../track.avi");
double rate=capture.get(CV_CAP_PROP_FPS);
Size videoSize(capture.get(CV_CAP_PROP_FRAME_WIDTH),
capture.get(CV_CAP_PROP_FRAME_HEIGHT));
VideoWriter writer;
writer.open("../result.avi",CV_FOURCC('P','I','M',''),rate,
videoSize);
Mat frame;
capture>>frame;
writer<<frame;
OpenCV成长之路(10):视频的处理的更多相关文章
- OpenCV成长之路:图像直方图的应用
OpenCV成长之路:图像直方图的应用 2014-04-11 13:57:03 标签:opencv 图像 直方图 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否 ...
- OpenCV成长之路:图像滤波
http://ronny.blog.51cto.com/8801997/1394138 OpenCV成长之路:图像滤波 2014-04-11 14:28:44 标签:opencv 边缘检测 sobel ...
- OpenCV成长之路:直线、轮廓的提取与描述
http://ronny.blog.51cto.com/8801997/1394139 OpenCV成长之路:直线.轮廓的提取与描述 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 . ...
- linux小白成长之路10————SpringBoot项目部署进阶
[内容指引] war包部署: jar包部署: 基于Docker云部署. 一.war包部署 通过"云开发"平台初始化的SpringBoot项目默认采用jar形式打包,这也是我们推荐的 ...
- OpenCV成长之路(8):直线、轮廓的提取与描述
基于内容的图像分析的重点是提取出图像中具有代表性的特征,而线条.轮廓.块往往是最能体现特征的几个元素,这篇文章就针对于这几个重要的图像特征,研究它们在OpenCV中的用法,以及做一些简单的基础应用. ...
- OpenCV成长之路(6):数学形态学基本操作及其应用
数学形态学实际上可以理解为一种滤波行为,所以很多地方称它为形态学滤波.有了个这概念,我们就能更好的理解它.我们滤波中用的滤波器(kernel)在这里被称为结构元素,结构元素往往是由一个特殊的形状构成, ...
- OpenCV成长之路(4):图像直方图
一.图像直方图的概念 图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的.纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比. 图 ...
- python成长之路10
断点续传 python2.7 多继承 py35多继承 socketserver源码 支持并发处理socket i/o多路复用 上节回顾 socket ...
- OpenCV成长之路:图像直方图
http://ronny.blog.51cto.com/8801997/1394115 2014-04-11 13:47:27 标签:opencv 直方图 统计表 原创作品,允许转载,转载时请务必以超 ...
随机推荐
- Spring事务传播简介
一.事务传播属性(propagation) 1.REQUIRED,默认属性 此级别下,会为每一个调用的方法创建一个逻辑事务域,如果前面的方法已经创建了事务,那么后面的方法支持当前事务,如果当前没有事务 ...
- Java http方式提交短信到短信网关
URL url = new URL("短信网关url"); 一般短信内容需要用URLEncoder.encode()编码一下 HttpURLConnection httpCon = ...
- You Can Do Research Too
You Can Do Research Too I was recently discussing gatekeeping and the process of getting started in ...
- Using Flash Builder with Flash Professional
http://help.adobe.com/en_US/flashbuilder/using/WSc5cd04c102ae3e97-6e5d439512e1414e588-8000.html
- ecshop Admin后台商品列表处(上架、下架、精品...取消精品)增加操作
相关文件:goods.php,goods_list.htm 思路: a.增添连接“转移仓库” b.在goods.php,读取仓库列表数据,并且实例化 c. 在goods_list.htm循环数据.点击 ...
- Effective Objective-C 2.0 — 第9条:以“类族模式”隐藏实现细节
第9条:以“类族模式”隐藏实现细节 类族模式可以把实现细节隐藏在一套简单的公共接口后面 系统框架中经常使用类族 从类族的公共抽象基类中继承子类时要当心,若有开发文档,则应首先阅读 “类族”(class ...
- 本地计算机 上的 Redis Server 服务启动后停止
服务器上Redis服务安装正常..却启动不了.. 报错 : 本地计算机 上的 Redis Server 服务启动后停止.某些服务在未由其他服务或程序使用时将自动停止. 最后发现是Redis的配置 ...
- Redis for .NET 系列之实现分页需求
代码笔记: var tableName = "Table1"; redisClient.AddItemToSortedSet(tableName, ); redisClient.A ...
- 优酷土豆2014校园招聘笔试题目之Java开发类
先总体说下题型,共有20道选择题,4道简答题,3道编程题和1道扩展题,题目都比较简单,限时一小时完成. 一.选择题 选择题非常简单,都是基础题,什么死锁发生的条件.HashMap和HashSet查找插 ...
- AngularJS 国际化——Angular-translate
对于一个用户群面向全球的的应用来说,不得不考虑国际化的问题.当然,即便是刚刚起步的小应用,如果有心搞大,也应该提前设计国际化的方案. 本篇讲述使用AngularJS构建的应用的简单国际化方案,准确的说 ...