opencv从视频文件读取视频内容,从摄像头读取保存视频内容

文章目录

  • 一、argparse模块
    • 1. 定义
    • 2. 讲解
  • 二、读取、处理、保存图片
    • 1.读取图片
    • 2.灰度处理
    • 3.保存图片
  • 三、读取摄像头、视频文件
    • 1.从摄像头读取
    • 2.从视频文件读取视频内容
    • 3.保存从摄像头读取的视频

一、argparse模块

1. 定义

(1)argparse模块使编写用户友好的命令行接口变得容易。

(2)程序定义了它需要的参数,而argparse将找出如何从sys.argv中解析这些参数。

(3)argparse模块还会自动生成帮助和使用消息,并在用户给程序提供无效参数时发出错误信息。

2. 讲解

import argparse # 导入库
parser = argparse.ArgumentParser() # 获取所有参数

parser.add_argument(“-n1”, “–number one”, help=“第一个参数”, type=int) # 添加参数1

parser.add_argument(“-n2”, “–number two”, help=“第二个参数”, type=int) # 添加参数2
args = parser.parse_args() # 解析所有参数

实战:

import argparse        # 导入库
parser = argparse.ArgumentParser()    # 获取所有参数# print(parser)#添加参数
#第一个参数
parser.add_argument('number1',help='第一个参数',type=int)
#第二个参数
parser.add_argument('number2',help='第二个参数',type=int)#解析参数
args = parser.parse_args()#获取参数
print('第一个参数',args.number1)
print('第二个参数',args.number2)
print('所有参数',args)

注意,我们运行该代码时,需要在命令行运行
在这里插入图片描述

下面我们就运用这个argparse来动态加载我们指定的图片

import cv2
import argparse#加载参数
parse = argparse.ArgumentParser()#添加参数
parse.add_argument('path_image',help='path to input the image')#解析参数
args = parse.parse_args()#加载图片,方式一
image = cv2.imread(args.path_image)
#展示图片
cv2.imshow('image',image)#加载图片,方式二。将图片路径转换成字典形式
args_dict = vars(parse.parse_args()) #{'path_image':'123.png'}
image2 = cv2.imread(args_dict['path_image'])
#展示图片
cv2.imshow('image2',image2)#等待
cv2.waitKey(0)
#关闭窗口
cv2.destroyAllWindows()

终端命令行运行
python 03.read_picture.py 123.png
两种方式都展示了照片
在这里插入图片描述

这样,当我们读取不同图片时,就可以在命令行动态指定,不需要我们经常修改代码

二、读取、处理、保存图片

1.读取图片

cv2.imread()

2.灰度处理

cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

3.保存图片

cv2.imwrite(img2_path, gray_img) #img_path: 图片路径,gray_img: 处理后的图片

import cv2
import argparse#加载参数
parse = argparse.ArgumentParser()#添加参数
parse.add_argument('ori_image',help='path to input the image')
parse.add_argument('out_image',help='save the new image')#解析参数
args = parse.parse_args()#加载图片。将图片路径转换成字典形式
args_dict = vars(parse.parse_args()) #{'path_image':'123.png'}
image = cv2.imread(args_dict['ori_image'])#图片灰度处理
gray_image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)#保存处理后的图片
cv2.imwrite(args_dict['out_image'],gray_image)#显示图片
cv2.imshow('ori_image',image)
cv2.imshow('out_image',gray_image)cv2.waitKey(0)
cv2.destroyAllWindows()

命令行执行
python .\04.图片处理.py .\123.png 234.png
在这里插入图片描述

灰度处理成功,并且保存图片成功
在这里插入图片描述

在这里插入图片描述

三、读取摄像头、视频文件

人脸识别,人脸支付领域应用比较多
交通领域车辆车牌识别
在这里插入图片描述

