当前位置:
首页
文章
后端
详情

人工智能和机器学习系列(五) OpenCV库

简介

OpenCV 是一个用于(实时)图像处理的库,该模块简要介绍了 OpenCV 并演示了其对象检测功能。这是我们学习 Python 及其在机器学习和 AI 中的应用系列中的第五个模块。在上一个模块中,我们认识了许多ML和AI中相关的Python库,下面就一起来深入研究一下这些库的使用,我们先开始学习OpenCV的使用。

安装

OpenCV 可以通过 pip 安装,方法是在 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. 为此,我们将使用此辅助函数:

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​可以使用它。

图 1

物体检测

有很多是OpenCV的可以做。我们将特别关注对象检测。

对象检测与所谓的级联分类器一起工作。这种方法使用机器学习:分类器在包含所需对象的图像(正图像)和不包含它的图像(负图像)上进行训练。您可以训练自己的分类器,但 OpenCV 还提供了几个可从其 GitHub 下载的预训练模型。

让我们试试俄罗斯车牌的预训练分类器haarcascade_russian_plate_number.xml。如果您想要测试图像,可以使用Sergey Rodovnichenko 的 Lada Vesta 图像。

我们可以读取图像并绘制它以查看是否一切顺利,就像以前一样:

car = cv2.imread("Pictures/lada-vesta.jpg")
plot_img(car)

图 2

接下来,我们创建分类器:

蟒蛇复制代码

classifier = cv2.CascadeClassifier()
classifier.load("path/to/haarcascade_russian_plate_number.xml")

图 3

检测工作是通过以下​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)

图 4

这个例子展示了 OpenCV 的针对俄罗斯车牌的预训练分类器,但这并不是唯一可用的分类器。还有用于面部、眼睛等的预训练分类器,它们的使用方式与该分类器完全相同。

结论

我们只是触及了 OpenCV 功能的皮毛。OpenCV 具有更多处理功能(转换、过滤器、2D 特征检测等),并且可以实时处理视频帧。互联网上有很多关于 OpenCV 的资料。该官方教程是一个良好的开端,但你也可以找到很多的帮助,如果你想与OpenCV的解决问题专门进行搜索。


免责申明:本站发布的内容(图片、视频和文字)以转载和分享为主,文章观点不代表本站立场,如涉及侵权请联系站长邮箱:xbc-online@qq.com进行反馈,一经查实,将立刻删除涉嫌侵权内容。

同类热门文章

深入了解C++中的new操作符:使用具体实例学习

C++中的new操作符是动态分配内存的主要手段之一。在程序运行时,我们可能需要动态地创建和销毁对象,而new就是为此提供了便利。但是,使用new也常常会引发一些问题,如内存泄漏、空指针等等。因此,本文将通过具体的示例,深入介绍C++中的new操作符,帮助读者更好地掌握其使用。


深入了解C++中的new操作符:使用具体实例学习

怎么用Java反射获取包下所有类? 详细代码实例操作

Java的反射机制就是在运行状态下,对于任何一个类,它能知道这个类的所有属性和方法;对于任何一个对象,都能调用这个对象的任意一个方法。本篇文章将通过具体的代码示例,展示如何通过Java反射来获取包下的所有类。


怎么用Java反射获取包下所有类? 详细代码实例操作

员工线上学习考试系统

有点播,直播,在线支付,三级分销等功能,可以对学员学习情况的监督监控,有源码,可二次开发。支持外网和局域网私有化部署,经过测试源码完整可用!1、视频点播:视频播放,图文资料,课件下载,章节试学,限时免

员工线上学习考试系统

了解Java中的volati关键字的作用 以及具体使用方法

本篇文章将和大家分享一下Java当中的volatile关键字,下面将为各位小伙伴讲述volatile关键字的作用以及它的具体使用方法。


了解Java中的volati关键字的作用 以及具体使用方法

Java Map 所有的值转为String类型

可以使用 Java 8 中的 Map.replaceAll() 方法将所有的值转为 String 类型: 上面的代码会将 map 中所有的值都转为 String 类型。 HashMap 是 Java

Java Map 所有的值转为String类型