65.9K
CodeProject 正在变化。 阅读更多。
Home

OpenCV 入门

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.47/5 (7投票s)

2020年6月18日

CPOL

3分钟阅读

viewsIcon

12197

downloadIcon

300

在本文中,让我们开始动手使用OpenCV。

引言

这是我们关于学习Python及其在机器学习和人工智能中的应用系列的第五个模块。我们刚刚快速浏览了一些有趣的库,现在让我们开始动手使用OpenCV!

安装

可以通过pip安装OpenCV,在Jupyter Notebook单元格中运行以下命令:

!pip install --upgrade opencv-python

pip是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可以处理它。

图片鸣谢:NASA

目标检测

OpenCV可以做的事情很多。我们将重点关注目标检测。

目标检测使用所谓的级联分类器。这种方法使用机器学习:分类器在包含所需目标的图像(正样本)和不包含所需目标的图像(负样本)上进行训练。您可以训练您自己的分类器,但OpenCV还提供了一些预训练模型,可以从他们的GitHub下载

让我们尝试一下俄罗斯车牌的预训练分类器,haarcascade_russian_plate_number.xml。如果您想测试图像,可以使用Sergey Rodovnichenko拍摄的拉达维斯塔图像

我们可以读取图像并绘制它以查看一切是否正常,就像之前一样。

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的俄罗斯车牌预训练分类器,但这并非唯一可用的分类器。还有一些用于人脸、眼睛等的预训练分类器,它们的使用方式与这个分类器完全相同。

后续步骤

我们只触及了OpenCV功能的表面。OpenCV拥有更多处理功能(变换、滤波器、二维特征检测等),并且可以实时处理视频帧。互联网上有大量关于OpenCV的资料。官方教程是一个不错的起点,但是如果您针对想要使用OpenCV解决的问题进行搜索,您还会找到很多帮助。

下一个模块中,我们将讨论自然语言工具包(NLTK)的使用。

© . All rights reserved.