【图像处理】opencv | 图像的载入,显示,保存 | 视频流的载入,显示,保存

news2024/11/18 9:49:48

文章目录

  • 前言
  • 一、cv2读取图片并展示
    • 1.1、cv2.imread读取图片
    • 1.2、cv2.imshow展示图片
    • 1.3、完整代码
    • 1.4、封装函数调用
    • 1.5、cv2读取为灰度图像
    • 1.6、cv2.imwrite保存图像
  • 二、cv2读取视频并且展示
    • 2.1 展示彩色视频
    • 2.2 展示灰度视频
    • 2.3 保存视频


前言

本文参考视频:唐宇迪老师的视频
我的代码也就是差不多跟着视频里的代码敲了一遍,并对自己不懂的地方进行加强学习和补充。

一、cv2读取图片并展示

1.1、cv2.imread读取图片

import cv2
X1=cv2.imread('dog.jpg')

值得注意的是cv2.imread读取的图片为BGR模式,而非RGB模式。
我们检查一下X1的属性:

print(X1)
print(X1.shape)
print(type(X1))

在这里插入图片描述

在这里插入图片描述
因为图片读进来的维度顺序为h,w,c,和从深度学习里张量的c,h,w有点区别,所以看起来比较怪。
我们再看看读取的图片的数据类型

print(X1.dtype)

在这里插入图片描述
uint8是8位无符号整型(1个字节),一般图像的显示就用8位的uint8,可以表示的范围是0-255

1.2、cv2.imshow展示图片

进行图片展示的函数为:

cv2.imshow('dog',X1)

dog为展示的窗口名称,X1为要展示的“图像”
当然如果此时直接运行的话,会显示不出来任何结果:
在这里插入图片描述
为了能正常运行,需要加上几句话:

cv2.imshow('dog',X1)
cv2.waitKey(0) #0为任意键位终止
cv2.destroyAllWindows()

此时的图片就能正常显示出来了:
在这里插入图片描述
如果想对窗口展示的时间作限制的话,可以在cv2.waitKey(0) 的括号里做一定的修改:

cv2.imshow('dog',X1)
cv2.waitKey(1000) 
cv2.destroyAllWindows()

比如这里改成1000,就是窗口保持1S,然后消失。2000就是2S,以此类推。

1.3、完整代码

cv2.imshow('dog',X1)
import cv2

X1=cv2.imread('dog.jpg')
cv2.imshow('dog',X1)
cv2.waitKey(0) #0为任意键位终止
cv2.destroyAllWindows()

1.4、封装函数调用

如果嫌后面几行每次写都太麻烦,可以封装一个函数

import cv2

def cvshow(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)  # 0为任意键位终止
    cv2.destroyAllWindows()

X1=cv2.imread('dog.jpg')
cvshow('dog',X1)

1.5、cv2读取为灰度图像

相比于前面读取为彩色图片,只有一个地方需要修改:

X1=cv2.imread('dog.jpg',cv2.IMREAD_GRAYSCALE)

或者改为:

X1=cv2.imread('dog.jpg',0)

最后的效果都是一样的:
在这里插入图片描述
完整代码:

import cv2
X1=cv2.imread('dog.jpg',0)
cv2.imshow('dog',X1)
cv2.waitKey(0) #0为任意键位终止
cv2.destroyAllWindows()

我们此时再打印一下图像的几个属性看看:

print(X1)
print(X1.shape)
print(type(X1))

在这里插入图片描述
可以很明显看到,数组变成了2维,少了通道这个维度了。
当然,读入的灰度图也是uint8数据类型

1.6、cv2.imwrite保存图像

一句话就够了 :

cv2.imwrite('baocun.jpg', X1)

结果:
在这里插入图片描述

二、cv2读取视频并且展示

2.1 展示彩色视频

我们直接放代码看看

import cv2

