计算机视觉是一门研究如何使用计算机软件和硬件模拟和重现人类视觉的学科。在本章中,您将详细了解这方面内容。
计算机视觉
计算机视觉是一个研究如何从图像的二维视图重构、中断并理解三维场景及其结构属性的领域。
计算机视觉层次
计算机视觉分为三个基本类别:
-
-
-
高级视觉 —— 包括对场景的概念描述,如活动、意图和行为。
计算机视觉 vs 图像处理
图像处理研究的是图像到图像的变换。输入和输出都是图像。
计算机视觉则是从图像中构造出明确、有意义的物理对象描述。计算机视觉的输出是对三维场景中结构的描述或解释。
应用
计算机视觉在以下领域找到应用:
安装有用的包
对于使用 Python 进行计算机视觉的应用,可以使用一个名为 OpenCV(开源计算机视觉库)的流行库。这是一个主要针对实时计算机视觉应用的编程函数库。OpenCV 用 C++ 编写,其主要接口也是 C++。您可以通过以下命令来安装此包:
pip install opencv_python-X.X-cp36-cp36m-winX.whl
这里的 X
表示您机器上安装的 Python 版本以及您使用的 32 位或 64 位版本。
如果您使用的是 Anaconda 环境,可以使用以下命令来安装 OpenCV:
conda install -c conda-forge opencv
读取、写入和显示图像
大多数计算机视觉应用程序需要获取图像作为输入并生成图像作为输出。在本节中,您将学习如何使用 OpenCV 提供的功能来读取和写入图像文件。
OpenCV 函数用于读取、显示和写入图像文件
OpenCV 提供了以下功能用于此目的:
-
imread()
函数 —— 这是用来读取图像的函数。OpenCV imread()
支持多种图像格式,如 PNG, JPEG, JPG, TIFF 等。
-
imshow()
函数 —— 这是用来在一个窗口中显示图像的函数。窗口会自动适应图像大小。OpenCV imshow()
支持多种图像格式,如 PNG, JPEG, JPG, TIFF 等。
-
imwrite()
函数 —— 这是用来写入图像的函数。OpenCV imwrite()
支持多种图像格式,如 PNG, JPEG, JPG, TIFF 等。
示例
下面的示例展示了读取一种格式的图像——在窗口中显示它,并将同一图像以另一种格式写入的 Python 代码。请考虑下面的步骤:
导入 OpenCV 包:
import cv2
现在,使用 imread()
函数读取特定的图像:
image = cv2.imread('image_flower.jpg')
使用 imshow()
函数显示图像。您可以看到图像的窗口名称为 image_flower
:
cv2.imshow('image_flower', image)
cv2.destroyAllWindows()
现在,我们可以使用 imwrite()
函数将同一图像写入其他格式,比如 .png
:
cv2.imwrite('image_flower.png', image)
输出结果 True
表明图像已经成功地在同一文件夹内以 .png
文件格式写入。
True
注释 —— destroyAllWindows()
函数简单地销毁了我们创建的所有窗口。
色彩空间转换
在 OpenCV 中,图像并不是使用常规的 RGB 颜色存储的,而是以相反的顺序,即 BGR 顺序存储的。因此,默认的颜色编码是在读取图像时使用 BGR。cvtColor()
函数用于将图像从一种颜色编码转换为另一种。
示例
下面的例子展示了如何将图像从 BGR 转换为灰度。
导入 OpenCV 包
import cv2
读取特定的图像
image = cv2.imread('image_flower.jpg')
使用 imshow()
函数查看这张图片,可以看到这张图片是以 BGR 格式存在的
cv2.imshow('BGR_Penguins', image)
使用 cvtColor()
函数将这张图片转换为灰度
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray_penguins', image)
边缘检测
人类在看到草图后能够轻易地识别出许多物体类型及其姿态。这就是为什么边缘在人类生活中以及计算机视觉的应用中扮演着重要的角色。OpenCV 提供了一个非常简单且实用的函数 Canny()
用于检测边缘。
边缘检测示例
下面的示例清楚地标识出了边缘。
导入 OpenCV 包
import cv2
import numpy as np
读取特定的图像
image = cv2.imread('Penguins.jpg')
使用 Canny()
函数检测已经读取图像的边缘
cv2.imwrite('edges_Penguins.jpg', cv2.Canny(image, 200, 300))
使用 imshow()
函数展示带有边缘的图像
cv2.imshow('edges', cv2.imread('edges_Penguins.jpg'))
这个 Python 程序将会创建一个带有边缘检测的名为 edges_penguins.jpg
的图像。
边缘企鹅图像
人脸识别
人脸识别是计算机视觉中最引人入胜的应用之一,它使技术更加现实也更具未来感。OpenCV 内置了进行人脸识别的功能。我们将使用 Haar 级联分类器来进行人脸识别。
Haar 级联数据
使用 Haar 级联分类器时,我们需要数据。这些数据可以在 OpenCV 包中找到。安装完 OpenCV 后,你会看到一个名为 haarcascades
的文件夹。在这个文件夹中有适用于不同应用的 .xml
文件。现在,根据不同的用途复制所有相关文件,并将它们粘贴到当前项目的新的文件夹中。
示例
下面是一个使用 Haar 级联进行人脸检测的 Python 代码示例,该示例检测如下图所示的 Amitabh Bachan 的脸部:
导入 OpenCV 包
import cv2
import numpy as np
使用 Haar 级联分类器检测脸部
face_detection = cv2.CascadeClassifier('D:/ProgramData/cascadeclassifier/haarcascade_frontalface_default.xml')
读取特定的图像
img = cv2.imread('AB.jpg')
将图像转换为灰度图像,因为它接受灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
使用 face_detection.detectMultiScale
进行实际的人脸检测
faces = face_detection.detectMultiScale(gray, 1.3, 5)
在整个脸部周围绘制矩形
for (x, y, w, h) in faces:
img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 3)
cv2.imwrite('Face_AB.jpg', img)
眼睛检测
眼睛检测是计算机视觉中另一个迷人的应用,它使得技术更加现实也更具未来感。OpenCV 内置了进行眼睛检测的功能。我们将使用 Haar 级联分类器来进行眼睛检测。
示例
下面的示例给出了使用 Haar 级联检测给定图像中 Amitabh Bachan 的眼睛的 Python 代码:
导入 OpenCV 包
import cv2
import numpy as np
使用 Haar 级联分类器检测眼睛
eye_cascade = cv2.CascadeClassifier('D:/ProgramData/cascadeclassifier/haarcascade_eye.xml')
使用 imread()
函数读取特定的图像
img = cv2.imread('AB_Eye.jpg')
将图像转换为灰度图像,因为它接受灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
使用 eye_cascade.detectMultiScale
进行实际的眼睛检测
eyes = eye_cascade.detectMultiScale(gray, 1.03, 5)
在整个眼睛周围绘制矩形
for (ex, ey, ew, eh) in eyes:
img = cv2.rectangle(img, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)
cv2.imwrite('Eye_AB.jpg', img)
这个 Python 程序将会创建一个带有眼睛检测的名为 Eye_AB.jpg
的图像。