【opencv 系列】第2章 图片视频的读取和保存

news2024/11/16 9:34:05

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 1. 图片
  • 2.视频(读取摄像头、视频文件)
    • 2.1 从摄像头读视频
    • 2.2 从视频读取文件
    • 2.3 保存摄像头读取的视频
    • 2.4 图片的打开,读取和保存代码
    • 2.5 摄像头的打开,读取和保存代码
    • 2.6 从文件读取
    • 2.6 从视频读取,再保存回视频
  • 总结


前言

本章主要学习图片和视频的读取和保存

1. 图片

  1. 读取
    cv2.imread(img_path),img_path :图片路径
    img_path 不存在,不会报错,但返回的是None, 这一点其实挺坑的,需要业务上做判断.
  2. 显示
    cv2.imshow(img),img : 图片
    这种方式会一闪而过,需要结合 cv2.waitkey(0) 和 cv2.destroyAllwindows() 使用
    示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
  3. 灰度处理
    cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  4. 保存图片
    cv2.imwrite(img_path, img_new)
    img_path: 图片路径,img_new: 处理后的图片
    在这里插入图片描述

2.视频(读取摄像头、视频文件)

在这里插入图片描述

2.1 从摄像头读视频

  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() 释放资源

2.2 从视频读取文件

其实没有本质区别
在这里插入图片描述

2.3 保存摄像头读取的视频

在这里插入图片描述

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

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

2.4 图片的打开,读取和保存代码

# 1.导入库
import cv2
import argparse

# 2. 获取参数
parser = argparse.ArgumentParser()

# 3. 参加参数
parser.add_argument("img_input",help="read one image")
parser.add_argument("img_output",help="save the processed image")

# 4. 解析参数, 以字典形式保存参数和值
args = vars(parser.parse_args())

print(args)
# exit("=" * 100)
# 5. 加载图片
img = cv2.imread(args["img_input"])

# 6.处理: 灰度处理
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 7 保存图片
cv2.imwrite(args["img_output"],img_gray)

# 8 显示图片
cv2.imshow("Original Image", img)
cv2.imshow("Gray Image", img_gray)

# 9 等待
cv2.waitKey(0)

# 10 关闭窗口
cv2.destroyAllWindows()

启动命令

python demo1.py ../images/children.jpg ./1.jpg

在这里插入图片描述

2.5 摄像头的打开,读取和保存代码

自己看代码把,写的都很清楚.

# 从摄像头读取
import cv2
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("index_camera",help="the camera ID", type=int)
args = parser.parse_args()
# 视频捕获
##
##capture = cv2.VideoCapture(args.index_camera)
## [ WARN:0@2.521] global D:\a\opencv-python\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (539) `anonymous-namespace'::SourceReaderCB::~SourceReaderCB terminating async callback
##
# 方法二:(仅适用于Windows操作系统)

# 打开cmd并输入:

