OpenCV入门(二)快速学会OpenCV1图像基本操作
OpenCV入门(一)快速学会OpenCV1图像基本操作
不讲大道理,直接上干货。操作起来。
众所周知,OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大。今天就从读取图片,显示图片,输出图片信息和简单的界面编程和大家一起进入OpenCV的世界。
图像基本操作
1、读取图片
函数imread用于读取图像文件或加载图像文件,声明如下:
cv2.imread()
cv2.imread (const String &filename, int flags=IMREAD_COLOR)
其中,参数filename表示要读取的图像文件名,flags表示读取模式,取值如下:
· cv.IMREAD_ANYDEPTH:其值是2,取这个标志的话,若载入的图像深度为16位或者32位,就返回对应深度的图像,否则转换为8位图像再返回。
· cv.IMREAD_COLOR:其值是1,取这个标志的话,图像转为彩色图像(BGR,3通道)。
· cv.IMREAD_GRAYSCALE:其值是0,取这个标志的话,始终将图像转换成灰度图,即返回灰度图像,1通道。
· cv. IMREAD_UNCHANGED,其值是-1,不加改变地载入原图。
如果从指定文件加载图像成功就返回一个存储着图片像素数据的矩阵。如果无法读取图像(缺少文件、权限不正确、格式不受支持或无效),那么函数将返回空。
imread的第一个参数一般是图像文件的绝对路径或相对路径。对于绝对路径,imread除了不支持单右斜线形式(),其他斜线形式都支持,比如双右斜线形式(\)、双左斜线形式(//)、单左斜线形式(/)等。
通常相对路径更加方便点,只要把图像文件放在工程目录下即可。
实例如下:
#导入cv模块
import cv2 as cv
#读取图像,支持 bmp、jpg、png、tiff 等常用格式
img = cv.imread("yd.jpg") #yd.jpg在工程目录下
print(img)
输出结果:
[[[123 132 145][124 133 146][125 134 147]...[238 243 242][238 243 242][238 243 242]][[121 130 143][120 129 142][121 130 143]...[238 243 242][238 243 242][238 243 242]][[116 125 138][115 124 137][115 124 138]...[238 243 242][238 243 242][238 243 242]]...[[ 56 65 68][ 55 64 67][ 52 64 66]...[ 12 12 12][ 15 15 15][ 18 18 18]][[ 59 71 73][ 59 71 73][ 59 71 73]...[ 12 12 12][ 15 15 15][ 19 19 19]][[ 76 88 90][ 77 89 91][ 79 91 93]...[ 14 14 14][ 17 17 17][ 22 22 22]]]Process finished with exit code 0
2、显示图片
cv2.imshow可以帮助我们显示图片。
定义:
cv2.imshow(window_name, image)
显示实例:
import cv2 as cv
import numpy as np #导入numpy模块 #imgpath = "d:\\我的图片\\p1.jpg";
#imgpath = "d://test//p1.jpg";
#imgpath = "d:/test/p1.jpg"
#imgpath = "d:/test//test2\\test3//test4//p1.jpg";#-- 4 --以上三种混合法
imgpath = "p1.jpg"; #-- 5 --相对路径法,放工程目录下
img = cv.imdecode(np.fromfile(imgpath,dtype=np.uint8),-1)
cv.imshow("img",img) #显示窗口
cv.waitKey(0) #等待按键
cv.destroyAllWindows() #释放窗口
我们对上面的六种路径进行了测试,其中任何一种都是支持的,都可以成功读取并显示图片,其中较常用的是相对路径,也就是第五种。放在和3.1.py同一路径下,既可以在PyCharm中直接运行来打开图片,也可以到命令行窗口下执行pthon 3.1.py来打开图片。
输出结果:
3、输出图片的信息
3.1输出图片形状:
# 输出图像形状
print(img.shape)
实例代码:
#导入cv模块
import cv2 as cv
#读取图像,支持 bmp、jpg、png、tiff 等常用格式
img = cv.imread("yd.jpg")
print(img.shape)
输出结果:
(376, 597, 3)
3.2输出图片大小:
# 输出图像大小
print(img.size)
实例代码:
#导入cv模块
import cv2 as cv
#读取图像,支持 bmp、jpg、png、tiff 等常用格式
img = cv.imread("yd.jpg")
print(img.size)
输出结果:
673416
3.3输出图片数据类型
# 输出数据类型
print(img.dtype)
实例代码:
#导入cv模块
import cv2 as cv
#读取图像,支持 bmp、jpg、png、tiff 等常用格式
img = cv.imread("yd.jpg")
print(img.dtype)
输出结果:
uint8
看完这些实例是不是很简单呀!!!
4、OpenCV简单界面编程
4.1创建窗口
OpenCV也支持有限的界面编程,主要是针对窗口、控件和鼠标事件等,比如滑块。有了这些窗口和控件,可以更好地展现图像并调节图像的一些参数。
这些界面编程主要由High-level GUI(高层次图形用户界面)模块支持。在High-level GUI模块中,用于新建窗口的函数是nameWindow,同时可以指定窗口的类型。
该函数声明如下:
namedWindow(winname[, flags])
其中,参数winname表示新建的窗口名称,自己随便取;flags表示窗口的标识(一般默认为cv2.WINDOW_AUTOSIZE,表示窗口大小自动适应图片大小,并且不可手动更改;
cv2.WINDOW_NORMAL表示用户可以改变这个窗口大小;cv.WINDOW_OPENGL窗口创建的时候会支持OpenGL)。
在High-level GUI模块中,用于显示窗口的函数是imshow,声明如下:
imshow(winname, mat)
其中,参数winname表示显示的窗口名,可以使用namedWindow函数创建窗口,如不创建,imshow函数将自动创建;image表示需要显示的图像。
根据图像的深度,imshow函数会自动对其显示灰度值进行缩放,规则如下:
(1)如果图像数据类型是8U(8位无符号),就直接显示。
(2)如果图像数据类型是16U(16位无符号)或32S(32位有符号整数),那么imshow函数内部会自动将每个像素值除以256并显示,即将原图像素值的范围由[0-255×256]映射到[0~255]。
(3)如果图像数据类型是32F(32位浮点数)或64F(64位浮点数),那么imshow函数内部会自动将每个像素值乘以255并显示,即将原图像素值的范围由[0-1]映射到[0~255](注意:原图像素值必须要归一化)。
需要注意的一点就是imshow之后必须有waitKey函数,否则显示窗口将一闪而过,不会驻留屏幕。
waitKey函数声明如下:
waitKey([delay])
其中,参数delay表示一个延时值,单位为ms,默认为0,永久延时,一直等待,直到用户按键。如果在指定时间之前没有按下任何键,就返回-1;如果在指定时间之前按下任何键,就返回按键的对应值。
当delay≤0时,函数waitKey无限地等待一个键事件,当delay>0时,则等待delay毫秒。由于操作系统在切换线程之间有一个最短的时间间隔,因此该函数不会正好等待delay毫秒,而是等待比delay毫秒长一些,这取决于当时计算机上运行的其他操作。
如果在指定时间之前没有按下任何键,就返回按下键的代码或-1。注意,此函数是HighGUI模块中唯一可以获取和处理事件的方法,因此需要定期调用它以进行正常的事件处理,除非HighGUI是在负责事件处理的环境中使用的。
另外,只有在至少创建了一个HighGUI窗口并且该窗口处于活动状态时该函数才起作用。如果有几个HighGUI窗口,那么其中任何一个都可以是活动的。
实例应用:新建窗口并显示5秒后退出
import cv2 as cv
import numpy as np #导入numpy模块 img = cv.imread('p1.jpg')
cv.namedWindow("myimg", cv.WINDOW_AUTOSIZE);
cv.imshow("myimg",img);#在“窗口1”这个窗口输出图片。
cv.waitKey(5000);#等待5秒,程序自动退出。改为0,不自动退出。
4.2单窗口显示多图片
在某些场景下,比如有多个摄像头视频图像,如果一个视频图像显示在一个窗口中,则会因为窗口过多而显得凌乱。此时就需要一个窗口能显示多个视频图像。
在OpenCV中,我们可以利用hstack函数来实现单窗口显示多幅图像。首先熟悉一下hstack函数。hstack函数就是把两个行相同的数组或者矩阵的列从左到右排列起来,也就是把列水平排列起来,声明如下:
numpy.hstack(tup)
其中,tup是ndarrays数组序列。这里说的数组就是NumPy库的array,比如定义了一个3行5列的二维矩阵数组:
这里的行数是矩阵的高度,列数是矩阵的宽度。比如建立一个一维矩阵b,长度为b.shape:
b =np.array([1,2,3,4])print(b.shape)
输出是(4,),4就是一维矩阵的长度,因为不存在二维,也就没有二维的长度,因此括号里的逗号后面是空的。
了解了hstack函数后,我们可以在一个窗口中显示多幅图片,原理是直接通过imread函数返回的二维矩阵数组传入hstack函数中。
import cv2 as cv
import numpy as np #导入numpy模块 def opecv_muti_pic():img1 = cv.imread('1.jpg')print(img1.shape)img2 = cv.imread('2.jpg')print(img2.shape)img3 = cv.imread('3.jpg')print(img3.shape)imgs = np.hstack([img1,img2,img3])# 展示多个cv.imshow("mutil_pic", imgs)#等待关闭cv.waitKey(0)opecv_muti_pic()
在上述代码中,首先读取了3幅图片,并各自返回了二维矩阵数组,这3幅图片在工程目录下可以找到,这里不对是否读取成功进行判断,但一线开发则不能少这个判断。
随后,把3幅图片的矩阵数组传入hstack函数中进行合并,并返回合并后的矩阵数组,然后通过imshow显示出来。
我们每次读取一幅图片,就把它的宽度和高度打印出来。可以发现,高度(行数)都是相同的,否则是不能用于hstack的。
例如,把图片3缩放后保存,再运行程序,就会报错。运行工程,结果如图所示。
4.3销毁窗口
既然有新建窗口,就会有销毁窗口。
在OpenCV中,销毁窗口时窗口也将自动关闭,可以通过函数destroyWindow和destroyAllWindows来实现,前者是销毁某一个指定名称的窗口,后者是销毁所有新建的窗口。函数destroyWindow声明如下:
destroyWindow(winname)
参数winname是要销毁窗口的名称。destroyAllWindow函数更加简单,声明如下:
destroyAllWindows()
实例:销毁3个窗口:
import cv2 as cv
import numpy as np szName = ["", "", ""]
srcImage=[1,2,3]
for i in range(0,2):szName[i] = ( "%d.jpg") % (i+1)srcImage[i] = cv.imread(szName[i]); cv.imshow(szName[i], srcImage[i]); cv.waitKey(5000); cv.destroyWindow(szName[i]);print("所有的窗口已经销毁了")
cv.waitKey(0);
4.4键盘事件
最简单、最常用的键盘事件是等待按键事件,它是由waitKey函数来实现的。无论是刚开始学习OpenCV,还是使用OpenCV进行开发调试,都可以看到waitKey函数的身影,然而最基础的往往容易忽略,在此可以好好了解一下这个基础又常用的waitKey函数。该函数延时一段时间,返回按键的值。当参数为0时就永久等待,直到用户按键。
函数声明如下:
waitKey([delay])
其中,参数delay是延时的时间,单位是ms,默认是0,表示永久等待。该函数仅在至少创建了一个HighGUI窗口并且该窗口处于活动状态时才有效。如果有多个HighGUI窗口,则其中任何一个都可以处于活动状态。
相关文章:
OpenCV入门(二)快速学会OpenCV1图像基本操作
OpenCV入门(一)快速学会OpenCV1图像基本操作 不讲大道理,直接上干货。操作起来。 众所周知,OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大。今天就从读取图片,显示图片,输出图片信息和简单的…...
Redis源码---有序集合为何能同时支持点查询和范围查询
目录 前言 Sorted Set 基本结构 跳表的设计与实现 跳表数据结构 跳表结点查询 跳表结点层数设置 哈希表和跳表的组合使用 前言 有序集合(Sorted Set)是 Redis 中一种重要的数据类型,它本身是集合类型,同时也可以支持集合中…...
从计费出账加速的设计谈周期性业务的优化思考
1号恐惧症 你有没有这样的做IT的朋友?年纪轻轻,就头发花白或者秃顶,然后每个月周期性的精神不振,一到月底,就有明显的焦虑。如果有,他可能就是运营商行业做计费运营的,请对他好点,特…...
垃圾回收的概念与算法(第四章)
《实战Java虚拟机:JVM故障诊断与性能优化 (第2版)》 第4章 垃圾回收的概念与算法 目标: 了解什么是垃圾回收学习几种常用的垃圾回收算法掌握可触及性的概念理解 Stop-The-World(STW) 4.1. 认识垃圾回收 - 内存管理清洁工 垃圾…...
让您的客户了解您的制造过程“VR云看厂实时数字化展示”
一、工厂云考察,成为市场热点虚拟现实(VR)全景技术问世已久,但由于应用范围较为狭窄,一直未得到广泛应用。国外客户无法亲自到访,从而导致考察难、产品取样难等问题,特别是对于大型制造企业来说…...
CV——day80 读论文:DLT-Net:可行驶区域、车道线和交通对象的联合检测
DLT-Net:可行驶区域、车道线和交通对象的联合检测I. INTRODUCTIONII. ANALYSIS OF PERCEPTIONIV. DLT-NETA. EncoderB. Decoder1) Drivable Area Branch(可行驶区域分支)2) Context Tensor(上下文张量)3) Lane Line Branch(车道线分支)4) Traffic Object Branch(目标检测对象分…...
工具篇4.5数据可视化工具大全
1.1 Flourish 数据可视化不仅是一项技术,也是一门艺术。当然,数据可视化的工具也非常多,仅 Python 就有 matplotlib、plotly、seaborn、bokeh 等多种可视化库,我们可以根据自己的需要进行选择。但不是所有的人都擅长写代码完成数…...
京东前端二面常考手写面试题(必备)
实现发布-订阅模式 class EventCenter{// 1. 定义事件容器,用来装事件数组let handlers {}// 2. 添加事件方法,参数:事件名 事件方法addEventListener(type, handler) {// 创建新数组容器if (!this.handlers[type]) {this.handlers[type] …...
如何用AST还原某音的JSVMP
1. 什么是JSVMP vmp简单来说就是将一些高级语言的代码通过自己实现的编译器进行编译得到字节码,这样就可以更有效的保护原有代码,而jsvmp自然就是对JS代码的编译保护,具体的可以看看H5应用加固防破解-JS虚拟机保护方案。 如何区分是不是jsv…...
【蓝桥杯试题】 递归实现指数型枚举例题
💃🏼 本人简介:男 👶🏼 年龄:18 🤞 作者:那就叫我亮亮叭 📕 专栏:蓝桥杯试题 文章目录1. 题目描述2. 思路解释2.1 时间复杂度2.2 递归3. 代码展示最后&#x…...
【用Group整理目录结构 Objective-C语言】
一、接下来,我们看另外一个知识点,怎么用Group把这一堆乱七八糟的文件给它整理一下,也算是封装一下吧, 1.这一堆杂乱无章的文件: 那么,哪些类是属于模型呢,哪些类是属于视图呢,哪些类是属于控制器呢, 我们接下来通过Group的方式,来给它们分一下类, 这样看起来就好…...
JavaScript高级程序设计读书分享之8章——8.1理解对象
JavaScript高级程序设计(第4版)读书分享笔记记录 适用于刚入门前端的同志 创建自定义对象的通常方式是创建 Object 的一个新实例,然后再给它添加属性和方法。 let person new Object() person.name Tom person.age 18 person.sayName function(){//示 this.name…...
代码随想录算法训练营第四十天 | 343. 整数拆分,96.不同的二叉搜索树
一、参考资料整数拆分https://programmercarl.com/0343.%E6%95%B4%E6%95%B0%E6%8B%86%E5%88%86.html 视频讲解:https://www.bilibili.com/video/BV1Mg411q7YJ不同的二叉搜索树https://programmercarl.com/0096.%E4%B8%8D%E5%90%8C%E7%9A%84%E4%BA%8C%E5%8F%89%E6%90…...
数据结构与算法系列之顺序表的实现
这里写目录标题顺序表的优缺点:注意事项test.c(动态顺序表)SeqList.hSeqList.c各接口函数功能详解void SLInit(SL* ps);//定义void SLDestory(SL* ps);void SLPrint(SL* ps);void SLPushBack(SL* ps ,SLDataType * x );void SLPopBack(SL* ps…...
基于Linux_ARM板的驱动烧写及连接、挂载详细过程(附带驱动程序)
文章目录前言一、搭建nfs服务二、ARM板的硬件连接三、putty连接四、挂载共享文件夹五、烧写驱动程序六、驱动程序示例前言 本文操作环境:Ubuntu14.04、GEC6818 这里为似懂非懂的朋友简单叙述该文章的具体操作由来,我们的主要目的是将写好的驱动程序烧进…...
python-爬虫-字体加密
直接点 某8网 https://*****.b*b.h*****y*8*.com/ 具体网址格式就是这样的但是为了安全起见,我就这样打码了. 抛出问题 我们看到这个号码是在页面上正常显示的 F12 又是这样就比较麻烦,不能直接获取.用requests库也是获取不到正常想要的 源码的,因为字体加密了. 查看页面源代码…...
计算机组成原理4小时速成5:输入输出系统,io设备与cpu的链接方式,控制方式,io设备,io接口,并行串行总线
计算机组成原理4小时速成5:输入输出系统,io设备与cpu的链接方式,控制方式,io设备,io接口,并行串行总线 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,…...
安全狗受聘成为福州网信办网络安全技术支撑单位
近日,福州市委网信办召开了2022年度网络安全技术支撑单位总结表彰大会。 作为国内云原生安全领导厂商,安全狗也出席了此次活动。 据悉,会议主要对2022年度优秀支撑单位进行表彰,并为2023年度支撑单位举行授牌仪式。 本次遴选工…...
RV1126 在Ubuntu18.04开发环境搭建
1:安装软件终端下输入安装命名:sudo apt install openssh-serversudo apt install android-tools-adbsudo apt install vim net-tools gitsudo apt install cmakesudo apt install treesudo apt install minicomsudo apt install gawksudo apt install bisonsudo ap…...
如何在 C++ 中调用 python 解析器来执行 python 代码(一)?
实现 Python UDF 中的一步就是学习如何在 C 语言中调用 python 解析器。本文根据 Python 官方文档做了一次实验,记录如下: 1. 安装依赖包 $sudo yum install python3-devel.x86_642. 使用 python-config 来生成编译选项 $python3.6-config --cflags -…...
操作系统权限提升(二十三)之Linux提权-通配符(ws)提权
系列文章 操作系统权限提升(十八)之Linux提权-内核提权 操作系统权限提升(十九)之Linux提权-SUID提权 操作系统权限提升(二十)之Linux提权-计划任务提权 操作系统权限提升(二十一)之Linux提权-环境变量劫持提权 操作系统权限提升(二十二)之Linux提权-SUDO滥用提权 利用通配符…...
Zookeeper下载和安装
Zookeeper 1.下载 官方下载地址:https://zookeeper.apache.org/ 版本:apache-zookeeper-3.7.1-bin.tar.gz 2. 安装 2.1 本地安装 2.1.1 安装JDK 见:Hadoop集群搭建 2.1.2 上传安装包 使用远程工具拷贝安装包到Linux指定路径 /opt/s…...
Biomod2 (上):物种分布模型预备知识总结
Biomod11.栅格数据处理1.1 读取一个栅格图片1.2 计算数据间的相关系数1.3 生成多波段的栅格图像1.4 修改变量名称1.4.1 计算多个变量之间的相关性2. 矢量数据处理2.1 提取矢量数据2.2 数据掩膜2.2 栅格计算2.3 拓展插件的使用3. 图表绘制3.1 遥感影像绘制3.2 柱状图分析图绘制3…...
操作指南:如何高效使用Facebook Messenger销售(二)
上一篇文章我们介绍了使用Facebook Messenger作为销售渠道的定义、好处及注意事项,本节我们将详细介绍怎么将Facebook Messenger销售与SaleSmartly(ss客服)结合,实现一站式管理多主页配图来源:SaleSmartly(…...
计算机三级|网络技术|中小型网络系统总体规划与设计方案|IP地址规划技术|2|3
p3 p4一、中小型网络系统总体规划与设计方案网络关键的设备选型路由器技术指标性能指标综述吞吐量背板能力丢包率时延抖动突发处理能力路由表容量服务质量网管能力可靠性和可用性1 吞吐量指路由器的包转发能力,涉及两个内容:端口吞吐量和整机吞吐量&…...
为什么一定要做集成测试?
集成测试,我们都不陌生,几乎我们产品每天都在进行。但是我们真的有好好思考:为什么一定要做集成测试吗?只是为了简单的将“积木”搭起来就行,还是有什么其他的深意? 深意可能不一定会有,但是意…...
前端:CSS
CSS基本语法规则:选择器若干属性声明 style标签:可以放到代码的任意位置处,head/body中都可以 三种写CSS的方式: 1、内部样式:使用style标签,直接把CSS写到html文件中。此时的style标签可以放到任何位置…...
CMMI—组织级过程定义(OPD)
大家好,我是Doker 多克!一、目的组织级过程定义(Organizational Process Definition, OPD)的目的在于建立并维护一套可用的组织级过程资产、工作环境标准以及团队规则与指南二、简介组织级过程资产使得整个组织具有一致…...
华为OD机试真题Python实现【猜字谜】真题+解题思路+代码(20222023)
猜字谜 题目 小王设计了一个简单的猜字谜游戏,游戏的谜面是一个错误的单词,比如nesw,玩家需要猜出谜底库中正确的单词。 猜中的要求如下: 对于某个谜面和谜底单词,满足下面任一条件都表示猜中: 变换顺序以后一样的,比如通过变换w和e的顺序,nwes跟news是可以完全对应的…...
软测入门(三)Selenium(Web自动化测试基础)
Selenium(Web端自动测试) Selenium是一个用于Web应用程序测试的工具:中文是硒 开源跨平台:linux、windows、mac核心:可以在多个浏览器上进行自动化测试多语言 Selenium WebDriver控制原理 Selenium Client Library…...
专业建设外贸网站制作江门/站长之家ppt模板
-- Start 在上一篇中,我们学会了如何创建节点以及如何保存数据到节点中,那么什么是节点呢?其实节点就像文件一样,是用来保存数据的,只不过在 ZooKeeper 中,我们把它称之为节点。如果有成千上万个节点&…...
建设电商网站/培训机构不退费最有效方式
linux shell命令下我们可以通过相关命令关闭和重启计算机,下面由学习啦小编为大家搜集整理了linux shell的关机命令是什么的相关知识,希望对大家有帮助!linux shell的关机命令问题描述对于Linux系统而言,许多时候是用于服务器之类的ÿ…...
广州 天河网站设计/刚刚刚刚刚刚好痛
本文源码基于jdk1.8 。 一、创建线程有哪几种方式(实现Runnable接口和继承Thread类) Runnable 接口 我们看Thread类的定义知道,它实现了Runable接口 public class Thread implements Runnable {... } 而Runnable接口的定义如下: Functi…...
政府网站建设常出现的问题/sem全称
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 JUC并发编程系列文章 http://t.csdn.cn/UgzQi 文章目录系列文章目录JUC并发编程系列文章前言一、Java内存模…...
如何做付款网站/搜索引擎优化方案
文章目录1.使用EhCache实现缓存1.引入maven依赖1.1开启缓存2.使用redis实现缓存2.1引入maven依赖2.2在application配置redis连接参数2.3通过代码的方式获取spring框架applicationcontext对象2.4RedisCacheManager与RedisCacheRedisCacheRedisCacheMananger2.5shiroConfig开启缓…...
修车店怎么做网站/官网优化包括什么内容
C#中提供了好多格式化数字或字符串的方法,但在项目开发中,有很多自己需要的格式无法实现,那就需要我们去定义IFormatProvider,其实很简单,只需继承二个接口,然后实现二个方法就可以了。ICustomFormatter接口中实现Form…...