Python OpenCV读取显示视频的方法示例


Posted in Python onFebruary 20, 2020

目标

  • 学习读取视频,显示视频和保存视频。
  • 学习从相机捕捉并显示它。
  • 你将学习以下功能: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为True
  if not ret:
    print("Can't receive frame (stream end?). Exiting ...")
    break
  # 我们在框架上的操作到这里
  gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
  # 显示结果帧e
  cv.imshow('frame', gray)
  if cv.waitKey(1) == ord('q'):
    break
# 完成所有操作后,释放捕获器
cap.release()
cv.destroyAllWindows()

cap.read()返回布尔值(True/ False)。如果正确读取了帧,它将为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为True
  if not ret:
    print("Can't receive frame (stream end?). Exiting ...")
    break
  gray = 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 ...")
    break
  frame = cv.flip(frame, 0)
  # 写翻转的框架
  out.write(frame)
  cv.imshow('frame', frame)
  if cv.waitKey(1) == ord('q'):
    break
# 完成工作后释放所有内容
cap.release()
out.release()
cv.destroyAllWindows()

到此这篇关于 Python OpenCV读取显示视频的方法示例的文章就介绍到这了,更多相关 Python OpenCV读取显示视频内容请搜素三水点靠木以前的文章或下面相关文章,希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python抓取网页图片示例(python爬虫)
Apr 27 Python
python中的reduce内建函数使用方法指南
Aug 31 Python
Python实现遍历windows所有窗口并输出窗口标题的方法
Mar 13 Python
详解Python的collections模块中的deque双端队列结构
Jul 07 Python
Python书单 不将就
Jul 11 Python
numpy自动生成数组详解
Dec 15 Python
Python实现矩阵加法和乘法的方法分析
Dec 19 Python
解决PyCharm控制台输出乱码的问题
Jan 16 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
Apr 23 Python
Django Rest framework认证组件详细用法
Jul 25 Python
Django ModelForm组件原理及用法详解
Oct 12 Python
解决numpy和torch数据类型转化的问题
May 23 Python
基于spring boot 日志(logback)报错的解决方式
Feb 20 #Python
Django使用Celery加redis执行异步任务的实例内容
Feb 20 #Python
python logging.basicConfig不生效的原因及解决
Feb 20 #Python
Python3 shutil(高级文件操作模块)实例用法总结
Feb 19 #Python
python logging设置level失败的解决方法
Feb 19 #Python
Python实现病毒仿真器的方法示例(附demo)
Feb 19 #Python
python内打印变量之%和f的实例
Feb 19 #Python
You might like
中国站长站 For Dede4.0 采集规则
2007/05/27 PHP
供参考的 php 学习提高路线分享
2011/10/23 PHP
Redis构建分布式锁
2017/03/28 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析
2019/12/11 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
jquery.fileEveryWhere.js 一个跨浏览器的file显示插件
2011/10/24 Javascript
20个最新的jQuery插件
2012/01/13 Javascript
JavaScript的arguments对象应用示例
2014/09/15 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
2015/12/31 Javascript
jQuery轻松实现无缝轮播效果
2017/03/22 jQuery
ionic实现底部分享功能
2017/05/11 Javascript
webpack打包单页面如何引用的js
2017/06/07 Javascript
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
2017/09/07 Javascript
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
vue 使用Jade模板写html,stylus写css的方法
2018/02/23 Javascript
element-ui表格数据转换的示例代码
2018/08/24 Javascript
微信小程序文章详情页跳转案例详解
2019/07/09 Javascript
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
快速解决Vue、element-ui的resetFields()方法重置表单无效的问题
2020/08/12 Javascript
[49:54]Ti4 循环赛第三日 LGD vs Titan
2014/07/12 DOTA
[03:18]DOTA2亚洲邀请赛小组赛第一日 RECAP赛事回顾
2015/01/30 DOTA
python3.5实现socket通讯示例(TCP)
2017/02/07 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
2018/02/03 Python
在Python中,不用while和for循环遍历列表的实例
2019/02/20 Python
Python 实现PS滤镜的旋涡特效
2020/12/03 Python
CSS3实现水平居中、垂直居中、水平垂直居中的实例代码
2020/02/27 HTML / CSS
html5记忆翻牌游戏实现思路及代码
2013/07/25 HTML / CSS
HTML5的一个显示电池状态的API简介
2015/06/18 HTML / CSS
前端H5 Video常见使用场景简介
2020/08/21 HTML / CSS
印度尼西亚电子产品购物网站:Kliknklik
2018/06/05 全球购物
行政助理岗位职责
2013/11/10 职场文书
招标承诺书
2014/08/30 职场文书
党课心得体会范文
2014/09/09 职场文书
音乐之声音乐广播稿
2014/09/10 职场文书
超市工作总结范文2014
2014/12/19 职场文书