第一章:OpenCV入门
OpenCV是一个开源的计算机视觉库,1999年有英特尔的Gary Bradski启动。OpenCV库由C和C++语言编写,涵盖计算机视觉各个领域内的500多个函数,可以在多个操作系统上运行。它旨在提供一个简洁而又高效的接口,从而帮助共夺得开发人员快速的构建视觉系统。
本章主要介绍OpenCV的简单使用
图像处理的基本操作:
图像处理的最基本操作包括:
- 读取图像
- 显示图像
- 保存图像
1. 读取图像:
在OpenCV中使用cv2.imread()函数来读取图像,该函数支持各种静态图像格式。
语法为:retval = cv2.imread( filename[, flags] )
- retval:返回值,读取到的图像。如果未读取到图像,则返回 None
- filename:表示要读取的图像的完整路径。
- flags:是读取标记。该标记用来控制读取文件的类型,具体如下表表示。
注意:表中第一列参数和第三列参数是等价的。即:cv2.IMREAD_UNCHANGED = -1
值 | 含义 | 数值 |
---|---|---|
cv2.IMREAD_UNCHANGED | 保持原格式不变 | -1 |
cv2.IMREAD_GRAYSCALE | 将图像调整为单通道灰度图像 | 0 |
cv2.IMREAD_COLOR | 将图像调整为3通道的BGR图像。该值是默认值 | 1 |
cv2.IMREAD_ANYDEPTH | 当载入的图像深度为16位或者32位时,就返回其对应深度的图像;否则,将其转换为8位图像 | 2 |
cv2.IMREAD_ANYCOLOR | 以任何可能的颜色格式读取图像 | 4 |
cv2.IMREAD_LOAD_GDAL | 使用gdal驱动程序加载图像 | 8 |
cv2.IMREAD_REDUCED_GRAYSCALE_2 | 将图像转化为单通道灰度图像,并将图像尺寸减小1/2 | |
cv2.IMREAD_REDUCED_COLOR_2 | 将图像转换为3通道BGR彩色图像,并将图像尺寸减小1/2 | |
cv2.IMREAD_REDUCED_GRAYSCALE_4 | 将图像转化为单通道灰度图像,并将图像尺寸减小1/4 | |
cv2.IMREAD_REDUCED_COLOR_4 | 将图像转换为3通道BGR彩色图像,并将图像尺寸减小1/4 | |
cv2.IMREAD_REDUCED_GRAYSCALE_8 | 将图像转化为单通道灰度图像,并将图像尺寸减小1/8 | |
cv2.IMREAD_REDUCED_COLOR_8 | 将图像转换为3通道BGR彩色图像,并将图像尺寸减小1/8 | |
cv2.IMREAD_IGNORE_ORIENTATION | 不以EXIF的方向为标记旋转图像 |
函数cv2.imread()支持读取多种不同类型的图像:
例如:使用cv2.imread()函数读取图像
import cv2
lena = cv2.imread("sky.png")
print(lena)
2. 显示图像:
在OpenCV中提供了多个与显示相关的函数:
-
namedWidow函数:
-
用来创建指定名称的窗口
-
语法格式:None = cv2.namedWindow( winname ) 式中 winname 指的是创建窗口的名称
例如创建一个名字为lesson的窗口CV2.namedWindow("lesson")
-
imshow函数:
- 用来显示图像
- 语法格式:None = cv2.imshow( winname, mat ) 式中winname为窗口名称,mat为要显示的图像。
例如:
import cv2 lena = cv2.imread("lena.bmp") cv2.namedWindow("lesson") cv2.imshow("lesson", lena)
上述代码中,首先通过cv2.imread()函数读取图像lena.bmp,然后通过cv2.namedWindow()函数创建了一个名为lesson的窗口,最后通过cv2.imshow()函数在lesson窗口中显示图像lena.bmp。
注意:在实际使用中也可以不创建窗口,直接使用函数cv2.imshow()引用一个并不存在的创空,并在其中显示指定的图像,如:
import cv2 lena = cv2.imread("lena.bmp") cv2.imshow("demo", lena)
-
waitKey函数:
- 用来等待按键,当用户按下键盘后,该语句会被执行,并返回一个值
- 语法:retval = cv2.waitKey([delay])
- retval:表示返回值。如果没有按键被按下,则返回-1;如果有按键备案下则返回该按键的ASCII码
- delay:表示等待键盘触发的时间,单位是ms。当该值为负数或者0时,表示无限等待。默认为0
实际使用中,可以通过函数cv2.waitKey()获取按下的按键,并针对不同的键做出不同的反应从而实现交互功能
import cv2 lenam = cv2.imread("lena.png") cv2.imshow("demo", lena) key = cv2.waitKey() if key == ord("A"):CV2.imshow("PressA", lena) elif key == ord("B"):cv2.imshow("PressB", lena)
-
destroyWindow函数:
- 用来释放(销毁)指定窗口
- 语法:None = cv2.destroyWindow( winname ) winname为窗口名字
import cv2 lena = cv2.imread("lena.png") cv2.imshow("demo", lena) cv2.waitKey() cv2.destroyWindow("demo")
-
destroyAllWindows函数
- 用来释放(销毁)所有窗口
- 语法:None = cv2.destroyAllWindows()
import cv2 lena = cv2.imread("lena.png") cv2.imshow("demo1", lena) cv2.imshow("demo2", lena) cv2.waitKey() cv2.destroyAllWindows()
3. 保存图像
在OpenCV中使用函数cv2.imwrite()来保存图像,该函数的语法是:
- retval = cv2.imwrite( filename , img [, params ])
参数:
- retval:返回值。如果保存成功,则返回True;如果失败,则返回False
- filename:要保存目标文件的完整路径。
- img:要保存的图像
- params:保存类型参数,可选。
import cv2
lena = cv2.imread("lena.png")
r = cv2.imwrite("result.png", lena)
OpenCV贡献库介绍
目前,OpenCV库包含如下两部分:
- OpenCV主库:即通常安装的OpenCV库,该库成熟稳定,有核心的OpenCV团队维护
- OpenCV贡献库:该扩展库的名称为opencv_contrib,主要有社区开发和维护,其包含的视觉应用比OpenCV主库更全面。需要注意的是,OpenCV贡献库中包含非OpenCV许可的部分,并且包含专利保护的算法。因此使用该模块前需要特别注意。
- OpenCV贡献库中包含非常多的扩展模块:
- bioinspired:生物视觉模块
- datasets:数据集读取模块
- dnn:深度神经网络模块
- face:人脸识别模块
- matlab:MATLAB接口模块
- stereo:双目立体匹配模块
- text:视觉文本匹配模块
- tracking:基于视觉的目标跟踪模块
- ximgpro:图像处理扩展模块
- xobjdetect:增强2D目标检测模块
- datasets:数据集读取模块
- dnn:深度神经网络模块
- face:人脸识别模块
- matlab:MATLAB接口模块
- stereo:双目立体匹配模块
- text:视觉文本匹配模块
- tracking:基于视觉的目标跟踪模块
- ximgpro:图像处理扩展模块
- xobjdetect:增强2D目标检测模块
- xphoto:计算 摄影扩展模块