cap=cv2.VideoCapture('1.mp4')#设为0的话为调用摄像头
if cap.isOpened():  #判断是否正常打开
    ret,frame=cap.read()#返回两个参数,第一个是bool是否正常打开,第二个是照片数组
else:
    ret =False

while ret:
    ret,frame=cap.read()
    if frame is None:
        break
    if ret==True:
        cv2.imshow('video',frame)
        if cv2.waitKey(100)&0xFF== ord('q'):   #cv2.waitKey,每帧数据延时 Xms,是视频播放速度的快慢,值设的越大越慢
            break
cap.release() # 释放摄像头
cv2.destroyAllWindows()

1)首先生成一个VideoCapture对象,用以捕捉视频流。如果想捕捉摄像头的视频流,可以设置:

cap=cv2.VideoCapture(0)#设为0的话为调用摄像头

2)然后使用 cap.isOpened()判断是否正常打开
3)如果正常打开,用cap.read()开始一帧帧读取视频,返回两个参数ret,frame,第一个是bool是否正常打开,第二个是图像数组
4)一切顺利的情况下,cv2.imshow()就会开始展示视频了
5)cv2.waitKey(100)是对每帧图像进行延迟的函数,这里是延迟100ms,数字设的越大,播放的越慢
6)ord(‘q’)为检测按键q,如果键盘有触碰到了按键q,就会关闭视频。

最后结果:
在这里插入图片描述
这里可以看到出现了一个问题:
由于我导入的视频是4K视频,分辨率很大,超过了屏幕的显示范围。为了更好展示,我们需要对视频帧进行缩放,缩放到1080P(1920X1080):

frame=cv2.resize(frame,(1920,1080))  #4K视频缩小为1080p

值得一提的是,4K视频要转换为1080p视频时,差不多 4个像素就要合成为一个像素。
完整代码:

import cv2

cap=cv2.VideoCapture('1.mp4')#设为0的话为调用摄像头
if cap.isOpened():  #判断是否正常打开
    ret,frame=cap.read()#返回两个参数,第一个是bool是否正常打开,第二个是照片数组
else:
    ret =False

while ret:
    ret,frame=cap.read()
    if frame is None:
        break
    if ret==True:
        frame=cv2.resize(frame,(1920,1080))  #4K视频缩小为1080p
        cv2.imshow('video',frame)
        if cv2.waitKey(100)&0xFF== ord('q'):   #cv2.waitKey,每帧数据延时 Xms,是视频播放速度的快慢,值设的越大越慢
            break
cap.release() # 释放摄像头
cv2.destroyAllWindows()

当然还可以对代码进行更进一步的简化:

import cv2
cap=cv2.VideoCapture('1.mp4')#设为0的话为调用摄像头

while (cap.isOpened()):
    ret,frame=cap.read()
    if frame is None:
        break
    if ret==True:
        frame=cv2.resize(frame,(1920,1080))  #4K视频缩小为1080p
        cv2.imshow('video',frame)
        if cv2.waitKey(100)&0xFF== ord('q'):   #cv2.waitKey,每帧数据延时 Xms,是视频播放速度的快慢,值设的越大越慢
            break
cap.release() # 释放摄像头
cv2.destroyAllWindows()

2.2 展示灰度视频

只用加一句代码就行:

gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

在这里插入图片描述
完整代码:

import cv2
cap=cv2.VideoCapture('1.mp4')#设为0的话为调用摄像头

while (cap.isOpened()):
    ret,frame=cap.read()
    if frame is None:
        break
    if ret==True:
        gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        frame=cv2.resize(gray,(1920,1080))  #4K视频缩小为1080p
        cv2.imshow('video',frame)
        if cv2.waitKey(100)&0xFF== ord('q'):   #cv2.waitKey,每帧数据延时 Xms,是视频播放速度的快慢,值设的越大越慢
            break
cap.release() # 释放摄像头
cv2.destroyAllWindows()

2.3 保存视频

需要在原来的代码中添加几句话:

fourcc = cv2.VideoWriter_fourcc(*'mp4v') #保存格式为mp4格式
out = cv2.VideoWriter('2.mp4',fourcc, 30, (1920,1080),True) 
out.write(frame)

cv2.VideoWriter第一个参数是保存路径,第二个参数是指定的编码器,第三个参数是 保存的帧率,第四个参数是保存的尺寸,第五个参数为是否保存为彩色图像。

完整代码如下:

import cv2

cap=cv2.VideoCapture('1.mp4')#设为0的话为调用摄像头
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('2.mp4',fourcc, 30, (1920,1080),True)
while (cap.isOpened()):
    ret,frame=cap.read()
    if frame is None:
        break
    if ret==True:
        #gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        frame=cv2.resize(frame,(1920,1080))  #4K视频缩小为1080p
        cv2.imshow('video',frame)
        out.write(frame)
        if cv2.waitKey(10)&0xFF== ord('q'):   #cv2.waitKey,每帧数据延时 Xms,是视频播放速度的快慢,值设的越大越慢
            break
cap.release() # 释放摄像头
cv2.destroyAllWindows()

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

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

相关文章

二进制搭建k8s——部署etcd集群和单master

二进制搭建k8s——部署etcd集群和单master二进制搭建k8s——部署etcd集群和单master环境1、操作系统初始化配置(全部节点)2、部署 docker 引擎(所有节点)3、部署 etcd 集群准备签发证书环境在 master01 节点上操作在 node01 和 no…

端口隔离实现同一vlan下,二层和三层的互不通

如图:我们要实现下图中,PC1和PC2不通,但都和PC3互通: 配置如下: vlan batch 10 port-isolate mode all # interface GigabitEthernet0/0/1 port link-type access port default vlan 10 port-isolate enable grou…

【golang】 demo 之王realworld,使用golang+gin做后端技术,使用vue做前端项目的开源博客项目

目录前言1,关于realworld项目2,前端项目使用vue3开发的3,后端使用golanggin进行接口开发4,总结前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/108971807 未经博主允许不得转载。 博主CSDN地址是&…

idea中打包docker镜像

idea中打包docker镜像 说明 ​ 构建和推送镜像都是需要docker环境的,这个大家可以使用同一个远程的环境,这里说的就是idea使用服务器上的docker进行镜像的构建和发布, ​ 默认高版本的idea中默认集成了docker插件,这个插件的官…

高并发高可用

一、高并发 1、异步并发 同步阻塞 异步Future 异步CallBack 异步编排CompletableFuture 请求缓存 请求合并 2、扩容 单体应用垂直扩容 单体应用水平扩容 应用拆分 数据库拆分水平/垂直拆分 使用Sharding-jdbc分库分表/读写分离 数据异构 任务系统扩容 3、队列 …

[LeetCode周赛复盘] 第 93 场双周赛20221015-补

[LeetCode周赛复盘] 第 93 场双周赛20221015-补 一、本周周赛总结二、 [Easy] 6261. 数组中字符串的最大值1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6262. 图中最大星和1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6263. 青蛙过河 II1. 题目描述2. 思路分析3. 代码实…

【OpenCV学习】第13课:基本阈值操作

仅自学做笔记用,后续有错误会更改 参考文章:https://blog.csdn.net/qq_37835727/article/details/123373339 理论 图像阈值:什么是图像阈值?简单点来说就是把图像分割的标尺, 举个栗子, 现在想象一个场景, 一个桌子上…

BA_重投影误差e对于相机的位姿ξ和对空间点的坐标P的雅可比矩阵的推导

