计算机视觉关注于利用计算机软硬件建模和复制人类视觉。在本章中,你将详细了解这一点。

计算机视觉

计算机视觉是一门研究如何从二维图像中重建、中断并理解三维场景的学科,这些图像基于场景中存在的结构属性。

计算机视觉层级结构

计算机视觉分为以下三大类 −

  • 低层次视觉——它包括用于特征提取的过程图像。

  • 中级视觉 − 包括物体识别和三维场景解读

  • 高层次视觉——包括对场景的概念描述,如活动、意图和行为。

计算机视觉与图像处理

图像处理研究图像到图像的转换。图像处理的输入和输出都是图像。

计算机视觉是通过图像构建对物理物体进行明确且有意义的描述。计算机视觉的输出是对三维场景中结构的描述或解释。

应用

计算机视觉在以下领域有应用 −

机器人

  • 定位——自动确定机器人位置

  • 导航

  • 障碍物规避

  • 装配(孔中销钉、焊接、喷漆)

  • 作(例如PUMA机器人机械臂)

  • 人机交互(HRI):智能机器人用于与人互动和服务

医学

  • 分类与检测(例如病灶或细胞分类与肿瘤检测)

  • 2D/3D 分割

  • 三维人体器官重建(MRI或超声)

  • 视觉引导机器人手术

安全性

  • 生物识别(虹膜、指纹、面部识别)
  • 监控——检测某些可疑活动或行为

交通

  • 自动驾驶车辆
  • 安全,例如驾驶员警觉监测

工业自动化应用

  • 工业检查(缺陷检测)
  • 集会
  • 条码和包装标签读取
  • 对象排序
  • 文档理解(例如OCR)

安装有用软件包

对于用Python学习计算机视觉,可以使用一个流行的库OpenCV(Open Source Computer Vision)。它是一个主要面向实时计算机视觉的编程函数库。它用 C++ 编写,主要接口为 C++。你可以通过以下命令安装该软件包 −

pip install opencv_python-X.X-cp36-cp36m-winX.whl

这里X代表你机器上安装的Python版本以及你使用的win32或64位。

如果你正在使用 anaconda 环境,请使用以下命令安装 OpenCV −

conda install -c conda-forge opencv

阅读、书写与展示图像

大多数CV应用都需要输入图像并输出图像。在本节中,你将学习如何利用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

现在,读取特定图像时,使用imread()函数 −

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

现在,读取特定图像时,可以使用 imread() 函数。

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 Cascade Data

我们需要数据来使用Haar级联分类器。您可以在我们的OpenCV软件包中找到这些数据。安装OpenCV后,你可以看到文件夹名haarcascades。会有针对不同应用的.xml文件。现在,把所有文件复制出来用于不同用途,然后粘贴到当前项目下的新文件夹里。

示例

以下是利用Haar Cascade检测Amitabh Bachan面部的Python代码,如下图所示 −

ab face

如图所示导入 OpenCV 包 −

import cv2
import numpy as np

现在,使用HaarCascadeClassifier来检测人脸 −

face_detection=
cv2.CascadeClassifier('D:/ProgramData/cascadeclassifier/
haarcascade_frontalface_default.xml')

现在,读取特定图像时,使用imread()函数 −

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)

这个Python程序会生成一张名为Face_AB.jpg的图像,带有面部检测功能,如图所示

Face AB

眼球检测

眼睛检测是计算机视觉的另一个迷人应用,使其更加真实且富有未来感。OpenCV内置了进行眼睛检测的功能。我们将使用Haar级联分类器进行眼球检测。

示例

以下示例展示了使用 Haar Cascade 检测 Amitabh Bachan 面部的 Python 代码,如下图所示 −

Haar AB Face

如图所示导入 OpenCV 包 −

import cv2
import numpy as np

现在,使用HaarCascadeClassifier来检测人脸 −

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的图像,并带有眼睛检测功能,如图所示 −

Eye AB

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