秦皇岛学网站建设,系统开发是系统建设中工作任务最为繁重的阶段,教师网络培训,网站优化服务流程原文#xff1a;OpenCV Computer Vision with Python 协议#xff1a;CC BY-NC-SA 4.0 译者#xff1a;飞龙 本文来自【ApacheCN 计算机视觉 译文集】#xff0c;采用译后编辑#xff08;MTPE#xff09;流程来尽可能提升效率。 当别人说你没有底线的时候#xff0c;你最… 原文OpenCV Computer Vision with Python 协议CC BY-NC-SA 4.0 译者飞龙 本文来自【ApacheCN 计算机视觉 译文集】采用译后编辑MTPE流程来尽可能提升效率。 当别人说你没有底线的时候你最好真的没有当别人说你做过某些事的时候你也最好真的做过。 附录 A与 Pygame 集成
本附录显示了如何在 OpenCV 应用中设置 Pygame 库以及如何使用 Pygame 进行窗口管理。 此外附录还概述了 Pygame 的其他功能以及一些学习 Pygame 的资源。 注意
本章的所有完成代码都可以从我的网站下载。 安装 Pygame
假设我们已经根据第 1 章“设置 OpenCV”中描述的方法之一设置了 Python。 根据我们现有的设置我们可以通过以下方式之一安装 Pygame 带有 32 位 Python 的 Windows从以下位置下载并安装 Pygame 1.9.1。 带有 64 位 Python 的 Windows从以下位置下载并安装 Pygame 1.9.2 预览版。 带有 Macports 的 Mac打开“终端”并运行以下命令
$ sudo port install py27-game 带有 Homebrew 的 Mac打开终端并运行以下命令来安装 Pygame 的依赖项然后安装 Pygame 本身
$ brew install sdl sdl_image sdl_mixer sdl_ttf smpeg portmidi
$ /usr/local/share/python/pip install \hghttp://bitbucket.org/pygame/pygame Ubuntu 及其衍生版本打开“终端”并运行以下命令
$ sudo apt-get install python-pygame 其他类似 Unix 的系统Pygame 在许多系统的标准存储库中可用。 典型的包名称包括pygame, pygame27, py-game, py27-game, python-pygame,和python27-pygame.。
现在Pygame 应该可以使用了。
文档和教程
Pygame 的 API 文档和一些教程可以在以下网址在线找到。
Al Sweigart 的《使用 Python 和 Pygame 制作游戏》是一本烹饪手册用于在 Pygame 1.9.1 \中重新创建几个经典游戏。 免费的电子版本可从以下网站在线获得。或在以下网站下载 PDF 文件。
派生Manager.WindowManager
如第 2 章“处理照相机文件和 GUI”中所述我们的面向对象设计使我们可以轻松地将 OpenCV 的 HighGUI 窗口管理器切换为另一个窗口管理器例如 Pygame。 为此我们只需要继承我们的managers.WindowManager类的子类并覆盖四个方法createWindow()show()destroyWindow()和processEvents()。 另外我们需要导入一些新的依赖项。
要继续我们需要第 2 章“处理照相机文件和 GUI”中的managers.py文件和第 4 章“用 Haar 级联跟踪人脸”中的utils.py文件。 在utils.py中我们只需要一个函数isGray()我们在第 4 章“用 Haar 级联跟踪人脸”中实现。 让我们编辑managers.py以添加以下导入
import pygame
import utils同样在managers.py中在执行WindowManager之后的某个位置我们想添加名为PygameWindowManager的新子类
class PygameWindowManager(WindowManager):def createWindow(self):pygame.display.init()pygame.display.set_caption(self._windowName)self._isWindowCreated Truedef show(self, frame):# Find the frames dimensions in (w, h) format.frameSize frame.shape[1::-1]# Convert the frame to RGB, which Pygame requires.if utils.isGray(frame):conversionType cv2.COLOR_GRAY2RGBelse:conversionType cv2.COLOR_BGR2RGBrgbFrame cv2.cvtColor(frame, conversionType)# Convert the frame to Pygames Surface type.pygameFrame pygame.image.frombuffer(rgbFrame.tostring(), frameSize, RGB)# Resize the window to match the frame.displaySurface pygame.display.set_mode(frameSize)# Blit and display the frame.displaySurface.blit(pygameFrame, (0, 0))pygame.display.flip()def destroyWindow(self):pygame.display.quit()self._isWindowCreated Falsedef processEvents(self):for event in pygame.event.get():if event.type pygame.KEYDOWN and \self.keypressCallback is not None:self.keypressCallback(event.key)elif event.type pygame.QUIT:self.destroyWindow()return注意我们使用了两个 Pygame 模块pygame.display和pygame.event。
调用pygame.display.init()创建一个窗口调用pygame.display.quit()销毁一个窗口。 重复调用display.init()无效因为 Pygame 仅适用于单窗口应用。 Pygame 窗口的绘图表面类型为pygame.Surface。 为了获得对该Surface的引用我们可以调用pygame.display.get_surface()或pygame.display.set_mode()。 后一个函数在返回实体之前修改Surface实体的属性。 一个Surface实体具有一个blit()方法该方法将另一个Surface和一个坐标对作为参数其中后一个Surface应被“变白”绘制到第一个上。 完成当前帧的窗口Surface的更新后我们应该通过调用pygame.display.flip()来显示它。
通过调用pygame.event.get()可以轮询诸如keypresses之类的事件该函数将返回自上次调用以来发生的所有事件的列表。 每个事件的类型均为pygame.event.Event并具有属性 type它指示事件的类别例如pygame.KEYDOWN表示按键pygame.QUIT 表示窗口的关闭按钮被点击。 取决于type的值Event实体可能具有其他属性例如KEYDOWN事件的keyASCII 键代码。
相对于使用 HighGUI 的基本WindowManager而言PygameWindowManager通过在每帧 OpenCV 的图像格式和 Pygame 的Surface格式之间进行转换而产生一些间接费用。 但是PygameWindowManager提供正常的窗口关闭行为而基础WindowManager不提供。
修改应用
让我们将cameo.py文件修改为使用PygameWindowManager而不是WindowManager。 在cameo.py中找到以下行
from managers import WindowManager, CaptureManager将其替换为
from managers import PygameWindowManager as WindowManager, \CaptureManager就这样 现在cameo.py使用一个 Pygame 窗口当单击标准“关闭”按钮时该窗口应该关闭。
Pygame 的进一步使用
我们仅使用了pygame.display和pygame.event模块的一些基本功能。 Pygame 提供了更多功能包括
绘制 2D 几何绘制文字管理可绘制 AI 实体精灵的分组捕获与窗口键盘鼠标和操纵杆/游戏手柄相关的各种输入事件创建自定义事件播放和合成声音和音乐
例如Pygame 可能是使用计算机视觉的游戏的合适后端而 HighGUI 则不是。
总结
到现在为止我们应该有一个应用该应用使用 OpenCV 捕获并可能操纵图像同时使用 Pygame 显示图像和捕获事件。 从这个基本的集成示例开始您可能想扩展PygameWindowManager来包装其他 Pygame 功能或者您想创建另一个WindowManager子类来包装另一个库。
附录 B为自定义目标生成 Haar 级联
本附录显示了如何生成 Haar 级联 XML 文件如第 4 章“使用 Haar 级联跟踪面部”中所使用的文件。 通过生成自己的级联文件我们可以潜在地跟踪任何模式或对象而不仅仅是面部。 但是好的结果可能不会很快出现。 我们必须仔细收集图像配置脚本参数执行实际测试并进行迭代。 可能涉及大量的人工时间和处理时间。
收集正面和负面的训练图像
你知道抽认卡的教学法吗 这是一种向幼儿教授单词和识别技巧的方法。 老师给全班同学展示了一系列图片并说了以下内容 “这是牛。Mo这是马。Neigh” 级联文件的生成方式类似于抽认卡教学法。 要学习如何识别母牛计算机需要预先识别为母牛的正训练图像和预先识别为“非母牛”的负训练图像。 作为训练师我们的第一步是收集这两套图像。
在确定要使用多少个正面训练图像时我们需要考虑用户查看目标的各种方式。 理想最简单的情况是目标是始终在平坦表面上的 2D 图案。 在这种情况下一个正面的训练图像可能就足够了。 但是在其他情况下可能需要数百甚至数千张训练图像。 假设目标是您所在国家的国旗。 当在文档上打印时标志的外观可能可预测但是当在顺风飘扬的织物上打印时标志的外观变化很大。 诸如人脸之类的自然 3D 目标的外观范围可能更大。 理想情况下我们的一组正面训练图像应代表我们的相机可能捕获的许多变化。 可选地我们的任何正面训练图像都可以包含目标的多个实例。
对于我们的负面训练集我们需要大量图像这些图像不包含目标的任何实例但确实包含相机可能捕获的其他内容。 例如如果一面旗帜是我们的目标那么我们的负面训练集可能包括各种天气情况下的天空照片。 天空不是旗帜但经常在旗帜后面看到。不过不要假设太多。 如果相机的环境无法预测并且目标出现在许多设置中请使用各种各样的负面训练图像。 考虑构建一套通用的环境图像您可以在多个训练方案中重复使用这些图像。、
查找训练可执行文件
为了使级联训练尽可能自动化OpenCV 提供了两个可执行文件。 它们的名称和位置取决于操作系统和 OpenCV 的特定设置如以下两节所述。
在 Windows 上
Windows 上的两个可执行文件称为ONopencv_createsamples.exe和ONopencv_traincascade.exe。 它们不是预建的。 而是仅当您从源代码编译 OpenCV 时它们才存在。 根据您在第 1 章“设置 OpenCV”中选择的编译方法它们的父文件夹是以下文件夹之一
MinGWunzip_destination\binVisual Studio 或 Visual C Expressunzip_destination\bin\Release
如果要将可执行文件的文件夹添加到系统的Path变量中请参考第 1 章“设置 OpenCV”的“在 Windows XPWindows VistaWindows 7 和 Windows 8 上进行选择”部分的信息框中的说明。 否则请注意可执行文件的完整路径因为我们将需要在运行它们时使用它。
在 MacUbuntu 和其他类似 Unix 的系统上
MacUbuntu 和其他类似 Unix 的系统上的两个可执行文件称为opencv_createsamples和opencv_traincascade。 它们的父文件夹是以下文件夹之一具体取决于您的系统和在第 1 章“设置 OpenCV”中选择的方法
带有 MacPorts 的 Mac/opt/local/bin带有 Homebrew 的 Mac/opt/local/bin或/opt/local/sbin具有 Apt 的 Ubuntu/usr/bin使用我的自定义安装脚本的 Ubuntu/usr/local/bin其他类 Unix 系统/usr/bin和/usr/local/bin
除 Mac 带有 Homebrew 的情况外默认情况下可执行文件的文件夹应位于PATH中。 对于 Homebrew如果要将相关文件夹添加到PATH请参阅第 1 章“设置 OpenCV”的“使用 Homebrew 和现成的包不支持深度摄像头”第二部分中的说明。 否则请注意可执行文件的完整路径因为我们需要在运行它们时使用它。
创建训练集和级联
此后我们将这两个可执行文件称为opencv_createsamples和opencv_traincascade。 切记替换适合您的系统和设置的路径和文件名。
这些可执行文件具有某些数据文件作为输入和输出。 以下是生成这些数据文件的典型方法
手动创建一个描述负面训练图像集的文本文件。 我们将此文件称为negative_description。手动创建一个描述正面训练图像集的文本文件。 我们将此文件称为positive_description。以negative_description和positive_description作为参数运行opencv_createsamples。 该可执行文件将创建一个描述训练数据的二进制文件。 我们将后一个文件称为binary_description。以binary_description作为参数运行opencv_traincascade。 该可执行文件创建二进制级联文件我们将其称为cascade。
我们可以选择negative_descriptionpositive_descriptionbinary_description和cascade的实际名称和路径。
现在让我们详细了解三个步骤。
创建negative_description
negative_description是一个文本文件列出了所有负面训练图像的相对路径。 路径应由换行符分隔。 例如假设我们具有以下目录结构其中negative_description是negative/desc.txt
negativedesc.txtimagesnegative 0.pngnegative 1.png然后negative/desc.txt的内容可能如下
images/negative 0.png
images/negative 1.png对于少量图像我们可以手动编写这样的文件。 对于大量图像我们应该改用命令行来查找与特定模式匹配的相对路径并将这些匹配输出到文件中。 继续我们的示例我们可以通过在 Windows 的“命令提示符”中运行以下命令来生成negative/desc.txt cd negativeforfiles /m images\*.png /c cmd /c echo relpath desc.txt
请注意在这种情况下相对路径的格式为.\images\negative 0.png这是可以接受的。
另外在类似 Unix 的外壳中例如 Mac 或 Ubuntu 上的 Terminal我们可以运行以下命令 $ cd negative
$ find images/*.png | sed -e s/^/\/g;s/$/\/g desc.txt
创建positive_description
如果我们有多个正面训练图像则需要使用positive_description。 否则请继续下一节。 positive_description是一个文本文件列出了所有积极训练图像的相对路径。 在每个路径之后positive_description还包含一系列数字这些数字指示在图像中找到了多少个目标实例以及哪些子矩形包含了这些目标实例。 对于每个子矩形数字按以下顺序排列xy宽度和高度。 考虑以下示例
images/positive 0.png 1 120 160 40 40
images/positive 1.png 2 200 120 40 60 80 60 20 20在此images/positive 0.png包含子矩形中目标的一个实例该子矩形的左上角为(120, 160)右下角为(160, 200)。 同时images/positive 1.png包含目标的两个实例。 一个实例位于子矩形中该子矩形的左上角为(200, 120)而其右下角为(240, 180)。 另一个实例位于子矩形中该子矩形的左上角为(80, 60)右下角为(100, 80)。
要创建这样的文件我们可以以与negative_description相同的方式开始生成图像路径列表。 然后我们必须基于对图像的专家人类分析手动添加有关目标实例的数据。
通过运行opencv_createsamples创建binary_description
假设我们有多个正面训练图像因此我们创建了positive_description现在可以通过运行以下命令来生成binary_description $ opencv_createsamples -vec binary_description -info positive_description -bg negative_description
另外如果我们有一个正面的训练图像我们将其称为positive_image则应改为运行以下命令 $ opencv_createsamples -vec binary_description -image positive_image -bg negative_description
对于其他opencv_createsamples标志可选请参见官方文档。
通过运行opencv_traincascade创建cascade
最后我们可以通过运行以下命令生成cascade $ opencv_traincascade -data cascade -vec binary_description -bg negative_description
有关opencv_traincascade的其他可选标志的信息请参见官方文档。 提示
发声
为了好运在运行opencv_traincascade时发出模仿声音。 例如说“ Moo” 如果正面训练图像是母牛。 测试和改进cascade
cascade是与 OpenCV 的CascadeClassifier类的构造器兼容的 XML 文件。 对于如何使用CascadeClassifier的示例请参考第 4 章“用 Haar 级联跟踪人脸”的FaceTracker实现。 。 通过复制和修改FaceTracker和Cameo您应该能够创建一个简单的测试应用该应用在跟踪的自定义目标实例周围绘制矩形。
也许在您第一次尝试级联训练时您将不会获得可靠的跟踪结果。 要提高训练效果请执行以下操作
考虑使分类问题更具体。 例如bald, shaven, male face without glasses级联可能比普通的face级联更容易训练。 稍后随着结果的改善您可以尝试再次扩大问题范围。收集更多的训练图像更多确保negative_description包含所有负面训练图像仅包含负面训练图像。确保positive_description包含所有正面训练图像仅包含正面训练图像。确保positive_description中指定的子矩形正确。查看并尝试使用opencv_createsamples和opencv_traincascade的可选标志。 这些标志在这个页面的官方文档中进行了描述。
祝你好运寻找图像
总结
我们已经讨论了用于生成与 OpenCV 的CascadeClassifier兼容的级联文件的数据和可执行文件。 现在您可以开始收集您喜欢的事物的图像并为其训练分类器