Andy Thé, MathWorks
本课程是对MATLAB的介绍®,一种用于数值计算、可视化和编程的高级语言和交互式环境。
MATLAB包含解决工程和科学问题的基本内置数学函数,以及迭代探索、设计和问题解决的理想交互环境。使用一个图像处理示例向您展示如何开始使用MATLAB。
亮点包括:
大家好,欢迎来到MATLAB入门课。我叫Andy The,是MathWorks的产品营销经理。在这节课中,我们将通过一个图像处理的例子向您介绍MATLAB。但在我们开始之前,让我们先讲一下MATLAB。
MATLAB本质上是一种高级语言。不仅如此,它还是一个完整的交互开发环境。这让你能够编写脚本,进行数值计算,进行可视化,就像你在右边看到的,使用图表和许多不同类型的绘图工具。它还允许你进行算法开发和编程,最后是应用程序部署。
那么让我们后退一步,讨论一个典型的技术计算工作流。传统上,您将从访问数据开始。这可以以文件的形式出现,可能是第三方软件的输出,甚至可能是硬件。一旦你获得了数据,你就进入了我们所说的探索和发现阶段。在这里你要做很多算法开发,做一些事情,比如绘图,发现趋势,开发你的应用程序。最后,我们一起分享。你要分享你的想法。你将以报告和文档的形式与同事共享你的算法,或者以输出的形式,如C文件、库,以及其他第三方应用程序可以使用的东西。
虽然我把它表示为线性路径,但实际上这是一条迭代路径。您通常在这些不同的阶段之间移动,增加数据集的大小,进行更多的开发,改进算法和应用程序,共享结果,获得反馈,然后再次进行更多的改进。在这节课中我要向你们展示的是MATLAB非常适合这种工作流程。
今天这个演示的目标是构建一个入侵者检测系统。使用MATLAB和图像处理工具箱,我们将探索图像创建和共享这个应用程序。我们将首先处理静态图像。我们将发布报告来帮助共享算法。最后,我们将使用实时视频。
让我给你们预览一下我们将要建造的东西。如果你看这里,这实际上是一个运行着漂亮用户界面的应用程序。我们已经运行了算法。这是没有入侵者的参考图。在右边,你可以看到入侵者用红色标出。最后,我们将看到如何将整个应用程序组合在一起。
这是在MATLAB中。对于那些不熟悉环境的人,我将在整个演示中介绍不同的特性。让我们开始吧。在这里的命令窗口中,可以开始与环境进行交互。例如,你可以开始分配一些变量,比如a = 3 b = 5。我们可以创建另一个变量c,让它等于a乘以b,这并不复杂,我们有答案,15。
但我想指出的是MATLAB将所有这些变量都存储在工作区中。如果我双击打开它,你会看到我创建的变量,a = 3 b等等。这是你可以储存它们的地方;您可以对它们进行工作和操作。更重要的是,如果我双击这个,你会看到一些有趣的东西。MATLAB把所有的变量都当做矩阵或者二维数组来处理。在这种情况下,变量a是一个单独的值,但它是一个1乘1矩阵。所以当你做线性代数的时候,或者在我们的例子中,图像处理,每个图像本质上都是一个矩阵,这是非常有益的。
让我们再做一些数学运算来告诉你们我们能做什么。我创建了这个快捷键来清理工作空间中的环境。顺便说一下,你可以创建你喜欢的快捷方式。你可以在这里创建一个标签。您可以输入您可能输入的任何常用输入命令。这有助于提高你的工作效率。
现在我要创建一个矩阵。我们把它叫做矩阵1。我们要创建一个3 × 3矩阵。为了节省时间,这里我要做一些自动补全。现在如果我点击返回,你会看到它是一个简单的3乘3矩阵。你会看到中间是1和0。我们可以画出来。如果我们往下看工作空间,我打开这个。
我之前没有展示这个,但现在我们有了一些更有趣的数据,你可以点击右键。我还可以拿出更多变量,比如标准差,均值,中位数。因此,当这个矩阵变得更大更复杂时,您实际上可以提供一些有趣的属性,以便在工作区中显示。
现在我们要画出来。如果我选中它,然后到绘图选项卡,你会看到所有与这个数据类型相关的绘图。在我们的例子中,我们希望将其视为图像。我可以用imshow。这相当于成像世界中的printf。您只是在窥视或查看这些值。但是我想使用图像工具,或者imtool,因为这是一个很小的图像。正如你将看到的,这个图像工具允许我放大。
这里我放大了图像。你不会看到什么有趣的东西。但是你可以用图像工具来做这些事情。这里你可以看到我可以测量这个黑色的小方块。它大约是1.39像素。我可以运用对比。我可以裁剪图像。但同样有趣的是——让我把这个稍微调整一下——我可以点击这里的这个按钮来检查像素值。如果我点击它,它会告诉你这是我的矩阵。所有不同的元素,这里所有的1都是白色的。 And the center is 0, which is black. So that's essentially a picture. It's not a very interesting one. But nonetheless, my little matrix is a picture.
我们开始吧。我现在要做一些操作。记住,我提到过MATLAB把所有东西都看成二维数组或矩阵。可以对整个数组进行操作。这里我们要进行一些逻辑运算。例如,我要创建另一个矩阵- 2。我要令这个等于矩阵1中的所有元素,比如说,小于1的。
所以我要做的是,本质上,我创建了逆矩阵。这里,原来是1的都变成了0。所有0都变成了1。我可以把这个也打印出来。我要回顾一下我的历史。我要打印出矩阵2。这里——让我们放大——是我的图像。你可以看到它是逆的。现在中心是白色的。是1。 All the surrounding pixels are black, because they're 0.
现在你可以看到我已经和MATLAB进行了很多交互。我输入了很多命令。虽然一开始这很好,但这可能会有点费力。当您的命令越来越密集,并且您想要进行更多的交互时,您可能想要转向称为脚本的东西。让我给你们展示一种如何得到它或者如何过渡到它的方法。
如果我们转到命令历史记录,你可以看到自从我打开MATLAB会话以来,我在命令窗口中输入的所有内容都在这里捕获。你可以说,好吧,我想捕捉这个。我按住Control键,开始高亮所有我想要的命令。我在这里创建了一些矩阵,叫做imtool。我可以右键点击这里。我可以求这部分的值。这样我就可以重播历史了。或者我可以点击右键创建脚本。
这样就打开了这个编辑器窗口。这里你可以看到我输入的所有命令。我可以保存这个。例如,我可以保存并创建一个测试脚本。然后所有的脚本都被标记为MATLAB的。m。这是我的剧本。我可以清空我的工作区。我可以重新运行我的脚本只要点击这里的编辑器标签,然后运行。本质上,这是所有的变量。它们都被填充了,用我的矩阵创建了,也发射了imtool。 And here's my little image where I can actually zoom in and see.
所以这是一种很好的方法,可以转移到一个使用脚本的环境中,在那里你可以迭代。您可以使用它进行调试。这样你就能省钱,而且真的能让你更有效率。所以命令窗口很棒。但是当你想要变得更加自动化并保存这些东西并进行迭代时,我建议转向脚本。
让我们继续看图像处理的例子。让我先清理一下环境。现在我们的图像处理的例子,如果你看左边,我还没有展示给你看。这是文件夹浏览器,文件浏览器。这里我们可以看到不同的文件。我们可以导航到文件系统中的任何文件夹。这是我们的两张测试图片。让我们继续,现在将它们导入工作空间。
如果我们双击测试图像1,我们会看到导入向导出现了。这是一张JPEG图片。这其实很简单。它只是告诉我名字而已。它告诉我这是一个266 * 484像素的图像。它有三层。为什么是三层,上面说有R G b红蓝绿三层。我们将继续单击Finish将其导入到工作区中。但是我应该指出,这个导入向导将根据您的数据类型自定义。例如,如果您有表格数据或其他类型的数据格式,您将看到一些选项,这些选项将帮助您控制如何以及将什么内容导入工作区。 So just remember the import wizard will customize based on your data type.
让我们继续,在这里单击Finish。然后你会看到我们的测试图像填充在这里,测试图像1。让我们继续导入第二张图片。就是这个。然后点击Finish。这里我们有两个图像。让我们继续预览它们,以确保它们被正确地导入到环境中。如果我们点击其中一个,进入“情节”选项卡,你会看到任何相关的情节都会出现在这里。我们可以做一个简单的即兴表演。这个,就像printf一样。 We're just looking at that variable.
看,没什么有趣的。这是我的办公室。你可以看到,今天它相对干净。但你看没有什么值得关注的。这里没有入侵者。看起来一切都很好。但是如果我们去测试图像2,然后我们使用图像工具。我想给你们看一些有趣的东西。这是我们办公室的照片。但里面有人。 So we have someone here.
这很有趣。使用图像工具,我们可以开始做一些预处理或开始分析数据。例如,我们可以点击这个小标尺。我可以测量这个人有多高?哦,大概150像素高。这一点以后会很重要。因为我们可能想要做一些基于长度的过滤,也许可以确保我们检测到的是一个人,而不是某人的宠物。这就是快速测量的方法。我删掉这个距离工具。
但你也可以做一些事情,比如裁剪图像。你可以回到这个检查像素值。这里我们看到像素区域。这一次,让我继续放大,这样你就能看得更清楚一点——现在它更有趣了。当我移动这个小观察窗口来查看像素区域时,这里是红色、蓝色和绿色强度级别。为了做出这个红色的袋子,你可以看到做出这个颜色所需要的值。如果你看这里的黑色部分,你会发现它基本上都接近于零。然后如果你靠近墙壁,它的强度都非常高,接近200,256,这是最高的,这本质上是纯白色的图像内部。这是很好的信息,这很重要因为以后你可能会想做基于颜色的处理,这是另一种分析数据的方法看看将来你可能想做什么类型的处理。
但在我们的例子中,这更直接一些。如果我回到另一张图片,我先关闭这个像素区域。我要去拿我的before。所以在我们的例子中,我们要做的是我们要弄清楚什么时候这里有入侵者。如果你看这两张图片,你会发现有很多的一致性。办公室的一切都是不变的,唯独人是新的。
这样你就有了一个背景——这是背景——和一个前景。所以这里,我们要分离这个人。我们想确认它是入侵者。我们将在图像处理中使用一种叫做图像分割的技术。所以本质上,我们要试着把这个人从图像中分离出来,这样我们就可以做一些分析。我们要忽略所有常数项,因为这无关紧要。
让我们继续,一步一步告诉你我们将如何分割和分析这张图像。让我们关闭这里的一些窗口。通常分割图像的第一件事就是你要把图像转换成灰度。你可能会问的第一个问题是,我怎么做呢?一种方法是你可以直接到这里的搜索栏。你可以输入灰度。如果我这样做,你会看到一些搜索建议。或者你可以按回车键。你会看到,这里有帮助,你会看到,你可以根据产品类型来分类,细化。或者您可以向下滚动并开始检查一些函数。 And you'll see here, here's an RGB to gray. So this sounds like what I want. If I click on it, you'll see the description—convert RGB image or color map to grayscale.
这听起来就是我想要的。下面是一个语法示例,您可以看到它的来源,图像处理工具箱导入、导出和转换。这是一个图像类型转换。在我回去使用这个函数之前,我想向你们展示更高层次的内容,如果我点击这里,这是浏览图像处理工具箱所有不同类别函数的好方法。这实际上也适用于所有其他的工具箱。如果你去寻求帮助,如果你看看所有不同类型的工具箱,你可以得到一些关于如何使用不同功能的非常好的指导。
如果我们回到图像处理工具箱,可以看到它们是如何分类的。这里有图像增强功能。你可以点击这里。还有对比度调整。如果你想要类型转换,你可以返回到导入,导出,转换。这是我们想要的函数,RGB转灰色。所以帮助是一个很好的资源。你可以使用搜索栏,也可以直接导航和探索。文献中也有很多很好的例子。
让我们开始使用这个函数。我要创建两个新变量。我将它命名为image gray, imgray1。我将使用RGB。然后我按Tab键来帮助我,它会弹出带RGB前缀的常用函数。我想让RGB变成灰色。我要在test image上做这个,然后按Tab键。我想要测试图像1。然后我想创建另一个,图像灰度2,并设置这个等于RGB灰度,并设置这个为测试图像2。
这是我的两张灰度图像。您可以看到,它们现在已填充到工作区中。我可以把它们画出来,来验证它们的存在。这是之前。我点这里。这是后面的。所以我们肯定已经在路上了。
所以我们在这里。我们基本上转换成了灰度。现在我们要进行下一步。但在此之前,再次记住,如果你在命令窗口中输入,这可能会有点费力。为了节省时间,我将打开一个之前已经写好的脚本。这就是图像检测。
这里你会看到我在阅读图片。记得之前我只是在文件浏览器中双击图像,并使用导入向导将它们拉进来。你也可以在MATLAB中使用imread函数。点击F1,就会弹出帮助。你可以看到它是一个读取图像或图形文件的函数。这是语法。如果你向下滚动,这里是它处理的不同文件类型。这是在命令行或脚本中导入图像的好方法。
因此,我将清除我们的环境,重新运行这个脚本。你可以看到我用黄色突出显示了这部分代码。这实际上是一个代码段。如果我点击周围,你可以看到这个黄色区域在移动。这也是MATLAB中很有趣的一个方面。您可以使用这些双百分号创建这些代码部分。如果我用一个百分号,这就是注释。但是如果我使用双百分号,我创建了一段代码。
这本质上是一个复杂的断点。所以黄色区域内的所有东西都是一个单一的执行点。如果我运行这部分,它会运行里面的所有代码。我可以把顺序打乱。所以我可以回来运行前面的部分。所以这是一种非常好的迭代和快速收敛解决方案的方法。你不需要运行整个文件或整个应用程序也不需要像其他语言那样按顺序或时间顺序运行,这是一种很好的环境工作方式。
因此,让我们继续一步一步地检查这个脚本。这是第一部分。打开编辑器选项卡,点击提前运行。让我们继续运行它。在这里,我们用两张彩色图像填充我们的工作空间。我现在要给他们俩做个即兴表演。在这儿。这是之后的图像。这是之前。让我们把它们转换成灰色。
这里我们在工作空间中有另外两张图像,用imshow打印出来。在这儿。这就是我们要开始分割图像的地方。回到这两张图像,这是我们的灰度。这是之前的。这是我的后餐。记住,这里有很多常数,对吧?两张图片的背景都是静态的。唯一改变的是我们想要分离或分割的东西。这就引出了另一个简单但强大的分割方法。 And that's background subtraction.
所以我们要把这里的参考图像从第二张图像中减去它。希望我们能得出不同的结论。如果我们回到MATLAB,你会在这一节看到,图像相减,有很多种方法。我在这里做的一种方法,也就是要运行的方法,我有两个图像,之前和之后。我要用一个减去另一个。我要取一个绝对值来确保没有负数。这只是基本的数学运算。记住,MATLAB把所有东西都看成矩阵。这只是一个简单的数学运算。没有for循环。 There's nothing really tricky. Just by doing a simple subtraction, I'm able to remove the background.
你也可以用imsubtract。图像减法也是一个图像处理函数。这只是向你们展示了在MATLAB中有多种方法来做同样的事情。这是一个非常灵活的环境。
让我们减去图像。让我们提前运行这一部分。现在剩下的是,这很有趣。所有的背景都变成了黑色。我要分割的部分,你可以看到他开始出现了。他有点憔悴了。但是你可以看到它做得很好。实际上我把入侵者高亮标出了。但是我们要做更多的处理这样我们才能让这个更明确,更容易处理。但我们绝对是在正确的轨道上。
在这段代码中,我们要找到最大差值的位置。所以我们要做的就是找到最高强度。它会遍历每一行和每一列寻找最大的像素强度。如果我们想在下一段代码中看看这是什么,这里我们使用imtool来查看这里的image diff。让我们继续运行这个部分。我可以按ctrl - enter来运行这段代码。这是我们的图像。让我们放大一点。
如果我们点击这里的检查像素按钮,这是强度。我可以拖动这个。我们可以看看周围。我们可以看到,在黑色区域,它接近于零。在人身上,你可以看到大约在40到150之间。你们可以看到强度在哪里。它们有些有点低。但有些人高达150,最高的大约是256,我们离这个数字还很远。
我们要做的就是运行这段代码。你看我这里有点乱了。我们来求最大差值位置。如果我们运行这个,你会看到这里,这是我的图像。我们在强度最高的地方画了一个漂亮的小星星。我相信我们用imtool看到过。我们看到大约是155。本质上,这是物体的质心或质心。让我们继续,我们已经用过imtool了。让我们继续移动到这个阈值区域。
因此,阈值化是另一种简单而强大的图像处理技术。本质上,我要做的是将这个灰度图像转换成只有1和0的二值图像。我要做的就是创建这个新变量image thresh。我要取图像差l我要说的是所有强度值大于8的,我想把它改成1。小于8的,设为0。再一次,这是我们的起点,如果你愿意的话。如果你还记得一些强度,大多数都在20或40以上。所有的背景都是接近黑色的。所以我们应该会得到很好的结果。让我们继续运行这个部分。 Again, I'm just going to hit Control-Enter.
你可以看到,嗯,现在更明显了。我们有我们的对象,入侵者,在这里,高亮显示。这是我们的质心,以确保我们确定了正确的物体。然而,我们确实有一些随机噪声漏了进来。所以这可能是由于相机移动或其他原因,当它被减去的时候,背景会留下一些残留物。所以我们要把这个清理干净。因为一旦我们进入下一步,我们希望图像非常干净。因为在做区域分析或物体分析时,所有这些小点,本质上都是小物体。这真的会让我们的计算中断。
让我们继续在图像上多做一些工作。在填充区域这一节中,我们会用到一个叫bwareaopen的函数。所以这个函数实际上是一个形态算子。形态学实际上只是基于形状的过滤器的一个花哨的词。这是一种图像处理技术。如果我点击F1,这就是我们可以根据形状过滤图像的地方。
在这种情况下,它更灵活一些。我们要在这里输入黑白图像。但是字母p或者输入值是什么,我们要筛选的对象的大小是多少?面积有多大?所以你要输入一个像素为单位的区域来进行筛选。在我们的例子中,我们想说,这是二值像。我们要把它作为变量传递进来。我们会说所有大于或等于15像素的区域都要保留。小于这个数的,就会掉出来,最终变成0。这应该能让图像清晰一些。
运行这个部分- control - enter。你会发现它运行得很好。所有那些随机的噪音都消失了。我们有一个物体,主要的那个。看起来像是他的手,这可能是他影子的一部分。但除此之外,它还是很不错的。我们肯定可以用这个。让我们回到这里。
在这一节中,我们要做的是图像叠加。关于这个函数有趣的是这个函数不是来自MATLAB。它不是图像处理工具箱的一部分。它实际上是我们从File Exchange下载的一个实用程序。这是来自我们的用户社区。让我们继续,我会告诉你我从哪里得到的。
这是我们在MATLAB中心。这是我们所有MATLAB的用户社区。在这里您可以找到很多很棒的资源,比如代码示例。人们会问问题,讨论很多话题。但你也可以得到一些很好的工具。这是图像覆盖。如果我点击这个,你会看到一个描述。这只是将一个图像覆盖在另一个图像上。你会看到一个非常漂亮的画面。你可以突出任何感兴趣的东西。 And in our case, we want to highlight our intruder. So this is a perfect function for our use case.
让我们回到MATLAB。这是图像叠加函数。你可以看到它。我们下载了它。它也在当前文件夹中。我们要传递这两张图像。因此,让我们继续运行代码- control - enter的这一部分。这是我们的图像。你可以看到我们用红色标出了入侵者。这是一种很好的视觉方式向用户或与我们共享代码的人展示真正发生了什么变化以及我们在图像中识别出了什么。 And here's our intruder.
让我们回到这里。我们要做另一步处理。记住,我是在测量那个人。我在计算他们有多高。好吧,也许我们想要屏蔽掉,不要有任何错误的触发,比如说,当一只猫进入视野时。这不是我们真正关心的。但是当有人进来时,我们一定要拉响警报。
这里我们说我们只关心长度大于或等于80像素的东西。所以这里我们将使用一个函数来帮助提取这个值。我们将使用一个名为regionprops的函数。如果我点击F1,你会看到这来自我们的图像处理工具箱。这是一个非常强大的函数。因为本质上它能做的是从图像中的物体中提取统计信息。通过传递图像,你可以得到像面积这样的东西。你可以找到质心,直径,像素值,强度,偏心率,物体有多圆,周长。因此,可以提取很多强大的统计数据。在我们的例子中,我们要求坐标轴的长度,也就是这个人有多高。
如果我们调用这个函数,我们会在这里存储一些新变量。现在我们来看看所有的主轴长度。我们来比较一下。任何大于80的数,都要存储。如果它大于80,我们将在最后一部分做这个检查看看我们是否有感兴趣的东西以及图像中是否真的有不同的东西。
让我们继续运行这段代码。在工作区中,我们填充了一些新变量。这里我们有image stats和image stats final。如果我们打开这些数组,你会看到我有很多主轴,所以有很多长度。然而,唯一让我们感兴趣的是这个大于80,107。为了验证过滤是有效的,这里我们可以看到主轴在80以上。我们找到了。这是107。
如果这能正常工作,如果我们运行这里的最后一段代码,这就是说如果这个矩阵是空的我们就会说没有什么不同。在我们的例子中,有一些东西。所以我们应该能够打印出图像中的某些东西。让我们运行最后一部分。如果我转到命令窗口,你可以看到这里打印出来的输出长度超过80。是107。图像里有东西。
现在我们的算法运行得很好。这是一个很好的阶段,我们可以开始分享它并获得反馈。所以有很多方式来共享你的代码。你完全可以把MATLAB文件分发出去。如果你的同事有MATLAB,他们可以运行和测试。但另一种很好的共享方式是,如果你点击这里的代码,我们在编辑器窗口。你可以看到我们有一个新的编辑器选项卡。这和我控制不同部分的步骤是一样的。有趣的是,我们还有Publish选项卡。
这里你会看到,你可以做一些事情,比如高亮,强调代码。因为你放到MATLAB文件里的。m文件,会出现在期末报告里。所以你可以做很多额外的注释来提供更多的描述和上下文当这个被生成的时候。
这里,如果我们去发布,让我们继续发布图像检测。本质上,当你这样做的时候,它会运行整个算法。让我们继续运行它。现在你有了一个非常好的HTML文件。这个文档现在可以和其他人共享了。如果您还记得之前,我们创建了那些带有双百分号的代码部分——这里的每个注释现在都成为这个目录中的导航点。这是读入图像的部分。你会在这里看到它。这是那部分的代码。这是彩色图像。 And you can see the output from that section of code, and so on.
所以这是记录工作的好方法。你可以很容易地向你的同事展示你是如何从逻辑上得出你的解决方案或结果的。这是一种很好的形式,不仅可以用来分享,也可以用来做笔记帮助你记录你的工作,这是一种很好的分享方式。
现在让我们来看看视频直播。虽然这很有趣,但我们已经处理了一些静态图像。我们真正开发了,我们认为,这个算法的关键是什么。现在,我们想进一步扩大规模,转向我们的入侵者检测系统。所以最重要的部分是与实时视频合作。所以我们将使用一些低成本的硬件,比如一个简单的网络摄像头。要做到这一点,我们要验证我们有正确的硬件连接。
如果我们转到这里的Home选项卡,点击附加组件,你可以看到这里有一个选择-获取硬件支持包。金宝app如果我们点击这里,你会看到这个漂亮的向导。这里,你可以看到我们有选择。我要从网上安装。单击Next。这是不同的选择。
这里是所有不同类型的硬件目标,你可以直接从MATLAB中访问,从ARM处理器,树莓派,BeagleBoard,很多不同类型的输入,比如乐高机器人的Mindstorm。向下滚动,你会看到这是USB网络摄像头。如果我选中它,你会看到我已经安装了它。它会问我是否要重新安装。它只是告诉我版本。因此,这就是如何继续下去,只需选择不同的支持包来支持您想要接口的硬件类型。金宝app
让我们从视频开始。我要打开之前写的另一个脚本。我先把这个关了。我们可以看到,在左边,我有这个,分段下划线fn。这和我之前写的图像检测算法是一样的。唯一不同的是我把所有的表演都注释掉了。因为此时我不需要再调试它了。我知道所有的步骤都很有效。我经常使用imshow来调整我的图像。这个算法现在运行得很好。
我所做的,如果你看顶部,使用了一个关键字function。这能让整个文件变得更有用。它的作用是让我把这个算法作为一个函数来调用。与我调用RGB到灰色的函数相同,我现在可以将整个例程称为段下划线函数。很棒的是我不仅可以调用它,我还可以传入输入参数就像传入图像一样将RGB转换为灰色。在这种情况下,你可以传入一张之前的,我办公室的参考图片,然后是之后的图片,我们正在寻找入侵者的图片。
它会运行这个算法。更妙的是,你甚至可以有,一个返回值。这里我们将返回高亮显示的图像,我使用了来自文件交换的图像覆盖函数。如果我向下滚动,你可以看到我在哪里做了那个赋值。在我执行图像叠加之后,我把它传递回这里的变量,高亮图像。然后这个函数,或者函数被调用的地方,会返回这个高亮显示的图像。
函数是非常强大的是让你的算法更容易理解和使用的好方法。调用这个函数的地方是另一个叫security_cam的函数。安全摄像头是我的下一个功能。所有这些都是设置摄像头,我从网上下载了一个支持包。金宝app我正在建立它。这里,我用的是参考图像。所以我要在任何人进来之前给我的办公室拍张照片。这是我的参考或背景图像。这里,我要进入一个for循环。当我遍历循环的每一次迭代时,我将拍摄一个新的快照来寻找入侵者。 And then I'm going to call my segmentation function. I'm going to pass my reference image as well as my newly taken picture, and I'm going to hopefully come back with nothing. But if it does detect an object, it will return it here and will print that out to the display.
这就是它的全部。我引用了我的算法。我把它变成了一个函数。我在这里运行这个for循环。我在这里也做了这个安全函数。我可以在命令行输入这个。如果我继续,输入security_cam,然后点击返回,这里我的实时视频就运行了。
你可以看到我的手被分割得很好。用红色突出显示。实际上,您可以在我的命令窗口中看到正在检测到一些东西。但是如果我把手移开,你可以看到它回到了图中什么都没有。所以这是很有效的。我大大增加了我的数据集。现在我用的是实时视频。
最后我要做的是在我的算法之上加上一个漂亮的用户界面。我已经创建了它。我已经用真实视频验证过了。现在我要创建一个漂亮的用户界面。为了做到这一点,我实际上使用了一种叫做向导的东西。导游,如果你在这里搜索,你就会明白我在说什么。在Help里面,你会看到打开了一个GUI布局编辑器。图形用户界面就是GUI的简称。你会看到这里有不同的方法来构建这些用户界面。
有很多方法可以构建对话框。你可以制作一些非常复杂的ui。因此,有一种很好的方法来建立良好的接口,让你与算法进行接口和调整。它还可以让你轻松地分享这些。当你构建这些gui时,本质上,你是在创建一个应用程序。当你有这些应用程序时,有各种各样的方法来安装它们。你可以把它们作为安装提供给其他有MATLAB的人,这是一个很好的方法,可以让你的代码更易于共享,并使你的代码成为一个完整的应用程序。
即使是所有这些小工具,如果我回到MATLAB,好,让我们继续,让你们看看这里创建了什么。这是一个图形窗口。使用guide,如果我打开这个,你会看到我们用了很多实用工具来创建这些对话框,来创建这些图表,你们马上就会看到填充。你们在一开始就看到了。这一切都在运转。我们创建了这些漂亮的滑动条,一个开始和停止按钮,甚至是获取参考图像的按钮,这些都是布局界面的好方法。
这里,我不想让你陷入代码的泥潭,但本质上,这是连接到用户界面的函数。所有的代码都在这里。最终的结果是,如果我运行这个,你会看到会发生什么,我们会得到这个非常漂亮的界面。我可以把参考图像放在这里。这是我办公室的照片。这是我的开始按钮。如果我继续点击开始你可以看到,它运行得很好。但这里我有一个调谐旋钮。所以我可以把它移动到恰当分割的位置。这里它实际上并没有选择正确的对象长度。 So let's go ahead and tune this till we get an alert. And now we've essentially tuned it. And we have a really nice working system.
这里我们有一个很好的用户界面。我们的算法在下面运行。我们和它有很好的互动。我们也可以和我们的用户分享一个漂亮的HTML文件来帮助记录你所做的事情。让我们继续回到我们的演示。
为了总结我们的演示,我们回到典型的技术计算工作流。你也看到了我们如何访问数据。首先我们处理标准JPEG图像。我们用导入向导将它们导入。我们做了一些开发。后来我们甚至用低成本的网络摄像头集成了一些硬件。我们做了算法开发。我们用我们的发布函数来分享它。所以我们能够在不同的阶段中移动。您已经看到了我们如何使用脚本来帮助实现自动化。 And in doing so we used MATLAB and some of the functions from the Image Processing Toolbox to make our intruder detection system.
要了解更多关于MATLAB的知识,请访问我们的网站www.tatmou.com/matlab。在那里你会发现很多有用的视频,代码示例,让你开始创建自己的应用程序。如果您需要任何帮助,我们当然会提供支持。金宝appMATLAB Central也是一个很好的资源,在那里你可以找到很多专家,来自MathWorks和我们的社区,他们帮助回答问题,提出很棒的主题,以及分享代码,只是为了真正启发你,让你开始你的旅程。
想了解更多关于Image Processing Toolbox的知识,请访问我们的网站:www.mathworks.co m/products/ Image。下载188bet金宝搏在那里你会发现很多其他的视频和例子,都与图像处理有关。你们也会在右边看到我的照片。所以如果你有任何问题,也许你是这个领域的新手,只是想讨论一些功能,请随时给我发邮件。我会尽力回答你的问题。
所以请留在这里。我们已经到了会议的尾声。希望你学到了一些东西,对MATLAB有了很好的介绍,看到了一些功能和可能性。请不要离开。接下来是问答环节。请输入你们的问题。我们休息一会儿。然后我们会回来为你们解答。再次感谢,一分钟见。
记录时间:2014年3月26日