# setx OPENCV_VIDEOIO_PRIORITY_MSMF 0 
## 这两个方法并不好使
capture = cv2.VideoCapture(0, 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("frame width:{}".format(frame_width))
print("frame height:{}".format(frame_height))
print("frames per second:{}".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"):
        #     break
        # if cv2.waitKey(20) & 0xFF == ord("q"):
        #     break
        key_pressed = cv2.waitKey(100)
        print('单机窗口,输入按键,电脑按键为',key_pressed,'按esc键结束')
        if key_pressed == 27:
            break

    else:
        break
# 释放
capture.release()
cv2.destroyAllWindows()

2.6 从文件读取

# 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)



# 6 读取视频
ret, frame = capture.read() # ret 是否读取到了帧(图片)

while ret:
    cv2.imshow("video", frame)
    ret, frame = capture.read() # 继续读取帧
    if cv2.waitKey(20) & 0xFF == ord('q'):
        break

capture.release()
cv2.destroyAllWindows() # 关闭

2.5 和 2.6 很相似

2.6 从视频读取,再保存回视频

和前面的代码很相似,但要写入视频
只有这两部增加了


# 8 对视频进行编码
fourcc = cv2.VideoWriter_fourcc(*"XVID")
output_gray = cv2.VideoWriter(args.video_output, fourcc, int(fps), (int(frame_width), int(frame_height)), False)

# 10 将读取到的帧转换为灰度
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 11 将转换后的帧写入都新的视频文件中
    output_gray.write(gray_frame)

完整代码

# 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")
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'):
            break
    else:
        break

# 14 释放资源
capture.release()
output_gray.release()
cv2.destroyAllWindows()

总结

其实读取视频这些很有用,比如从摄像头读取,可能给的是一个rstmp的地址流, 从视频流读取, 抽帧,再送入模型做识别,在报警. 这个时候就需要读取视频/抽帧这个服务常驻和读取识别的时候能够自充起, python的opencv在这方面有劣势,很多错误报不出来, c++版本的好一些, ffmeg更好,需要c++的功底.
git地址:https://github.com/justinge/opencv_tutorial.git

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

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

相关文章

[LeetCode]1237. 找出给定方程的正整数解

题目链接:https://leetcode.cn/problems/find-positive-integer-solution-for-a-given-equation/description/ 题目描述: 样例1: 输入:function_id 1, z 5 输出:[[1,4],[2,3],[3,2],[4,1]] 解释:functi…

Linux 根目录与路径

目录 Linux的根目录 /usr目录(存放用户数据) /bin目录(存放所有用户都可使用的应用程序) /sbin目录(存放管理员才可以使用的应用程序) /opt目录(存放第三方软件) /boot目录&am…

[Android Studio] Android Studio Virtual Device(AVD)虚拟机的功能试用

🟧🟨🟩🟦🟪 Android Debug🟧🟨🟩🟦🟪 Topic 发布安卓学习过程中遇到问题解决过程,希望我的解决方案可以对小伙伴们有帮助。 🚀write…

Mindspore安装

本文用于记录搭建昇思MindSpore开发及使用环境的过程,并通过MindSpore的API快速实现了一个简单的深度学习模型。 什么是MindSpore? 昇思MindSpore是一个全场景深度学习框架,旨在实现易开发、高效执行、全场景覆盖三大目标。 安装步骤 鉴于笔者手头硬…

QM9数据集示例项目学习图神经网络

目录QM9数据集:QM9数据提取的特征:网络结构的设计官网示例代码注释:QM9数据集: QM9为小有机分子的相关的、一致的和详尽的化学空间提供量子化学特征,该数据库可用于现有方法的基准测试,新方法的开发&#…

【算法】两道算法题根据提供字母解决解码方法和城市的天际线天际线问题

算法目录解码方法Java解答参考:天际线问题Java解答参考:大家好,我是小冷。 上一篇了解了项目相关的知识点 接下来看下两道算法题吧,用Java解答,可能更能激发一下大脑思考。 解码方法 题目要求: 一条包含…

将 Supabase 作为下一个后端服务

对于想快速实现一个产品而言,如果使用传统开发,又要兼顾前端开发,同时又要花费时间构建后端服务。然而有这么一个平台(Baas Backend as a service)后端即服务,能够让开发人员可以专注于前端开发&#xff0c…

Java反序列化漏洞——CommonsCollections4.0版本—CC2、CC4

一、概述4.0版本的CommonsCollections对之前的版本做了一定的更改,那么之前的CC链反序列化再4版本中是否可用呢。实际上是可用的,比如CC6的链,引入的时候因为⽼的Gadget中依赖的包名都是org.apache.commons.collections ,⽽新的包…

【构建工具】Gradle中文教程

文章目录Gradle 简介Gradle 概述基于声明的构建和基于约定的构建为以依赖为基础的编程方式提供语言支持构建结构化深度 APIGradle 的扩展多项目构建多种方式管理依赖Gradle 是第一个构建集成工具易于移植GroovyThe Gradle wrapper自由和开源为什么使用 Groovy?Gradle 安装先决…

Pycharm搭建一个Django项目

File->new project 点击create, 等待一下即可 查看安装 Django 版本: 在 Pycharm 底部选择 Terminal 然后在里面输入:python -m django --version 启动项目: 在 Terminal 里面输入: python manage.py runserver 查看文件目…

一文精通MVCC机制

MVCC(Multi-Version Concurrency Control)多版本并发控制机制使用串行化隔离级别时,mysql会将所有的操作加锁互斥,来保证并发安全。这种方式必然降低并发性能。mysql在读已提交和可重复读隔离级别下,对一行数据的读和写两个操作默认是不会通过…

【Unity3d】Unity与iOS之间通信

在unity开发或者sdk开发经常遇到unity与移动端原生层之间进行通信,这里把它们之间通信做一个整理。 关于Unity与Android之间通信,参考【Unity3d】Unity与Android之间通信 Unity调用Objective-C 主要分三个步骤: (一)、在xcode中定义要被u…

php学习笔记

之前看过php的基础教学视频,了解了一下,自己没有上手实践,现在为了项目需要,需要扎实学习一下,所以做一下笔记吧。 php学习笔记1.基础2.动态网站的开发学习2.1会员管理系统1.基础 之前看过一个4小时的基础视频&#x…

Go 数组和切片反思

切片的底层数据结构是数组,所以,切片是基于数组的上层封装,使用数组的场景,也完全可以使用切片。 类型比较 我看到 go 1.17 有对切片和数组转换的优化,禁不住纳闷,有什么场景是必须数组来完成的呢&#x…

vue项目第七天

项目中模块操做业务使用ajax(需要使用接口认证)修改封装的findData发送ajax请求管理员列表内部搜索业务复用之前的findData 方法即可实现整个查询业务。实现退出业务在下拉菜单上添加事件以及属性。用户退出登录,二次登录系统菜单可能不存在的…

linux环境搭建私有gitlab仓库

搭建之前,需要安装相应的依赖包,并且要启动sshd服务(1).安装policycoreutils-python openssh-server openssh-clients [rootVM-0-2-centos ~]# sudo yum install -y curl policycoreutils-python openssh-server openssh-clients [rootVM-0-2-centos ~]…

(API)接口测试的关键技术

接口测试也就是API测试,从名字上可以知道是面向接口的测试活动。所以在讲API测试之前,我们应该说清楚接口是什么,那么接口就是有特定输入和特定输出的一套逻辑处理单元,而对于接口调用方来说,不用知道自身的内部实现逻…

Spring 中经典的 9 种设计模式

1.简单工厂(非23种设计模式中的一种) 2.工厂方法 3.单例模式 4.适配器模式 5.装饰器模式 6.代理模式 7.观察者模式 8.策略模式 9.模版方法模式 Spring中涉及的设计模式总结 1.简单工厂(非23种设计模式中的一种) 实现方式: BeanFactory。Spring中的BeanFa…

Android 初代 K-V 存储框架 SharedPreferences,旧时代的余晖?

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问。 前言 大家好,我是小彭。 SharedPreferences 是 Android 平台上轻量级的 K-V 存储框架,亦是初代 K-V 存储框架,至今被很多应用沿用。 有的…

【C语言】大小端字节序问题

一、大小端字节序问题 大小端是由CPU决定的,大小端可以理解为字节顺序,所以大小端全称叫大端字节序、小端字节序。其实大端、小端这两个词是从《格列佛游记》里出来的。《格列佛游记》有一段讲的是吃鸡蛋是从大的那头敲开还是小的那头敲开的问题&#xf…