在这里插入图片描述

  1. cv2.VideoCapture() 从摄像头获取视频流

  2. capture.get() 获取帧的属性

  3. capture.isOpened() 判断摄像头是否打开

  4. cv2.waitKey(20) & 0xFF == ord(‘q’) 键盘输入q退出

  5. cv2.waitKey(20) & 0xFF == ord(‘c’) 键盘输入c截取帧

  6. capture.release() 释放资源

项目实战

1.从摄像头读取

import cv2
import argparseparser = argparse.ArgumentParser()
parser.add_argument("index_camera", help="the camera ID", type=int)
args = parser.parse_args()
print("the camera index :", args.index_camera)capture = cv2.VideoCapture(args.index_camera) # 视频捕获frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH) # 帧的宽度
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT) # 帧的高度
fps = capture.get(cv2.CAP_PROP_FPS) # 每秒的帧数
print("帧的宽度: {}".format(frame_width))
print("帧的高度: {}".format(frame_height))
print("FPS: {}".format(fps))if capture.isOpened() is False:print("Error Camera !")# 读取视频直到关闭
while capture.isOpened():# 通过摄像头,一帧一帧的捕获ret, frame = capture.read()if ret is True:# 显示捕获的帧cv2.imshow("frame", frame)# 将捕获的帧转化为灰度的帧gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 显示灰度的帧cv2.imshow("gray frame", gray_frame)# 键盘输入q,退出视频捕获,关闭摄像头if cv2.waitKey(20) & 0xFF == ord('q'):breakelse:break# 释放
capture.release()
cv2.destroyAllWindows()

#运行流程
Terminal —> python read_camera.py 0

由于我这台台式机没安装摄像头,所以没有输出视频
在这里插入图片描述

正常有摄像头电脑会显示出视频

并输出相关我们打印的数据
在这里插入图片描述

2.从视频文件读取视频内容

# 1 加载库import cv2
import argparse# 2 获取参数
parser = argparse.ArgumentParser()# 3 添加参数
parser.add_argument("video_path", help="the path to the video file")# 4 解析参数
args = parser.parse_args()# 5 加载视频文件
capture = cv2.VideoCapture(args.video_path)#获取视频参数
frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH) # 帧的宽度
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT) # 帧的高度
fps = capture.get(cv2.CAP_PROP_FPS) # 每秒的帧数print("视频宽度: {}".format(frame_width))
print("视频高度: {}".format(frame_height))
print("FPS: {}".format(fps))# 6 读取视频
ret, frame = capture.read() # ret 是否读取到了帧(图片)while ret:cv2.imshow("video", frame)#一旦读取到,就继续一帧一帧地往下读取ret, frame = capture.read() # 继续读取帧if cv2.waitKey(20) & 0xFF == ord('q'):breakcapture.release()
cv2.destroyAllWindows() # 关闭

命令行执行
python .\06.从视频文件读取视频.py .\buildings.mp4
在这里插入图片描述

视频可以顺利播放
在这里插入图片描述

3.保存从摄像头读取的视频

api介绍

  1. 视频编码:
    fourcc = cv2.VideoWriter_fourcc(*‘XVID’)

  2. 灰度写入视频文件
    cv2.VideoWriter(args.video_output, fourcc, int(fps), (int(frame_width), int(frame_height)), False)

实战代码:

