Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度


Posted in Python onApril 14, 2022

前几天有个读者在粉丝群里面提了一个问题:

Python 怎样提高视频清晰度和对比度?

我之前没有涉及到使用 Python 操作视频这一方面,所以当时很抱歉地跟读者朋友说暂未涉及。

这两天想了下,感觉应该补一下这一块的内容,一方面是增加自己涉猎的广度,另一方面也可以给粉丝答疑解惑。

今天先分享一下 Python 操作视频最基本的操作,包括读取和播放视频和保存视频。

读取视频

要捕获视频,你需要创建一个 VideoCapture 对象。它的参数可以是设备索引或视频文件的名称。所以,我们读取视频有两种方式,分别是从相机中读取视频和从文件中读取视频。

从相机中读取视频

对于有摄像头的设备,例如带摄像头的笔记本电脑,我们可以直接调起电脑的摄像头,读取摄像头的视频流。

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:
        break
    # 显示结果帧
    cv.imshow('frame', frame)
    if cv.waitKey(1) == ord('q'):
        break
# 完成所有操作后,释放捕获器
cap.release()
cv.destroyAllWindows()

这里我向 VideoCapture 对象传入了参数 0,表示设备索引,设备索引就是指定哪个摄像头的数字。正常情况下,一个摄像头会被连接(就像我的情况一样)。所以我简单地传0。你可以通过传递1来选择第二个相机,以此类推。

cap.isOpened() 用来判断是否捕获到视频。

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

cv.imshow 方法用来显示视频的帧。我们播放视频的原理就是逐帧播放。

在最后,不要忘记通过 cap.release() 释放俘虏。

运行这段代码,你就可以看到一个弹窗实时地播放你电脑摄像头中的图像了。

从文件中播放视频

与从相机捕获相同,只是用视频文件名更改摄像机索引。

另外,在显示视频时,可以通过 cv.waitKey() 来控制视频播放的速度。如果设置太小,则视频将非常快,相当于倍速播放;而如果太大,则视频将变得很慢,相当于延迟播放。正常情况下25毫秒就可以了。

import cv2 as cv
cap = cv.VideoCapture('video.mp4')
while cap.isOpened():
    ret, frame = cap.read()
    # 如果正确读取帧,ret为True
    if not ret:
        break
    cv.imshow('frame', frame)
    if cv.waitKey(1) == ord('q'):
        break
cap.release()
cv.destroyAllWindows()

运行这段代码,你就可以看到一个弹窗播放你选择的视频文件了。

保存视频

从相机读取视频,我们可以将视频保存到本地。我们捕捉一个视频,一帧一帧地处理,如果我们想要保存这个视频,非常简单,只需使用 cv.VideoWriter()

cv.VideoWriter() 有5个参数:

  • 参数1:输出文件名,例如: output.mp4。
  • 参数2:FourCC 代码,FourCC 是用于指定视频编解码器的4字节代码。
  • 参数3:帧率的数量。
  • 参数4:帧大小。
  • 参数5:颜色标志。如果为 True,正常颜色输出,否则就是灰色图像输出。

关于 FourCC 与视频格式的对照关系,我列举了一些常见的格式:

cv2.VideoWriter_fourcc(‘P’,‘I’,‘M’,‘1’) = MPEG-1 codec

cv2.VideoWriter_fourcc(‘M’,‘J’,‘P’,‘G’) = motion-jpeg codec --> mp4v

cv2.VideoWriter_fourcc(‘M’, ‘P’, ‘4’, ‘2’) = MPEG-4.2 codec

cv2.VideoWriter_fourcc(‘D’, ‘I’, ‘V’, ‘3’) = MPEG-4.3 codec

cv2.VideoWriter_fourcc(‘D’, ‘I’, ‘V’, ‘X’) = MPEG-4 codec --> avi

cv2.VideoWriter_fourcc(‘U’, ‘2’, ‘6’, ‘3’) = H263 codec

cv2.VideoWriter_fourcc(‘I’, ‘2’, ‘6’, ‘3’) = H263I codec

