OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了很多函数,这些函数非常**地实现了计算机视觉算法(基本的滤波到**的物体检测皆有涵盖)。在本章的内容中,将详细讲解在Python程序中使用OpenCV实现图像视觉处理的知识,为读者步入本书后面知识的学习打下基础。
3.1 OpenCV基础
OpenCV是计算机视觉中经典的专用库,它支持多语言和跨平台,功能强大。为了让Python***使用OpenCV的强大功能,OpenCV提供了Python接口库OpenCV-Python,***通过调用OpenCV-Python中的成员模块和方法,从而可以在Python程序中使用OpenCV的强大功能。
3.1.1 OpenCV介绍
OpenCV由Gary Bradsky(加里·布拉德斯基)于1999年在英特尔创立。Gary Bradsky当时在英特尔任职,怀着为计算机视觉和人工智能的从业者提供稳定的基础架构并以此来推动产业发展的美好愿景,启动了OpenCV项目。
OpenCV支持多种编程语言,例如C 、Python、Java等,并且可在Windows、Linux、OS X、Android和iOS等不同平台上使用。OpenCV 的应用领域非常广泛,包括图像拼接、图像降噪、产品质检、人机交互、人脸识别、动作识别、动作跟踪、无人驾驶等。
OpenCV 的一个目标是提供易于使用的计算机视觉接口,从而帮助人们快速建立精巧的视觉应用。OpenCV 库包含从计算机视觉各个领域衍生出来的 500 多个函数,包括工业产品质量检验、医学图像处理、安保领域、交互操作、相机校正、双目视觉以及机器人学。
因为计算机视觉和机器学习经常在一起使用,所以 OpenCV 也包含一个完备的、具有通用性的机器学习库(ML模块)。这个子库聚焦于统计模式识别以及聚类。ML 模块对 OpenCV 的核心任务(计算机视觉)相当有用,但是这个库也足够通用,可以用于任意机器学习问题。
3.1.2 OpenCV-Python介绍
OpenCV-Python是指解决计算机视觉问题的Python专用库。与C/C 之类的语言相比,Python语言的速度较慢。也就是说,可以使用C/C 轻松扩展Python,这使我们能够用C/C 编写计算密集型代码并创建可用作Python模块的Python包装器。这会带来以下两个好处。
(1) 运行效率相差无几,因为实际上在后台运行的是通过OpenCV-Python调用的C 代码。
(2) 在Python中比在C/C 中更加容易地编写代码,OpenCV-Python是原始OpenCV C 实现的Python包装器。
OpenCV-Python利用了NumPy,这是一个高度优化的库,用于使用MATLAB样式的语法进行数值运算。所有OpenCV数组结构都与NumPy数组相互转换。这也使与使用NumPy的其他库(例如SciPy和Matplotlib)的集成变得更加容易。
3.1.3 安装OpenCV-Python
在Windows系统中安装Python后,可以使用��下pip命令安装OpenCV-Python: pip install opencv-python 本书中的内容只涉及了OpenCV-Python,它只包含OpenCV的主要模块,这是完全免费的。其实还有一个库:opencv-contrib-python,这个库包含了OpenCV的主要模块以及扩展模块,扩展模块主要包含了一些带专利的收费算法(如shift特征检测)以及一些在测试的新的算法(稳定后会合并到主要模块)。在Windows系统中安装Python后,可以使用如下pip命令安装opencv-contrib-python: pip install opencv-contrib-python 3.2 OpenCV-Python图像操作
在本节的内容中,首先学习读取图像、显示图像以及保存图像的知识,然后讲解绘图、图像算法和几何变换的知识。
3.2.1 读取并显示图像
1. 读取图像
在OpenCV-Python中,使用内置函数cv.imread()读取图像,被读取的图像应该在工作目录中,或使用图像的完整路径。函数cv.imread()的语法格式如下: cv.imread(filepath,flags) 参数说明如下。
? filepath:表示要读入图片的完整路径。
? flags:读入图片的标志,用于设置读取图像的方式,主要方式如下。
? cv.IMREAD_COLOR:加载彩色图像,用整数1表示。任何图像的透明度都会被忽视,这是默认标志值。
? cv.IMREAD_GRAYSCALE:以灰度模式加载图像,用整数0表示。
? cv.IMREAD_UNCHANGED:加载图像,包括alpha通道,用-1表示。
2. 显示图像
在OpenCV-Python中,使用内置函数cv.imshow()可在窗口中显示图像,窗口会自动适合图像的尺寸大小。函数cv.imshow()的语法格式如下: cv.imshow(winname, mat) 参数说明如下。
? winname:表示窗口名称,它是一个字符串。
? mat:表示要显示的图像对象,我们可以根据需要创建任意多个窗口,也可以使用不同的窗口名称。
在下面的实例文件cv01.py中,演示了使用OpenCV-Python读取并显示指定图像的过程。
源码路径:daima\3\cv01.py
import cv2 as cv
print( cv.__version__ )
#加载彩色灰度图像
img = cv.imread('111.jpg',0)
cv.imshow('image',img)
cv.waitKey(0)
cv.destroyAllWindows() 代码说明如下。
? cv.__version__的功能是显示当前安装的OpenCV-Python版本。
? cv.imread('111.jpg',0)的功能是用灰度模式加载图片111.jpg,后通过函数imshow('image',img)显示图片111.jpg。
? cv.waitKey()是一个键盘绑定函数,其参数表示的时间以毫秒为单位。该函数等待任何键盘事件指定的毫秒。如果在这段时间内按下任何键,程序都将继续运行。如果**0**被传递,它将无限期地等待一次敲击键。它也可以设置为检测特定的按键,例如按下键A等。
? cv.destroyAllWindows()会销毁创建的所有窗口,如果要销毁任何特定的窗口,可使用函数 cv.destroyWindow()在其中传递确切的窗口名称作为参数。
执行效果如图3-1所示。
图3-1 执行效果
注意:在特殊情况下,可以创建一个空窗口,然后再将图像加载到该窗口。在这种情况下,可以指定窗口是否可调整大小,这是通过功能函数cv.namedWindow()实现的。在默认情况下,该标志为cv.WINDOW_AUTOSIZE。但是,如果将标志指定为cv.WINDOW_NORMAL,则可以调整窗口大小。当图像尺寸过大以及向窗口添加跟踪栏时,这将很有帮助。例如下面的代码:
cv.namedWindow('image',cv.WINDOW_NORMAL)
cv.imshow('image',img)
cv.waitKey(0)
cv.destroyAllWindows()