# 1 导入库
import cv2
import argparse# 2 获取参数
parser = argparse.ArgumentParser()# 3 添加参数
parser.add_argument("video_output", help="the path to the output video")# 4 解析参数
args = parser.parse_args()# 5 捕获摄像头
capture = cv2.VideoCapture(0)# 6 是否打开了摄像头
if capture.isOpened() is False:print("Camera Error !")# 7 获取帧的属性:宽,高,以及fps
frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH) # 宽
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT) # 高
fps = capture.get(cv2.CAP_PROP_FPS)# 8 对视频进行编码
fourcc = cv2.VideoWriter_fourcc(*"XVID")#false表示灰度方式写入
output_gray = cv2.VideoWriter(args.video_output, fourcc, int(fps), (int(frame_width), int(frame_height)), False)# 9 读取摄像头
while capture.isOpened():ret, frame = capture.read() # 一帧一帧地读取if ret is True:# 10 将读取到的帧转换为灰度gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 11 将转换后的帧写入都新的视频文件中output_gray.write(gray_frame)# 12 显示视频cv2.imshow("gray", gray_frame)# 13 等待或按q退出if cv2.waitKey(1) & 0xFF == ord('q'):breakelse:break# 14 释放资源
capture.release()
output_gray.release()
cv2.destroyAllWindows()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/695828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

S-35390A计时芯片介绍及开发方案

计时芯片 S-35390A芯片是计时芯片,一般用来计算时间。低功耗,宽电压,受温度影响小,适用于很多电路。它有一个问题,不阻止用户设置不存在的时间,设置进去之后计时或者闹钟定时会出错。 规格书阅读 首先我…

【网站项目】560考试预约管理

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

2024.2.21 C++QT 作业

思维导图 练习题 1>使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数,将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"…

道本合规管理|| 欧盟对苹果公司的重罚与合规警示

近日,外媒广泛报道了欧盟委员会预计将对美国科技巨头苹果公司开出约5亿欧元的罚单。这一决定源于苹果公司在音乐流媒体服务领域的反竞争行为,违反了欧盟严格的反垄断法规。这一事件不仅揭示了企业在全球化经营中面临的合规挑战,也为我们提供了…

自存 angular material design 表单输入框lable右对齐样式

单个输入框的文字lable放输入框左边实现 material design 的组件库示例没有文字描述放左边的样式 ,所以mat-lable并没有放在mat-form-field中 <div class"input-container col-6"><mat-label>商品售价<span class"text-error">*</spa…

Unity中,C#的事件与委托区别和经典实例

文章目录 实例1&#xff1a;委托&#xff08;Delegate&#xff09;的基本用法实例2&#xff1a;事件&#xff08;Event&#xff09;的声明与订阅实例3&#xff1a;Unity引擎中的委托实例 - UI Button.onClick实例4&#xff1a;事件&#xff08;Event&#xff09;的安全性实例5&…

AJAX.

概念:AJAX&#xff1a;异步的 JavaScript 和 XML AJAX作用: 1.与服务器进行数据交换: 通过AJAX可以给服务器发送请求&#xff0c;并获取服务器响应的是数据 使用了AJAX和服务器进行通讯&#xff0c;就可以使用HTML和AJAX来替换JSP页面了 2.异步交互:可以在不重新加载整个页面的…

(C++) 详解内存地址空间

详解内存空间 0. 概述 一个C/C 程序&#xff0c;编译之后&#xff0c;形成的程序&#xff0c;在执行期间&#xff0c;内存中不仅存在一块区域用于存放代码&#xff0c;还有一些其他的区域用于使用&#xff0c;本节会详解C/C内部所使用的内存地址空间&#xff0c;关于各内存的…

63-JQuery语法,选择器,事件,方法,遍历循环each,attr(),.prop(),JQuery操作DOM

1.一个JS库,用js封装很多的方法放到一个文件里面,直接拿了用就可以 文件名带min是压缩过的不带min是没压缩过的 2.JQuery语法 通过选取HTML元素,并对选取的元素执行某些操作 基础语法:$(selector).action() <!-- 需要把JQuery文件先引入才能用 --><script src…

IDEA 2021.3激活

1、打开idea&#xff0c;在设置中查找Settings/Preferences… -> Plugins 内手动添加第三方插件仓库地址&#xff1a;https://plugins.zhile.io搜索&#xff1a;IDE Eval Reset 插件进行安装。应用和使用&#xff0c;如图

探秘SuperCLUE-Safety:为中文大模型打造的多轮对抗安全新框架

