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…

利用gvim宏快速生成连续带数字下标的信号

工作中难免会遇到多次instance某个module,然后某个module的同时又含有多个端口的时候,如下dut,有4个input req_x(x0-3) ///rtl module dut();input req_0;input req_1;input req_2;input req_3; .... endmodule //tb top dut dut_0(.req_0(m…

2024.2.21 C++QT 作业

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

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

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

Validator工具验证类,区分添加,删除,修改

1&#xff1a;pom.xml添加必要依赖 <dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId></dependency><dependency><groupId>org.hibernate.validator</groupId><artifactId&g…

批量将Java项目GBK编码的文件转换为UTF8

场景 我们在新拿到一个项目的时候&#xff0c;尤其是老项目&#xff0c;很可能之前的项目编码是GBK&#xff0c;而我们的编译器默认编码为UTF-8&#xff0c;会出现乱码&#xff0c;如果我们一个一个文件的进行编码转换会非常麻烦&#xff0c;所以使用java实现了一个批量将GBK编…

自存 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…

ElasticSearch之零碎知识点

写在前面 本文记录es的零碎知识点&#xff0c;包括但不限于概念&#xff0c;集群方式&#xff0c;等。 1&#xff1a;词项查询 VS 全文查询 词项查询&#xff1a;查询的内容不做分词处理&#xff0c;输入的什么查询什么。 全文查询&#xff1a;查询的内容会做分词处理&…

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

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

Opencv3.2 ubuntu20.04安装过程

##1、更新源 sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main" sudo apt update##2、安装依赖库 sudo apt-get install build-essential sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavfor…

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;关于各内存的…

Swift基础知识:29.Swift 泛型

在 Swift 中&#xff0c;泛型&#xff08;Generics&#xff09;是一种强大的特性&#xff0c;它允许你编写灵活、可复用的函数和类型&#xff0c;以便于处理各种不同类型的数据&#xff0c;而不需要重复编写相似的代码。泛型代码可以让你写出更加灵活、可维护和可复用的代码。 …

怎么卸载Nvidia显卡驱动

在Ubuntu 22.04上卸载Nvidia显卡驱动并手动重新安装的步骤可以分为几个主要部分。请确保在执行这些步骤之前&#xff0c;你已经备份了重要的数据&#xff0c;以防出现任何问题。 卸载当前的Nvidia驱动 打开终端&#xff1a;你可以通过按CtrlAltT快捷键来打开终端。 查找安装的…

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

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

SouthLeetCode-打卡24年02月第2周

SouthLeetCode-打卡24年02月第2周 // Date : 2024/02/05 ~ 2024/02/11 039.有效的字母异位词 (1) 题目描述 039#LeetCode.242.简单题目链接#Monday2024/02/05 给定两个字符串 *s* 和 *t* &#xff0c;编写一个函数来判断 *t* 是否是 *s* 的字母异位词。 **注意&#xff1…

IDEA 2021.3激活

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

Java时间操作之LocalDateTime

Java时间操作之LocalDateTime 一、介绍二、使用步骤1、输出时间2、日期时间的加减 一、介绍 LocalDate: 表示没有时区的日期, LocalDate是不可变并且线程安全的 LocalTime: 表示没有时区的时间, LocalTime是不可变并且线程安全的 LocalDateTime: 表示没有时区的日期时间, Loca…

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

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