在机器学习和人工智能领域,图像处理是一个重要的组成部分。OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它提供了大量的图像处理和机器学习功能。本文将介绍如何安装OpenCV,并使用其进行基本的图像处理和对象检测。
OpenCV可以通过pip安装,在Jupyter Notebook中运行以下命令即可:
!pip install --upgrade opencv-python
这将确保包被安装到Anaconda环境中。如果安装成功,以下Python代码应该可以无错误地运行:
import cv2
为了在Jupyter Notebook中显示图像,还需要确保安装了matplotlib:
!pip install --upgrade matplotlib
读取OpenCV可以处理的图像非常简单:
import cv2
im = cv2.imread("path/to/image.jpg")
OpenCV支持多种图像格式,如果无法解析图像,imread的结果将是None。注意,如果图像文件未找到,也不会抛出错误——结果将是None。
假设找到了图像,可以使用matplotlib在Jupyter Notebook中绘制它。为此,将使用这个辅助函数:
from matplotlib import pyplot
def plot_img(img):
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
pyplot.imshow(rgb)
OpenCV以BGR颜色格式读取图像,但matplotlib需要RGB格式,所以首先需要转换图像。然后可以绘制它。
可以使用以下方式使用这个函数:
plot_img(im)
OpenCV和matplotlib之所以能够如此干净地集成,是因为OpenCV图像实际上是一个多维NumPy数组,包含像素值,而matplotlib可以处理它。
OpenCV可以做很多事情。将特别关注对象检测。对象检测使用所谓的级联分类器。这种方法使用机器学习:分类器既在包含所需对象的图像(正图像)上训练,也在不包含它的图像(负图像)上训练。可以训练自己的分类器,但OpenCV也提供了几个预训练的模型,可以从他们的GitHub上下载。
让尝试使用预训练的俄罗斯车牌分类器haarcascade_russian_plate_number.xml
。如果想测试图像,可以使用Sergey Rodovnichenko的这张Lada Vesta图片。
可以读取图像并绘制它,以确保一切顺利,就像之前一样:
car = cv2.imread("Pictures/lada-vesta.jpg")
plot_img(car)
接下来,创建分类器:
classifier = cv2.CascadeClassifier()
classifier.load("path/to/haarcascade_russian_plate_number.xml")
检测工作是通过detectMultiScale方法完成的:
plates = classifier.detectMultiScale(car)
这返回一个NumPy数组。它实际上是一个数组的数组,每个内部数组都是一个检测到的车牌的矩形边界,在格式[x, y, width, height]中。为了直观地显示它们,可以在图像上绘制矩形,然后绘制结果:
with_indicators = car
for plate in plates:
x, y, width, height = plate
with_indicators = cv2.rectangle(with_indicators, (x, y), (x + width, y + height), (0, 0, 255), 5)
矩形函数接受一个图像,一个左上角坐标,一个右下角坐标,一个颜色和一个厚度。它返回一个带有矩形的新图像。可以绘制结果:
plot_img(with_indicators)
这个例子演示了OpenCV的预训练俄罗斯车牌分类器,但这并不是唯一的。还有用于面部、眼睛等的预训练分类器,它们的使用方法与这个分类器完全相同。