探秘SuperCLUE-Safety&#xff1a;为中文大模型打造的多轮对抗安全新框架 进入2023年以来&#xff0c;ChatGPT的成功带动了国内大模型的快速发展&#xff0c;从通用大模型、垂直领域大模型到Agent智能体等多领域的发展。但是生成式大模型生成内容具有一定的不可控性&#xff0c…

【数据库】达梦数据库DM8开发版安装

目录 一、达梦数据库概述 1.1 达梦数据库简介 1.2 产品特性 1.3 产品架构 二、安装前准备 2.1 新建 dmdba 用户 2.2 修改文件打开最大数 2.3 挂载镜像 2.4 新建安装目录 2.5 修改安装目录权限 三、数据库安装 3.1 命令行安装 3.2 配置环境变量 四、配置实例 4.1…

LeetCode 热题 100 | 二叉树(下)

目录 1 114. 二叉树展开为链表 2 105. 从前序与中序遍历序列构造二叉树 3 437. 路径总和 III 菜鸟做题&#xff08;即将返校版&#xff09;&#xff0c;语言是 C 1 114. 二叉树展开为链表 题眼&#xff1a;展开后的单链表应该与二叉树 先序遍历 顺序相同。 而先序遍历就…

大语言模型的深度裁剪法

在人工智能领域&#xff0c;大语言模型&#xff08;LLMs&#xff09;已经成为推动语言理解和生成任务进步的重要力量。随着模型规模的不断扩大&#xff0c;如何优化这些模型的计算效率成为了一个迫切需要解决的问题。大型语言模型通常包含数十亿甚至数千亿的参数&#xff0c;这…

四、分类算法 - 朴素贝叶斯算法

目录 1、朴素贝叶斯算法 1.1 案例 1.2 联合概率、条件概率、相互独立 1.3 贝叶斯公式 1.4 朴素贝叶斯算法原理 1.5 应用场景 2、朴素贝叶斯算法对文本进行分类 2.1 案例 2.2 拉普拉斯平滑系数 3、API 4、案例&#xff1a;20类新闻分类 4.1 步骤分析 4.2 代码分析 …

conda下tensorflow安装

conda create -n tf21 python3.7 conda activate tf21 conda install tensorflow-gpu2.1验证 import tensorflow as tf tf.test.is_built_with_cuda()

职业技能鉴定服务中心前端静态页面(官网+证书查询)

有个朋友想做职业技能培训&#xff0c;会发证书&#xff0c;证书可以在自己网站可查。想做一个这样的网站&#xff0c;而且要特别土&#xff0c;一眼看上去像xxx官方网站&#xff0c;像jsp .net技术开发的网站。用htmlcssjquery还原了这样子一个前端页面&#xff0c;这里分享给…

如何使用 GitHub Action 在 Android 中构建 CI-CD

如何使用 GitHub Action 在 Android 中构建 CI-CD 一、什么是 CI/CD&#xff1f;二、什么是 CI&#xff1a;持续集成&#xff1f;三、什么是CD&#xff1a;持续部署&#xff1f;3.1 持续交付3.2 持续部署 四、使用 GitHub 操作在 Android 中构建 CI-CD 管道4.1 步骤 五、什么是…

JAVA工程师面试专题-并发编程篇

目录 一、线程 1、并发与并行的区别 2、同步和异步的区别 3、Java中创建线程有哪些方式? 4、Thread和Runnable的区别 5、Java中的Runnable、Callable、Future、FutureTask的区别和联系&#xff1f; 6、说一下你对 CompletableFuture 的理解 7、volatile关键字有什么用&…

electron学习和新建窗口

首先我们要先下载electron npm install --save-dev electron 建立入口文件main.js 新建一个入口文件 main.js&#xff0c;然后导入eletron新建一个窗口。 const { app, BrowserWindow, ipcMain } require("electron"); const path require("path");func…