OpenCV 入门






4.47/5 (7投票s)
在本文中,让我们开始动手使用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)的使用。