网站建设最关键的两个素材,做php网站用什么软件开发,百度指数网页版,织梦网站模板教程OpenCV入门#xff08;一#xff09;快速学会OpenCV1图像基本操作
不讲大道理#xff0c;直接上干货。操作起来。
众所周知#xff0c;OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大。今天就从读取图片#xff0c;显示图片#xff0c;输出图片信息和简单的…OpenCV入门一快速学会OpenCV1图像基本操作
不讲大道理直接上干货。操作起来。
众所周知OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大。今天就从读取图片显示图片输出图片信息和简单的界面编程和大家一起进入OpenCV的世界。
图像基本操作
1、读取图片
函数imread用于读取图像文件或加载图像文件声明如下
cv2.imread
cv2.imread (const String filename, int flagsIMREAD_COLOR)
其中参数filename表示要读取的图像文件名flags表示读取模式取值如下
· cv.IMREAD_ANYDEPTH其值是2取这个标志的话若载入的图像深度为16位或者32位就返回对应深度的图像否则转换为8位图像再返回。
· cv.IMREAD_COLOR其值是1取这个标志的话图像转为彩色图像BGR3通道。
· 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,dtypenp.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)输出结果
6734163.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)如果图像数据类型是8U8位无符号就直接显示。
(2)如果图像数据类型是16U16位无符号或32S32位有符号整数那么imshow函数内部会自动将每个像素值除以256并显示即将原图像素值的范围由[0-255×256]映射到[0~255]。
(3)如果图像数据类型是32F32位浮点数或64F64位浮点数那么imshow函数内部会自动将每个像素值乘以255并显示即将原图像素值的范围由[0-1]映射到[0~255]注意原图像素值必须要归一化。
需要注意的一点就是imshow之后必须有waitKey函数否则显示窗口将一闪而过不会驻留屏幕。
waitKey函数声明如下 waitKey([delay])其中参数delay表示一个延时值单位为ms默认为0永久延时一直等待直到用户按键。如果在指定时间之前没有按下任何键就返回-1如果在指定时间之前按下任何键就返回按键的对应值。
当delay≤0时函数waitKey无限地等待一个键事件当delay0时则等待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) % (i1)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窗口则其中任何一个都可以处于活动状态。