cv2.VideoWriter_fourcc(‘F’, ‘L’, ‘V’, ‘1’) = FLV1 codec

保存视频的代码:

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

运行这段代码,你就可以在代码目录下找到一个 output.mp4 的视频文件了。

上面几段代码中,如果想要退出视频操作,敲击键盘的 q 就可以。

到此这篇关于基于Python实现捕获,播放和保存摄像头视频的文章就介绍到这了!

Python 相关文章推荐
在Python的列表中利用remove()方法删除元素的教程
May 21 Python
python查看zip包中文件及大小的方法
Jul 09 Python
Django中的CACHE_BACKEND参数和站点级Cache设置
Jul 23 Python
python引入不同文件夹下的自定义模块方法
Oct 27 Python
python dataframe向下向上填充,fillna和ffill的方法
Nov 28 Python
利用Django提供的ModelForm增删改数据的方法
Jan 06 Python
python模拟菜刀反弹shell绕过限制【推荐】
Jun 25 Python
Python Numpy 实现交换两行和两列的方法
Jun 26 Python
seek引发的python文件读写的问题及解决
Jul 26 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
Mar 09 Python
python网络编程socket实现服务端、客户端操作详解
Mar 24 Python
最简单的matplotlib安装教程(小白)
Jul 28 Python
Python中time标准库的使用教程
Apr 13 #Python
Python函数对象与闭包函数
Apr 13 #Python
Python作用域和名称空间的详细介绍
Apr 13 #Python
Python获取字典中某个key的value
Apr 13 #Python
Python基本的内置数据类型及使用方法
Apr 13 #Python
Python如何使用循环结构和分支结构
Apr 13 #Python
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
Apr 13 #Python
You might like
smarty模板嵌套之include与fetch性能测试
2010/12/05 PHP
php 5.3.5安装memcache注意事项小结
2011/04/12 PHP
基于PHP异步执行的常用方式详解
2013/06/03 PHP
php加密算法之实现可逆加密算法和解密分享
2014/01/21 PHP
PHP token验证生成原理实例分析
2019/06/05 PHP
PHP7 foreach() 函数修改
2021/03/09 PHP
JS操作Cookie写入和读取实例代码
2013/10/20 Javascript
javascript修改表格背景色实例代码分享
2013/12/10 Javascript
在页面中输出当前客户端时间javascript实例代码
2016/03/02 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
2016/10/08 Javascript
require.js+vue开发微信上传图片组件
2016/10/27 Javascript
js实现开启密码大写提示
2016/12/21 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
jQuery中将json数据显示到页面表格的方法
2018/05/27 jQuery
Angularjs Ng_repeat中实现复选框选中并显示不同的样式方法
2018/09/12 Javascript
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
2019/03/16 Javascript
javascript防抖函数debounce详解
2019/06/11 Javascript
layui当点击文本框时弹出选择框,显示选择内容的例子
2019/09/02 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
[00:34]TI7不朽珍藏III——地穴编织者不朽展示
2017/07/15 DOTA
[01:23:59]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 VP vs Secret
2018/04/03 DOTA
巧用Python装饰器 免去调用父类构造函数的麻烦
2012/05/18 Python
pyqt4教程之messagebox使用示例分享
2014/03/07 Python
Python实现快速排序算法及去重的快速排序的简单示例
2016/06/26 Python
python smtplib模块实现发送邮件带附件sendmail
2018/05/22 Python
基于Python打造账号共享浏览器功能
2019/05/30 Python
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
英国虚拟主机服务商:eUKhost
2016/08/16 全球购物
Currentbody澳大利亚:美容仪专家
2019/11/11 全球购物
工作失职检讨书范文
2014/01/16 职场文书
教师旷工检讨书
2014/01/18 职场文书
经理秘书求职自荐信范文
2014/03/23 职场文书
实习单位证明范例
2014/11/17 职场文书
2015年幼儿教育工作总结
2015/07/24 职场文书
表扬信范文
2019/04/22 职场文书
Python 实现定积分与二重定积分的操作
2021/05/26 Python