英语原文共 527 页,剩余内容已隐藏,支付完成后下载完整资料
用OpenCV 3和Qt 5进行计算机视觉处理
- OpenCV中的图像处理
它总是从一个未经处理的原始图像开始,用智能手机、网络摄像头、数码单反相机,或者简而言之,任何能够拍摄和记录图像数据的设备拍摄。然而,它通常以锐利或模糊;明亮、黑暗或平衡;黑白或彩色;以及同一图像数据的许多其他不同表现形式结束。这可能是计算机视觉算法中最初的一步(也是最重要的一步),它通常被称为图像处理(现在,让我们忘记一个事实,即有时,计算机视觉和图像处理被互换使用,这是历史专家的讨论)。当然,你可以在任何计算机视觉过程的中间或最后阶段进行图像处理,但是,一般来说,用现有的大多数设备记录的任何照片或视频都会在其他任何东西之前进行某种图像处理算法。这些算法有的只是为了转换图像格式,有的则是为了调整颜色、去除噪点,还有很多我们无法一一列举的。OpenCV框架提供了大量的功能来处理不同种类的图像处理任务,如图像过滤、几何变换、绘图、处理不同的色彩空间、图像直方图等,这将是本章的主要内容。
在本章中,你将了解许多不同的函数和类,特别是来自OpenCV框架中的imgproc模块。我们将从图像过滤开始,在这个过程中,你将学习如何创建GUI,允许正确使用现有的算法。之后,我们将继续学习OpenCV提供的几何变换功能。然后,我们将简单地介绍什么是颜色空间,它们之间是如何相互转换的等等。之后,我们将继续学习OpenCV中的绘图功能。在前面的章节中我们看到,Qt框架也提供了相当灵活的函数来进行绘图,它甚至可以通过使用场景-视图-项目的架构来更容易地处理屏幕上不同的图形项目;但是,我们也会在某些情况下使用OpenCV的绘图函数,这些函数通常相当快,并为日常图形任务提供足够的能力。我们将在最后章,介绍OpenCV中最强大而又最容易使用的匹配和检测方法之一,即模板匹配法。
本章将有很多有趣的例子和实践学习材料,一定要确保你尝试所有的例子,以便看到它们的工作情况,在亲身体验的基础上学习它们,而不是仅仅按照本章提供的截图和一些章节末尾的示例源代码来学习。
在本章中,我们将涉及以下主题:
- 如何为计算机_vision项目创建一个新的插件,以及每一个学到的OpenCV技能。
- 如何过滤图像
- 如何进行图像转换
- 色彩空间,如何将它们相互转换,以及如何应用色彩映射。
- 图像阈值化
- OpenCV中的绘图功能
- 模板匹配以及如何将其用于对象检测和计数。
1.1 图像过滤
在本节中,您将了解OpenCV中可用的不同线性和非线性图像滤波方法。需要注意的是,本节讨论的所有函数都以Mat图像作为输入,并生成相同大小和相同通道数的Mat图像。事实上,滤波器是独立应用于每个通道的。一般来说,滤波方法从输入图像中取一个像素及其邻近像素,并根据这些像素的函数响应计算出生成图像中相应像素的值。
这通常需要对不存在的像素做一个假设,同时计算过滤后的像素结果。OpenCV提供了一些方法来克服这个问题,几乎所有需要处理这个现象的OpenCV函数中都可以指定这些方法,使用的是cv:.BorderTypes enum。我们将在稍后看到本章的第一个例子中如何使用它,但是,在这之前,让我们用下面的图来确保我们完全理解它。
从上图中可以看出,计算(或者在本例中是滤波函数)将区域A中的像素,并给出了生成的处理图像(或本例中的滤波图像)中的像素A。在这种情况下没有问题,因为在输入图像中像素A附近的所有像素都在图像内部,也就是区域A中。正如您所看到的,并不是所有像素B的邻近像素都落入了输入图像,也就是区域B。这时我们就需要做一个假设,考虑到价值将图像外的像素作为零,与边界像素一样,以此类推。这正是cv:.BorderTypes枚举的内容,我们需要在我们的例子中用合适的值来指定它。BorderTypes enum的作用,我们需要在我们的例子中用一个合适的值来指定它。
现在,让我们用第一个例子来演示一下cv::BorderTypes的用法,在开始使用图像过滤功能之前,我们先用第一个例子来演示。我们将借此机会也学习一下如何为我们在前面几章开始的计算机_vi 江上项目创建新的插件(或克隆现有的插件)。那么,让我们开始吧。
1.如果你到现在为止已经完全按照书中的例子进行了操作,如果你已经在第s章《图形视图框架》结尾处下载了新的插件,那么你应该能够很容易地为计算机_维江上项目创建一个新的插件。要做到这一点,首先要复制(或复制并粘贴在同一文件夹中,这只是取决于你使用的操作系统)。在Cmoputer_Vision项目文件夹内的template_plugin文件夹。然后我们将创建我们的第一个真正的cmo真实例子的插件。我们将为cmoreal example.puter_vision项目创建第一个真正的插件,看看cv::BorderTypes是如何在真正的例子中工作的cv::BorderTypes是如何在一个真实的例子中工作的。
2.进入copymakeborder_plugin文件夹,将这里的所有文件重命名为与插件文件夹名一致.只需将文件名中的所有模板词替换为copymakeborder即可。
3.你可以猜到,现在我们还需要更新copymakeborder_plugin的项目文件。要做到这一点,你可以简单地在标准文本编辑器中打开copymakeborder_plugin.pro文件,或者将其拖入Qt Creator代码编辑器区域(而不是Projects窗格)。然后,设置TARGET为copyMakeBorder_Plugin,如这里所示。很明显,你需要更新已经存在的类似行,如这里所示。
4.与上一步类似,我们也需要相应更新DEFINES。
5.最后,确保pro文件中的headers和sources项也更新了,如这里所示,然后保存并关闭pro文件。
6.现在,用Qt Creator打开computer_vision.pro文件,这将打开整个computer_vision项目,也就是Qt多项目。这将打开整个computer_vision项目,这就是Qt多项目。Qt允许在一个容器项目中处理多个项目,或者像Qt自己所说的那样,一个子项目类型。与普通的Qt Widgets应用项目不同。 子目录项目通常(不一定)有一个非常简单和简短的*。 文件。一行提到TEMPLATE类型为subdirs,还有一个susorns条目,列出了subdirs项目文件夹内的所有项目文件夹。让我们在Qt Creator代码编辑器中打开computer_vision.pro文件来亲眼看看。
7.现在,只需将copymakeborder_plugin添加到条目列表中。你更新的电脑_vision.pro文件应该是这样的。
8.最后,对于这部分内容,我们需要更新copymakeborder_plugin源文件和头文件的内容,因为很明显,类名、包含的头文件,甚至一些编译器指令都需要更新。处理这些编程开销真的很令人沮丧,所以让我们利用这个机会来了解Qt Creator中最有用的技巧之一,那就是Qt Creator的Find in This Directory... 功能。您可以使用它来查找(并替换)Qt项目文件夹或子文件夹中的任何内容。当我们想要避免手动浏览文件并逐一替换代码时,您将学习并使用这一技术。要使用它,你只需要从Projects窗格中选择正确的文件夹,右击它,然后选择Find in This Directory ...选项。让我们这样做 与copymakeborder_plugin项目,如截图所示。
9.这将打开Qt Creator窗口底部的搜索结果窗格,如下截图所示。在这里,你必须在Search for: 字段中输入TEMPLATE_PLUGIN。另外,确保选中Case sensitive选项。剩下的选项保持原样,然后点击 '搜索和替换 '按钮。
10.这将把搜索结果窗格切换到替换模式。在Replace with:字段中填入COPYMAKEBORDER _PLUGIN,然后点击Replace按钮。如图所示。
11.在前面的步骤中,我们使用Qt Creator的查找和替换功能,用COPYMAKEBORDER_PLUGIN替换所有TEMPLATE_PLUGIN条目。使用同样的技能,用copymakeborder_plugin替换所有temple_plugin条目,用copyMakeBorder_Plugin替换所有Temple_Plugin条目。这样,我们的新插件项目就可以进行编程了,最后用在computer_Vision项目中。
12.现在是时候为我们的插件编写代码,并创建相应的GUI。打开plugin.ui文件,确保它的用户界面包括以下小部件。另外,注意widget的objectName值。注意,整个PluginGui文件的布局被设置为网格布局,如下图所示。
13.将 borderTypeLabel 的 size Policy/Horizontal Policy 属性设置为 fixed。 这将确保标签根据其宽度占据固定的水平空间。
14.为borderTypecomboBox小组件的currentrndexchanged(int)信号添加一个方法,方法是右击它,选择Go to slot ...,选择提到的信号,并点击OK按钮。然后,在新创建的函数(准确的说是槽)中为该信号写下以下一行代码。
这个信号的目的是告诉mainapp,在组合框的选择项发生变化后,插件可能会产生不同的结果,mainapp可能要根据这个信号更新自己的GUI。你可以查看mainapp项目的源代码,你会发现,所有插件的这个信号都连接到mainapp的相关槽位上,而mainapp只是调用插件的processrmage函数。
15.现在,在copymakeborder_plugin.cpp文件中,在setupui函数中添加以下代码。setupui函数的内容应该是这样的。
我们已经熟悉了开始DI相关的调用,这些调用与每个Qt Widgets Application中的相同调用几乎是一样的,我们在前面的章节中已经了解了它们。之后,我们用相关的项目填充我们的组合框,这些项目只是cv:.BorderTypes枚举中的条目。BorderTypes enum中的条目。如果按照这个顺序插入的话,每个项的索引值将与它们对应的枚举值相同。最后,我们将手动将所有的信号连接到插件中的相关槽位。请注意,这与普通的Qt Widgets Application略有不同,在Qt Widgets Application中,你不需要连接彼此名称兼容的信号和插槽,因为它们是通过调用自动连接到QMetaObject::connectSlotsByName在UIC自动生成的代码文件中(参考第3章,创建一个全面的Qt OpenCV项目,关于UIC)。
16.最后,更新插件中的processrmage函数,如图所示。
在这里,我们将调用copyMakeBorder函数,该函数类似于在函数内部调用,需要处理图像外部不存在的像素的假设。我们将简单地假设图像上下添加的边框是图像高度的一半,图像左右添加的边框是图像宽度的一半。至于bordenype参数,我们将简单地从插件GUI上的选择项中获取。
一切都完成了,我们就可以测试我们的插件了。确保你建立整个计算机_vision多项目,从项目窗格中右击它,并从菜单中选择重建(以确保所有的清理和重建)。然后,进入插件Build文件夹,从那里复制库文件并粘贴到mainapp可执行文件旁边的cvplugins文件夹中(在mainapp Build文件夹中),最后从Qt Creator运行mainapp。
只要mainapp一启动,你就会面临一个错误信息(如果插件没有复制或格式不对),或者你最终会进入计算机-视觉应用程序主窗口。然后你可以从mainapp的Plugins菜单中选择我们刚刚建立的插件,如果它还没有被选中的话。你可以在mainapp主窗口的组框内看到我们为该插件设计的GUI。然后,你可以使用主菜单打开或保存图形场景的内容。试着打开一个文件,然后在插件组合框中切换不同的选择。你也可以通过勾选 '查看原图 '复选框来查看原图。下面是一张截图。
从组合框中选择任何其他边框类型,你会立即注意到所产生的图像如何变化。需要注意的是,BORDER_REFLECT_101也是默认的边框类型(如果你没有在OpenCV过滤和类似的函数中指定),它和BORDER_REFLECT很相似,但它不会重复边框前的最后一个像素。有关这方面的更多信息,请参见cv::BorderTypes的OpenCV文档页。下面是结果,正如前面提到的,对于每一个需要处理类似的外部(不存在的)像素插值的OpenCV函数来说,结果都是一样的。
就是这样,我们现在可以开始使用OpenCV中的过滤功能了。我们现在准备开始使用OpenCV中的过滤功能。
1.2 OpenCV中的过滤功能
OpenCV中所有的过滤函数都会取一个图像,并生成一个大小和通道完全相同的图像。就像之前提到的,它们也都需要一个borderType参数,我们刚刚完成了实验和学习。除此之外
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[258919],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。