Python OpenCV 计算机视觉:6~7

这篇具有很好参考价值的文章主要介绍了Python OpenCV 计算机视觉:6~7。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原文: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 \
    > hg+http://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 = True
    def show(self, frame):
        # Find the frame's 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_GRAY2RGB
        else:
            conversionType = cv2.COLOR_BGR2RGB
        rgbFrame = cv2.cvtColor(frame, conversionType)
        # Convert the frame to Pygame's 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 = False
    def 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.displaypygame.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事件的key(ASCII 键代码)。

相对于使用 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.displaypygame.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.exeONopencv_traincascade.exe。 它们不是预建的。 而是,仅当您从源代码编译 OpenCV 时,它们才存在。 根据您在第 1 章“设置 OpenCV”中选择的编译方法,它们的父文件夹是以下文件夹之一:

  • MinGW:<unzip_destination>\bin
  • Visual Studio 或 Visual C++ Express:<unzip_destination>\bin\Release

如果要将可执行文件的文件夹添加到系统的Path变量中,请参考第 1 章,“设置 OpenCV”的“在 Windows XP,Windows Vista,Windows 7 和 Windows 8 上进行选择”部分的信息框中的说明。 否则,请注意可执行文件的完整路径,因为我们将需要在运行它们时使用它。

在 Mac,Ubuntu 和其他类似 Unix 的系统上

Mac,Ubuntu 和其他类似 Unix 的系统上的两个可执行文件称为opencv_createsamplesopencv_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>。 切记替换适合您的系统和设置的路径和文件名。

这些可执行文件具有某些数据文件作为输入和输出。 以下是生成这些数据文件的典型方法:

  1. 手动创建一个描述负面训练图像集的文本文件。 我们将此文件称为<negative_description>
  2. 手动创建一个描述正面训练图像集的文本文件。 我们将此文件称为<positive_description>
  3. <negative_description><positive_description>作为参数运行<opencv_createsamples>。 该可执行文件将创建一个描述训练数据的二进制文件。 我们将后一个文件称为<binary_description>
  4. <binary_description>作为参数运行<opencv_traincascade>。 该可执行文件创建二进制级联文件,我们将其称为<cascade>

我们可以选择<negative_description><positive_description><binary_description><cascade>的实际名称和路径。

现在,让我们详细了解三个步骤。

创建<negative_description>

<negative_description>是一个文本文件,列出了所有负面训练图像的相对路径。 路径应由换行符分隔。 例如,假设我们具有以下目录结构,其中<negative_description>negative/desc.txt

negative
    desc.txt
    images
        negative 0.png
        negative 1.png

然后,negative/desc.txt的内容可能如下:

"images/negative 0.png"
"images/negative 1.png"

对于少量图像,我们可以手动编写这样的文件。 对于大量图像,我们应该改用命令行来查找与特定模式匹配的相对路径,并将这些匹配输出到文件中。 继续我们的示例,我们可以通过在 Windows 的“命令提示符”中运行以下命令来生成negative/desc.txt


> cd negative
> forfiles /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>还包含一系列数字,这些数字指示在图像中找到了多少个目标实例,以及哪些子矩形包含了这些目标实例。 对于每个子矩形,数字按以下顺序排列:x,y,宽度和高度。 考虑以下示例:

"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实现。 。 通过复制和修改FaceTrackerCameo,您应该能够创建一个简单的测试应用,该应用在跟踪的自定义目标实例周围绘制矩形。

也许在您第一次尝试级联训练时,您将不会获得可靠的跟踪结果。 要提高训练效果,请执行以下操作:

  • 考虑使分类问题更具体。 例如,bald, shaven, male face without glasses级联可能比普通的face级联更容易训练。 稍后,随着结果的改善,您可以尝试再次扩大问题范围。
  • 收集更多的训练图像,更多!
  • 确保<negative_description>包含所有负面训练图像,仅包含负面训练图像。
  • 确保<positive_description>包含所有正面训练图像,仅包含正面训练图像。
  • 确保<positive_description>中指定的子矩形正确。
  • 查看并尝试使用<opencv_createsamples><opencv_traincascade>的可选标志。 这些标志在这个页面的官方文档中进行了描述。

祝你好运,寻找图像!

总结

我们已经讨论了用于生成与 OpenCV 的CascadeClassifier兼容的级联文件的数据和可执行文件。 现在,您可以开始收集您喜欢的事物的图像并为其训练分类器!文章来源地址https://www.toymoban.com/news/detail-433052.html

到了这里,关于Python OpenCV 计算机视觉:6~7的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机竞赛 深度学习 机器视觉 人脸识别系统 - opencv python

    🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习 机器视觉 人脸识别系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:3分 🧿 更多资料, 项目分享: https://gitee.com/dancheng

    2024年02月07日
    浏览(62)
  • python基于OpenCV预测图片中目标的实际尺寸(计算机视觉)

    本次实验需要根据已知的硬币的直径,预测图片中书本的长与宽以及书本右上方用铅笔画的圆圈的外圆直径。可以先对图片进行矫正,找到硬币的轮廓并计算硬币直径占据的像素大小,进而得到实际尺寸和像素的比例系数,然后找到书本和铅笔绘制的圆圈的轮廓,再根据它们

    2024年02月03日
    浏览(37)
  • 计算机竞赛 深度学习 opencv python 公式识别(图像识别 机器视觉)

    🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习的数学公式识别算法实现 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:4分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com/d

    2024年02月07日
    浏览(44)
  • python 机器视觉 车牌识别 - opencv 深度学习 机器学习 计算机竞赛

    🔥 优质竞赛项目系列,今天要分享的是 🚩 基于python 机器视觉 的车牌识别系统 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:3分 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 车牌识别其实是个经典的机器视觉任务了,

    2024年02月06日
    浏览(41)
  • 计算机竞赛 python 机器视觉 车牌识别 - opencv 深度学习 机器学习

    🔥 优质竞赛项目系列,今天要分享的是 🚩 基于python 机器视觉 的车牌识别系统 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:3分 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 车牌识别其实是个经典的机器视觉任务了,

    2024年02月12日
    浏览(47)
  • 计算机竞赛 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

    🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:5分 🧿 更多资料, 项目分享: https

    2024年02月08日
    浏览(51)
  • 实战指南:使用OpenCV 4.0+Python进行机器学习与计算机视觉

    💂 个人网站:【办公神器】【游戏大全】【神级源码资源网】 🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】 💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 计算机视觉和机器学习的融合为我们带来了前所未有的机会和挑战。从智能助手到

    2024年02月13日
    浏览(38)
  • Python-OpenCV教程丨从零开始学计算机视觉

    探索新大陆:PythonOpenCV,本文主要记录入门计算机视觉的一些简单程序。 安装opencv库: 这段代码使用OpenCV库创建了一个宽度为200,高度为100的空白图像,并将图像中所有像素点的值设为255(白色)。然后展示了该图像。 具体的执行过程如下: 导入cv2和numpy库。 import cv2 imp

    2024年01月18日
    浏览(31)
  • 计算机设计大赛 深度学习人脸表情识别算法 - opencv python 机器视觉

    🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习人脸表情识别系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/

    2024年02月21日
    浏览(72)
  • 计算机设计大赛 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

    🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:5分 🧿 更多资料, 项目分享: https

    2024年02月21日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包