1. 基本思路 重投影误差表示为e, 相机的位姿表示为ξ (或者表示为T(R,t)), 空间点表示为P, 则空间点投影到相机坐标系下的空间坐标点的相机坐标表示为P[X, Y, Z], 则 重投影误差e对于相机的位姿ξ的雅克比矩阵表示为 分别求等式右侧的两半部分(误差对空…

DevExpress WinForms 22.2

DevExpress WinForms 22.2 添加了对Microsoft.NET 7的完全支持。 此版本现在需要.NET 6和Microsoft Visual Studio 2022(v17.0)或更高版本。 这不会影响.NET Framework客户,产品程序集在此发布周期中将继续以.NET Framework 4.5.2为目标。 蒙皮和矢量图标 WXI皮肤的…

每天五分钟机器学习:经典的降维算法——主成分分析法PCA

本文重点 前面我们学习了降维算法的两大应用场景,本节课程我们将学习具体的降维算法PCA,它是主成分分析法。 PCA要做什么? 将二维数据降维到一维,关键就是找到一个方向向量,然后把所有的数据都投射到该向量上,那么什么样的方向向量最好呢? 我们希望投射平均均方误差…

UIPickerView,UIDatePicker,UITextView

文章目录UIPickerView概念应用创建选中数据时的回调代理UIDatePicker概念创建四种模式UITextView概念创建常用属性与方法常用协议方法UIPickerView 概念 UIPickerView是一个列表控件。它可以提供给用户有限个数的可供选择的选项。 他可以设置列数和每一列的行数,然…

Fiddler抓包和Fiddler过滤器

目录 一、Fiddler与其他抓包工具的区别 二、Fiddler的工作原理 三、使用fiddler实现手机抓包 四、Filters过滤器 一、Fiddler与其他抓包工具的区别 1、Firebug虽然可以抓包,但是对于分析http请求的详细信息,不够强大。模拟http请求的功能也不够&…

简述基于JavaEE企业级开发技术

一、绪论 1、学习内容 javaEE企业开发技术概述javaEE容器——SpringORM数据层——MyBatis/JPAWeb层——Spring MVC展现层——JSP/Thymeleaf整合框架——SSM/SSH用户模块分析用户模块功能模块设计 前端框架:Bootstrap,NodeJS,Vue/React/Ang…

[附源码]计算机毕业设计个性化名片网站Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Appium基础 — Appium测试环境搭建总结

1、Appium测试环境搭建整体思路 (1)Android测试环境搭建 Android测试环境需要搭建三个环境,Java,AndroidSDK,Android模拟器。 为什么要安装这三个环境? Java:Android的应用程序层使用的语言是…

理解Linux设备树(DTS)

DTS Dts:DTS即Device Tree Source,是一个文本形式的文件,用于描述硬件信息。一般都是固定信息,无法变更,无法overlay。 Dtsi:可以理解为dts的公共部分,添加、变更非常灵活。Dtsi包含在dts中。 …

基于 EasyOCR + HanLp 实现图片文字实体(中文姓名、机构名、地域名)识别

一、EasyOCR HanLp EasyOCR 是一个python版的文字识别工具。目前支持80中语言的识别。并且支持:图像预处理(去噪、色彩饱和度、尖锐处理)、CRAFT文字检测、中间处理(倾斜处理等)、文字识别、后续处理、输出结果。框架如下&#…

RHCE实验--ansible

第四章 1、使用debug模块,显示当前受管主机的dns服务器的ip地址。 2、将createuser.fact文件传输到受管主机上作为自定义事实变量文件(/etc/ansible/facts.d/),该文件的内容如下: [general] username wujing mima…

以太网 STP临时环路的产生、STP BPDU的转发过程、根桥故障案例分析。

2.10.2 以太网 传统STP生成树(STP临时环路、STP BPDU的转发过程、根桥故障案例) 传统STP生成树2.10.2 以太网 传统STP生成树(STP临时环路、STP BPDU的转发过程、根桥故障案例)STP临时环路:STP BPDU的转发过程&#xff…

多维数据分析

【数据挖掘】数据挖掘#商业智能(BI)数据分析挖掘概念 数据挖掘目前在各类企业和机构中蓬勃发展。因此我们制作了一份此领域常见术语总结。 分析型客户关系管理(Analytical CRM/aCRM): 用于支持决策,改善公司跟顾客的…