目标

  • 学习读取视频,显示视频和保存视频。

  • 学习从相机捕捉并显示它。

  • 你将学习以下功能:cv.VideoCapture(),cv.VideoWriter()

从相机中读取视频

通常情况下,我们必须用摄像机捕捉实时画面。提供了一个非常简单的界面。让我们从摄像头捕捉一段视频(我使用的是我笔记本电脑内置的网络摄像头) ,将其转换成灰度视频并显示出来。只是一个简单的任务开始。

要捕获视频,你需要创建一个 VideoCapture 对象。它的参数可以是设备索引或视频文件的名称。设备索引就是指定哪个摄像头的数字。正常情况下,一个摄像头会被连接(就像我的情况一样)。所以我简单地传0(或-1)。你可以通过传递1来选择第二个相机,以此类推。在此之后,你可以逐帧捕获。但是在最后,不要忘记释放俘虏。

import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
if not cap.isOpened():print("Cannot open camera")exit()
while True:# 逐帧捕获ret, frame = cap.read()# 如果正确读取帧,ret为Trueif not ret:print("Can't receive frame (stream end?). Exiting ...")break# 我们在框架上的操作到这里gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)# 显示结果帧ecv.imshow('frame', gray)if cv.waitKey(1) == ord('q'):break
# 完成所有操作后,释放捕获器
cap.release()
cv.destroyAllWindows()

cap.read()返回布尔值(TrueFalse)。如果正确读取了帧,它将为True。因此,你可以通过检查此返回值来检查视频的结尾。

有时,cap可能尚未初始化捕获。在这种情况下,此代码显示错误。你可以通过cap.isOpened()方法检查它是否已初始化。如果是True,那么确定。否则,使用cap.open()打开它。

你还可以使用cap.get(propId)方法访问该视频的某些功能,其中propId是0到18之间的一个数字。每个数字表示视频的属性(如果适用于该视频),并且可以显示完整的详细信息在这里看到:cv::VideoCapture::get()。其中一些值可以使用cap.set(propId,value)进行修改。value是你想要的新值。

例如,我可以通过cap.get(cv.CAP_PROP_FRAME_WIDTH)cap.get(cv.CAP_PROP_FRAME_HEIGHT)检查框架的宽度和高度。默认情况下,它的分辨率为640x480。但我想将其修改为320x240。只需使用和即可。ret = cap.set(cv.CAP_PROP_FRAME_WIDTH,320) and ret = cap.set(cv.CAP_PROP_FRAME_HEIGHT,240).

注意
如果出现错误,请确保使用任何其他相机应用程序(例如Linux中的Cheese)都可以正常使用相机。

从文件播放视频

它与从相机捕获相同,只是用视频文件名更改摄像机索引。另外,在显示框架时,请使用适当的时间cv.waitKey()。如果太小,则视频将非常快,而如果太大,则视频将变得很慢(嗯,这就是显示慢动作的方式)。正常情况下25毫秒就可以了。

import numpy as np
import cv2 as cv
cap = cv.VideoCapture('vtest.avi')
while cap.isOpened():ret, frame = cap.read()# 如果正确读取帧,ret为Trueif not ret:print("Can't receive frame (stream end?). Exiting ...")breakgray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)cv.imshow('frame', gray)if cv.waitKey(1) == ord('q'):break
cap.release()
cv.destroyAllWindows()

注意
确保安装了正确的 ffmpeg 或 gstreamer 版本。有时,使用视频捕获(Video Capture)是一件令人头疼的事情,主要原因是错误地安装了 ffmpeg / gstreamer。

保存视频

所以我们捕捉一个视频,一帧一帧地处理,我们想要保存这个视频。对于图像,它非常简单,只需使用 cv.imwrite()。这里还需要做一些工作。

这次我们创建一个 VideoWriter 对象。我们应该指定输出文件名(例如: output.avi)。然后我们应该指定 FourCC 代码(详见下一段)。然后传递帧率的数量和帧大小。最后一个是颜色标志。如果为 True,编码器期望颜色帧,否则它与灰度帧一起工作。

FourCC:http://en.wikipedia.org/wiki/FourCC 是用于指定视频编解码器的4字节代码。可用代码列表可在fourcc.org中:http://www.fourcc.org/codecs.php 找到。它取决于平台。遵循编解码器对我来说效果很好。

  • 在Fedora中:DIVX,XVID,MJPG,X264,WMV1,WMV2。(最好使用XVID。MJPG会生成大尺寸的视频。X264会生成非常小的尺寸的视频)

  • 在Windows中:DIVX(尚待测试和添加)

  • 在OSX中:MJPG(.mp4),DIVX(.avi),X264(.mkv)。

FourCC代码作为MJPG的cv.VideoWriter_fourcc('M','J','P','G')or cv.VideoWriter_fourcc(*'MJPG')传递。

在从摄像机捕获的代码下面,沿垂直方向翻转每一帧并保存。

import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
# 定义编解码器并创建VideoWriter对象
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640,  480))
while cap.isOpened():ret, frame = cap.read()if not ret:print("Can't receive frame (stream end?). Exiting ...")breakframe = cv.flip(frame, 0)# 写翻转的框架out.write(frame)cv.imshow('frame', frame)if cv.waitKey(1) == ord('q'):break
# 完成工作后释放所有内容
cap.release()
out.release()
cv.destroyAllWindows()

其他资源

☆☆☆为方便大家查阅,小编已将OpenCV-Python专栏文章统一整理到公众号底部菜单栏,同步更新中,关注公众号,点击左下方“文章”,如图:

或点击下方“阅读原文”,进入OpenCV-Python专栏,即可查看系列文章。

不断更新资源

获取更多精彩

长按二维码扫码关注

视频处理入门 | 六相关推荐

  1. 视频教程-PHP7入门手册视频版第六季 PSR 标准规范-PHP

    PHP7入门手册视频版第六季 PSR 标准规范 2009年4月创办 淄博日诺网络科技有限公司 法人总经理 2016年负责 中国传媒大学凤凰学院 网站开发 项目负责人 2017年 参与负责 用友软件理财 ...

  2. Docker入门六部曲——服务

    原文链接:http://www.dubby.cn/detail.html?id=8735 准备 已经安装好Docker 1.13或者以上的版本. 安装好Docker Compose.如果你是用的是Do ...

  3. WordPress 建站教程新手入门六主题使用 营销值得学

    作者:营销值得学 WordPress较受欢迎的原因就是拥有众多的主题模板,包含有常见的博客主题/ 淘宝客主题/企业主题/CMS主题/图片主题/视频主题等等,单是 营销值得学 免费分享的WordPres ...

  4. Android音视频学习系列(六) — 掌握视频基础知识并使用OpenGL ES 2.0渲染YUV数据

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

  5. 音视频开发入门(4):视频编解码之预测技术介绍

    上一节的图中有一个表示显示的图像序列与编码序列是不同的,不知道大家注意到没有,这个图很重要,编码是有固定规则的,视屏播放时,并不是按照各帧达到顺序播放的,而是按照这个规则进行播放. 前言 即时通讯应用 ...

  6. 音视频开发入门(3):视频编解码之编码基础

    前言 即时通讯应用中的实时音视频技术,几乎是IM开发中的最后一道高墙.原因在于:实时音视频技术 = 音视频处理技术 + 网络传输技术 的横向技术应用集合体,而公共互联网不是为了实时通信设计的.有关实时 ...

  7. Docker入门六部曲——Swarm

    原文链接:http://www.dubby.cn/detail.html?id=8738 准备工作 安装Docker(版本最低1.13). 安装好Docker Compose,上一篇文章介绍过的. 安 ...

  8. Docker入门六部曲——Stack

    原文链接:http://www.dubby.cn/detail.html?id=8739 准备知识 安装Docker(版本最低1.13). 阅读完Docker入门六部曲--Swarm,并且完成其中介绍 ...

  9. Android 音视频开发入门指南

    最近收到很多网友通过邮件或者留言说想学习音视频开发,该如何入门,我今天专门写篇文章统一回复下吧. 音视频这块,目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的,希望我后面能挤出时间整 ...

最新文章

  1. java jdk 8u111_8u111-jdk-alpine在java开发中的NullPointerException错误解决方案
  2. Centos7上安装oracle11g/12c的安装教程推荐及注意事项
  3. 【Python】Python视频制作工具Manim入门,基础形状详细介绍
  4. ITK:Levenberg-Marquardt优化
  5. VTK:PolyData之PointsProjectedHull
  6. python字符串能减吗_在python中减去两个字符串(Subtract two strings in python)
  7. 微信支付开放平台_有了开放数据,您终于可以得到这些年来所支付的费用
  8. [考研]考研倒计时第8天
  9. 罗永浩机场与人发生争执!疑似新机遭偷拍?网友称:这炒作满分
  10. weex scroller
  11. python软件下载对电脑配置要求-python3批量统计用户电脑配置
  12. 服务链路追踪配置mysql_学习微服务的服务链路追踪——Spring Cloud Sleuth+zipkin
  13. [笔记]使用API函数 GetACP 获取Windows系统当前代码页
  14. 程序员锁死服务器导致公司倒闭,案件终于开庭了
  15. Ubuntu解决包依赖关系
  16. Linux入门系列课程一
  17. 二十余岁时的社会观(三)
  18. Weka中数据挖掘与机器学习系列之Exploer界面(七)
  19. 【21天算法学习】折半插入排序
  20. 学习笔记(08):区块链应用案例-区块链商业应用-供应链管理

热门文章

  1. js判断字符串是否包含中文或英文
  2. 如何用MATLAB叠加傅里叶级数,傅里叶级数展开matlab实现
  3. mysql事务锁死_mysql事务里锁死
  4. 那些优秀的软件架构图,都是怎么画的?
  5. trim()方法的使用
  6. C++ QT开发人机象棋(评估函数)
  7. torchtext中文文本预处理使用流程文档
  8. setTimeout 的黑魔法
  9. 数据库date日期转String类型
  10. 谷歌SEO优化八步走