从系列:计算机视觉与MATLAB
阿维纳什尼希米,MathWorks公司
在这个介绍性的网络研讨会,你将学习如何使用计算机视觉算法来解决现实世界的成像问题。计算机视觉使用图像和视频来检测、分类和跟踪对象或事件,以了解真实世界的场景。
你会发现如何:
我们将通过展示现实世界的例子,包括主要特点:
此网络研讨会假设与MATLAB的一些经验,并与计算机视觉没有任何经验。我们将专注于计算机视觉工具箱。
关于主讲人:Avinash Nehemiah在MathWorks从事计算机视觉在技术营销中的应用。在加入MathWorks之前,他花了7年时间作为算法开发人员和研究人员,设计用于医院安全和视频监控的计算机视觉算法。他拥有卡内基梅隆大学的MSEE学位。
欢迎来到本次网络研讨会上计算机视觉变得容易。我的名字是阿维纳什尼希米,我对计算机视觉在这里MathWorks公司的产品营销经理。在我们开始之前,这里就是我要谈谈接下来的40分钟左右的快速概览。
我将从定义计算机视觉开始,并向您展示几个有趣的计算机视觉示例。然后我将向你们展示使用MATLAB和计算机视觉系统工具箱来解决真实的计算机视觉问题是多么容易。我将向您展示如何解决问题,例如在杂乱场景的图像中定位对象,分析繁忙街道上的交通流,以及在视频中跟踪某人的移动。
那么,什么是计算机视觉?计算机视觉通过使用图像和视频来了解通过检测,分类和识别物体和事件的现实世界场景扩展图像处理。在此视频中,我使用图像处理通过调整输入图像的对比度和锐化了图像以提高图像质量。然后我用计算机视觉检测和计数的移动物体。我想指出的是,这是我将展示以后怎么解决这个研讨会的问题之一。
我们的客户已经在利用计算机视觉解决各种各样的问题已经非常成功了多年。例如,宝马采用计算机视觉创建的停车辅助系统。和NASA使用计算机视觉来帮助土地的火星车。
在我们开始之前,这里有一些技巧可以帮助你充分利用这个网络研讨会。我们会在网络研讨会结束时提供这些代码,我真的鼓励你们去看看。现在我们来解决一些问题。对于我的第一个问题,我想做的是在左边的图像中检测书的一个对象,在右边一个杂乱的场景的图像中。
现在有解决这个问题的一些挑战。对象可以出现在现场旋转。有可能是一个规模的变化,其中对象可能出现比模板大或变小。或者你可以有混乱,或者你有可能隐藏你正在寻找可能混淆你的算法对象的部分,或confusers其他对象。
所有这些意味着你不能使用标准的图像处理技术,比如模板匹配,来解决这个问题。你需要找到一个更加复杂和稳健的算法。我选择的解决这个问题的方法是一个称为特征检测、提取和匹配的工作流。我选择这个方法的原因是,这是计算机视觉中一个非常基本的工作流程,可以用来解决各种各样的问题。
第一步是检测左侧对象中有趣的特性,这由红色标记表示。下一步是获取被检测到的特征周围的区域,并将该区域的一些信息编码到所谓的特征向量中。然后对右边的图像做同样的处理。在那之后,你寻找你为这两幅图像计算的特征向量之间的对应匹配。
一旦你拥有了一系列匹配功能,您就可以估算出场景中的物体的位置。现在,在我们开始之前在MATLAB的工作,我想真的很快说说是什么让一个很好的功能。所以一个很好的功能检测是不同的图像区域,一些导致其他图像的明确的比赛,那是重复在许多图像随着时间的推移。因此,对于一辆白色轿车的这一形象,这可能是一个角落,也许汽车本身的模板,或更现代的东西,像冲浪功能,可检测的斑点,或MSER功能,可检测的区域。
现在让我们用MATLAB开始。现在,我想首先要做的物体的图像中读取,我想检测并导入到我的MATLAB的工作空间。因此,要做到这一点,我要右键点击图片放在这里,单击导入数据,而MATLAB是要给我打算让我导入此数据到我的工作区MATLAB向导。
你可以看到一个名为LostBook3变量在我的工作区露面。现在我要做的下一件事就是我要去尝试和可视化这一数据,只是为了确保我写正确的形象。因此,要做到这一点,我会点击这个变量,我要在MATLAB图选项卡。什么MATLAB所做的是它给我情节,将这个变量,我已经点击工作清单。所以我要点击imshow,这是怎么回事要显示的图像,我只是阅读。
现在,作为一个边注,这本书中,数字图像处理与MATLAB,是一个很好的介绍图像处理。如果你是新的图像处理和计算机视觉,我会强烈建议你检查一下。
现在,你不必总是要利用这一点和点击界面将数据导入MATLAB。您也可以使用imread函数读取的图像。这不,我只是导入向导做了完全一样的事情。
现在我的下一步是把这个彩色图像转换成灰度。我这么做的原因是很多计算机视觉算法,尤其是特征检测算法,更喜欢灰度数据。我将使用rgb2gray函数来实现。正如我在幻灯片中提到的,工作流的第一步是检测有趣的特性。
现在我知道我想要检测特征,但我不完全确定MATLAB有什么功能可以让我这样做。我来告诉你们一个简单的方法。我要去右上角的搜索栏,我要输入,"检测功能"And when I press Enter, this opens up the Doc center, and this lists all the functions that I could use in MATLAB to detect features.
我将选择检测SURF特性,这将告诉我很多关于在MATLAB中检测SURF特性的知识。它会给我函数语法,函数的描述,以及更多关于参数的信息。如果我向下滚动一点,这实际上向我展示了一个如何使用MATLAB来检测SURF特性的例子。
让我告诉你关于MATLAB帮助一个非常酷的事情。我所能做的就是,我可以高亮显示一行的代码在这里,我可以用鼠标右键单击和命中评价部分。而这样做是它将插入代码到命令行窗口,并运行它。所以你可以说,它的运行检测SURF采用了图像IIN上的功能,它的返回变量指向。如果我看这点变量我的工作区,它实际上是2048 SURF点,涨幅超过2000点SURF一点。
所以,现在让我回去给我的帮助,和帮助真实地反映了我,我怎么能想象的SURF功能。什么这部分代码确实是它只是形象化10个最强的功能出了2000点的功能检测。所以,如果我评价这一部分,你可以看到,10个最强的功能真的趴在数字图像处理的文本。你有一些关于信我。你有一对夫妇上的字母N字母M,一个功能,以及一个对字母R.这些都是非常不同的区域在图像中,你可以想像,这些将使它很容易图像之间的匹配。
现在有一件事你可能已经注意到的是围绕这些检测到的特征圆的半径是不同的。现在出现这种情况的原因是特征检测算法告诉你周围的功能区有多大,你需要解压到您的形成特征向量。因此,让我们想象这是一个好一点,看看周围这些检测功能这些地区。
因此,要做到这一点,我究竟要在可视化图像I.最强的20个功能和你可以看到,所有这些功能在于数字图像处理书的文本。最强的功能似乎是围绕着字母I有很多的字母M和N再次,这些都是非常有质感的区域,区域,你可以想像会很容易图像之间的匹配。
现在您可以看到,MATLAB是一个很好的环境,它可以导入数据,探索数据,了解您正在解决的问题。但MATLAB也是一种优秀的脚本语言。所以让我打开我写的脚本,帮助我更好地解释这个问题的其余部分。首先,我要关闭当前的文件夹浏览器,以便我们有更多的空间来查看代码。
现在您可以看到这段代码被分成了几个不同的部分。这是MATLAB中一个非常非常酷的特性你可以不按顺序运行这些部分。你可以运行第3部分,然后你可以返回运行第1部分,然后你可以运行第2部分。对于那些来自C和c++世界的人来说,这是非常不同的,在那里,如果你对代码做了更改,你就必须重新编译你的项目,而且你不能运行任何无序的东西。
所以我要通过清除我的工作区启动。然后,我会在我的两幅图像阅读。我要在对象和场景阅读。还有一两件事,我想指出的是我有我想要检测的对象是从它是如何出现在我的场景非常不同的模板。我的意思是,这本书都有不同的颜色盖,它实际上是这本书的不同版本。
然后,我要检测SURF功能,比如我给你在命令行上。在这之后,我实际上将使用提取特征函数提取的功能。你可以看到两个变量都出现在我的工作区,称为feats1和feats2,是大小相同的检测SURF特征点,但他们的64个元素宽。
这意味着我用了64个元素来表示被检测到的特征周围的区域,我的特征向量有64个元素长。既然我已经展示了这些特性,我就跳过这一节,转到下一节。如前所述,最后一步是匹配两个图像之间检测到的特征。为此,我将使用匹配特征函数。
现在让我向您展示另一种快速方法,以了解有关您在编辑器中使用的函数的更多信息。要做到这一点,您可以右键单击一个函数,然后单击“选择帮助”,或按F1键,这就为您提供了该函数的帮助。因此,您可以看到如何匹配功能的帮助,它为您提供了一个函数描述,还为您提供了如何使用该函数的示例。
那么我现在要做的是,我将使用匹配功能的功能来满足两个特征向量,设有1和特点2.然后我将显示,使用show匹配匹配的功能特性功能。大!因此,大家可以看到,我们所做的这本书在左边,这本书在场景之间的匹配的一个很好的工作特点。
但这里有个小问题。正如你所看到的,书外出现了大量虚假的匹配。这是一个问题,因为如果你使用这些匹配来估计书的位置,你基本上会得到一个边界框,它是这个图像的一半,这不是完全准确的。我来告诉你们怎么解这个问题。
为了解决这个问题,我们将使用名为RANSAC的算法。现在RANSAC是短期的随机样本共识。和RANSAC是估计的数学模型,同时滤除离群值的方法。那么这是什么意思?因此,对于这个数据,并在左边这张图片,如果你想估计直线的方程,有什么RANSAC会做会帮助你估计这条线的方程为蓝色,位于右侧,而在红色过滤掉所有的点,或者不离群真正有助于找到该行的方程。
现在在我们的例子中,我们实际上要做的是估计这些点的几何变换从图像,抱歉,是场景中的物体。让我们回到MATLAB。这里我使用估计的几何变换函数,它使用RANSAC在引擎盖下找出我的inliers,并告诉我物体和场景之间的变换。让我运行一下,然后我将再次使用show match features函数来显示匹配。
大!你可以看到,RANSAC的做过滤掉离群我有这样的人的虚假匹配,现在我有较少的比赛了出色的工作,但所有的这些比赛都非常精彩的比赛。你已经找到左侧的对象,并在右边的场景之间的精确匹配。
现在我做的最后一步是定位在场景中的物体。因此,要做到这一点,我将使用变换我使用RANSAC计算。而且我会从对象中变换边框的方程到场景中。我将用一个函数调用转换点前做到这一点。因此,让我们看看如何看起来。你可以看到它的工作场景定位的书了出色的工作。这是,尽管事实上,我们使用这本书的模板是从我们有很大的不同。实际上,我们有这样的was--本书的封面是一个完全不同的颜色的模板。
现在,有一个脚本的另一个好处是我可以很快地改变一个变量,运行不同的数据,看看我的算法是如何工作的。我要换一幅图来读。我要运行整个程序。我不会像之前那样一步一步来。正如你所看到的,在这本书的左边,算法做了一个很好的工作在右边的相同的场景中定位它。
正如我前面提到的,这个工作流程提取和匹配功能,在很多的应用和计算机愿景使用。那么让我告诉你一个不同的应用程序的一个例子。因此,要做到这一点,就是我要做的就是我会通过点击问号那里打开文件中心。我要点击到计算机视觉系统工具箱。然后,我会打开实例标签,而这个名单出来的例子数量巨大,真正告诉你很多不同的计算机视觉问题。
而且我要点击视频镶嵌。现在视频镶嵌是什么,是你把一个场景的图像从不同的角度,然后缝合他们都在一起,形成该场景的镶嵌。现在,特征检测提取和匹配的视频用于镶嵌弄清楚如何将图像缝合在一起。因此,功能,故从帧在左侧的图像相匹配的框架,以及用于估计帧之间的转换,然后将其用于创建不错的视频马赛克,你的形象在这里看到。
综上所述,为了在杂乱场景的图像中定位目标,我们使用了特征检测提取和匹配。我们发现该算法对旋转、尺度变化、甚至轻微的遮挡都具有很强的鲁棒性。我们了解了如何使用RANSAC来帮助去除异常值。我们还了解到,该算法在许多应用中得到了应用,比如图像配准和自主机器人,在这些应用中,机器人实际上使用该算法来帮助找到它们的充电站。
在上一个例子中,我向您展示了如何检测特定的对象和图像。在下一个示例中,我将向您展示如何检测移动的对象。我们将利用这些信息来分析繁忙街道上的交通流量。在MATLAB中,我要检测运动的物体。然后我要计算每一帧视频中移动物体的数量。
现在你可能注意到了这个例子和上一个例子的不同之处,在这个例子中,我使用了一个视频流,而在上一个例子中,我使用了一对静止的图像。为了帮助处理MATLAB上的流数据,我们使用了一种称为系统对象的东西。现在系统对象和MATLAB对象被设计来处理流数据,比如视频。它们可以表示算法或输入-输出功能。
现在,要记住的关键事情是系统对象有一个用于处理数据和运行系统对象的步骤方法。现在关于系统对象真正酷的事情是它们在MATLAB和Simulink之间架起了一座桥梁。金宝app你在MATLAB中使用的系统对象也可以用在Simulink中。金宝app因此,让我向您展示一个关于系统对象如何工作的快速示例。
所以我有了这个脚本,我将在这里使用视觉。VideoFileReader系统对象读取视频文件。然后我将使用视频播放器系统对象来显示视频。我将使用isdone方法。isdone方法是特定于VideoFileReader对象的,它让你知道什么时候视频结束了。
所以,现在我要去循环,直到我到达视频的结尾。我将使用阶跃函数读取视频的下一帧。而我则打算使用阶跃函数来显示视频。因此,让我运行这个,看看我所得到的。
正如你所知道的,MATLAB已经阅读使用系统对象的视频,这就是它显示。现在你可能已经注意到,这段视频其实是打得比实时更快了很多。这也是这样做的原因是利用MATLAB读取数据的速度,因为它可以从硬盘驱动器,并将其显示在屏幕上。
让我们回到我们的问题。现在,你需要做的第一件事是找到每个视频帧中的移动像素。为此,我们将使用一种叫做背景减法的算法。背景减法,它的作用是估计背景的统计模型。所以这幅图的背景通常是建筑物,天空,道路的一部分。基本上,像素不会随着时间改变,可以被认为是背景的一部分。
所以,如果你有一个输入图像,如果你减去刚刚学过的背景模型,你会得到一个二元掩模。这也被称为前景遮罩或运动遮罩,其中由一个表示的像素实际上是与背景不同的像素。所以在这个例子中,你会看到汽车,汽车的位置,是用像素表示的。所以让我们跳进MATLAB看看怎么做。
我要打开另一个脚本,我称之为计数车。我要先清理一下我的工作空间。然后我将创建一个视频文件阅读器来读取我的数据。然后我实际创建了两个视频文件显示,一个显示前景,一个显示视频。
我做的下一件事就是创建前景探测器的系统对象。现在前景检测器系统对象执行背景减除。因此,让我们开拓的帮助只是为了得到它做什么更好看。因此,大家可以看到,vision.ForegroundDetector系统对象使用高斯混合模型来检测前景。
这里我要做的是运行前75帧视频通过前景探测系统对象。我这样做的原因是我想给它足够的时间来学习前景。在那之后,我要停下来,我要看一下视频的第75帧,我也要看一下前景。
因此,让我跑的那款。正如你所看到的,在这里该图像中,前景实际上是其像素移动和像素不是一个很好的代表。所以背景减除的完成学习的背景,并找出哪些像素是前景的一个很好的工作。
然而,有一个小问题。如果你观察所有这些小的杂音,如果你用这些来自前景的数据来计算移动物体的数量,你会有数百个物体,因为这些杂音也会被计算为移动物体。这是非常不准确的。接下来要做的就是过滤掉前景中的噪声。
现在要做到这一点,我将使用一种叫做图像形态。现在形态是图像滤波的形式,有助于滤波器的二进制图像和清理,去除一些噪声。因此,要做到这一点,我会用它在IMOPEN功能实现的开放形态操作。而且我要使用的过滤元件,其半径为1的磁盘,以便让我跑,要看看它的外观。哇,你可以看到它的完成消除所有的噪音了伟大的工作,而它实际上一直说我想算完整的所有对象。
现在我们知道我们需要用到图像形态学,让我来告诉你们我是如何得出这个结论的我想用一个开放的操作来处理那个特定的结构元素。现在,我要点击MATLAB中的Apps标签。这里列出了我在MATLAB中安装的所有应用程序。现在,大多数MATLAB工具箱都附带了一套应用程序。但我要用一个叫morphTo的应用。这个应用程序是由Brett Shoelson创建的,他是MathWorks的一名应用工程师。这在MATLAB文件交换中是免费的。
我要做的是从我的工作空间中导入一个变量,在这个例子中是前台。morphTo应用程序能让我尝试MATLAB中所有不同的形态学运算,这样我就能找出解决我的问题的方法。我先试试膨胀函数。你可以看出,这让我的噪音情况变得更糟。这不是理想!
侵蚀函数实际上摆脱所有的噪音,但它实际上损害一些移动的像素,我想保留的。所以,这也并不理想。然后,我尝试了IMOPEN功能,这是一种侵蚀后跟一个扩张,这确实去除噪声的出色的工作,保持我所有的移动对象保持不变。而且我也打算尝试使用其他操作,但你可以看到,他们不太做的一样好工作作为IMOPEN。
所以我要选择的IMOPEN,然后接下来的事情我能做的就是尽力为所有过滤元件不同的过滤元件和不同尺寸,我才终于安定下来半径为1的磁盘上,因为这似乎给我最好的结果。而这正是我想通了,我想用的打开操作与磁盘的半径为1的滤波元件。
现在,一旦你有一个干净的前景,接下来要做的事情就是群组的移动像素在一起,使您可以细分他们分为不同的移动物体。现在要做到这一点,我将使用一种叫做连接成分分析方法。这也是所谓的斑点分析系统的另一个对象来实现的。因此,让我们看看帮助来了解一点点更多地了解它。
如您所见,blob analysis计算二值图像中连接区域的统计信息。所以在这种情况下,二值图像将是干净的前景。让我们看看它给我们的统计数字。它告诉你区域的面积,质心,边界框,长轴和短轴的大小,以及方向。
我要创建系统对象。我要让它列出所有连接组件的边界框。我还要告诉它过滤掉所有像素面积小于150的对象。所以这真的会给我一些额外的很好的过滤,我无法实现我的形态学。因此,让我跑的那款。
现在,让我们继续我们的主处理循环。所以你可以看到,我做的第一件事是我在视频帧由步进视频文件读取器读取。然后我传递视频帧透过前景检测器,以及我从前景检测器的输出,以及我在其上执行断开操作。我然后通过斑点分析系统对象传递洁净照片。基本上这是什么做的是它列出了每一帧的连接组件的所有边界框。
所以后来我做的下一件事是只简单地计算的边界框的数量,并且告诉我许多移动物体如何在每一帧。我也将使用这些边框的资料得出各地各移动物的绿色长方形,只是让我有更好的可视化到哪些对象正在移动。因此,让我们来运行该处理循环,看看我们得到的。
这是一段关于我们清洁前景的视频。结果是你可以看到我在移动的物体周围画了绿色的矩形。我实际上在屏幕左上角显示了一个移动物体的计数。
现在探测移动的物体实际上只是分析交通流的第一步。接下来要做的就是在视频中追踪这些移动的物体来找出它们移动的方向和速度。下一节我将更详细地讨论对象跟踪。现在,让我向您展示如何扩展当前的示例,在这个示例中,我们只是检测对象。
现在我所做的是使用卡尔曼滤波器来跟踪被探测到的物体。卡尔曼滤波实际上给了我一个汽车运动方向的预测。我用这些信息来改变汽车周围包围框的颜色。
综上所述,为了分析交通流,我们学习了使用背景差来检测移动像素。然后我们学习了如何使用形态学来清理前景蒙版,以及如何使用连接组件分析来分割这些对象。然后我们还简单地讨论了如何通过对象跟踪扩展这个分析。
现在,我的最后一个例子,我将向你展示如何在视频中跟踪一个人从一帧到另一帧的移动。我要给Dima拍个视频。现在Dima是计算机视觉工具箱的开发者之一。我要检测他的脸然后在这个视频中追踪他是如何从一帧移动到另一帧的。
现在这样做,这是一个2步骤的过程。我首先需要检测人员对象我试图跟踪,在这种情况下将迪马的脸。而我则打算使用一个点跟踪算法,可以跟踪人的动作逐帧。现在执行下检测迪马脸上的物体检测,我会使用一些所谓的级联对象检测器。
这是基于Viola-Jones算法。它特别适用于检测人脸和其他面部特征,比如鼻子和眼睛。而Viola-Jones算法实际上可以检测物体的类别,因此它可以检测图像中的所有面孔。现在我想指出的一件事是这个算法不做面部识别。它可以简单地检测人脸,但不能识别特定的阶段。
现在让我们跳进MATLAB,看看如何做到这一点。所以我有一个脚本这里facetrack调用。所以我要通过清除我的工作区启动。然后我会在视频中读取,创建一个视频播放器,以显示我的结果。然后我会在视频的第一帧读取和显示。
这是Dima的脸。然后我要创建一个系统对象,一个级联对象检测系统对象,来实际执行人脸检测。我要一步一步通过这个级联对象检测系统对象,我要在结果周围画一个边界框。我来试试。
正如你所看到的,它在检测迪玛的脸方面做得很好。正如我在幻灯片中提到的,这个级联物体探测器对于探测其他面部特征非常有用。所以让我们看看帮助,看看我还可以检测什么使用级联对象探测器。让我向下滚动,在那里,如果我改变分类模型,我可以检测到不同的特征。所以我能探测到上半身,这听起来很有趣,一对眼睛。我有一个大眼睛对的分类模型。让我看看能不能用它来探测迪玛的眼睛。
哇,好了。正如你所看到的,级联物体探测器在探测迪玛的眼睛方面做得很好,尽管迪玛戴着眼镜。让我退一步,让我把它放回脸上。
我想提的真快另一件事是计算机视觉系统工具箱附带了一些预训练对象探测器。但我们也有功能和应用程序,你可以用它来训练自己的探测器。所以,如果你想培养我们的探测器,以探测咖啡杯,我们所提供的框架来帮助你做到这一点。
让我们回到我们的例子,让我再次运行这个部分。好 啊。我接下来要做的另一件事是使用我的点跟踪器算法检测有趣的特征,以便跟踪。现在要执行这个特征检测,我将使用一个称为最小特征的特性。现在,我使用这些最小特征的原因不是我在第一个例子中使用的冲浪特征,而是这些最小特征对跟踪特别有用。在其他一些工具中,最小特征被称为良好的跟踪特征。
所以我打算使用检测分钟的本征特性功能,探测功能。下面是一些有趣的事情。我有说,我只打算给它的投资回报率,或感兴趣区域的参数。那么,这样做是只检测到ROI或感兴趣的区域,在这种情况下,我是检测到的物体,或迪马的脸的边框内的特征。因此,让我运行的真快。在这里,你可以看到点已经仅在检测迪马的脸的那个边框检测。
现在下一步是初始化一个点跟踪器系统对象,这将帮助我们从一帧到另一帧跟踪这些点组,然后使我们能够通过这个视频跟踪Dima的移动。所以让我们再次打开帮助,看看这个点跟踪器能做什么。你可以看到它使用Kanad Lucas Tomasi算法或KLT跟踪点和视频。
对于那些正在深入研究计算机视觉的人来说,你们将会经常看到KLT算法,因为这确实是一种更健壮的点跟踪算法。如果你向下滚动帮助,它实际上告诉你如何构造系统对象,如何用特征点初始化它,以及几乎所有你需要做的来使用系统对象。
我要继续,我要初始化点跟踪系统对象用我刚检测到的点,最小特征点。让我快速地讲一下。在运行它之前,让我们先来看看我们的处理循环。首先我要用视频文件阅读器来读取图像。然后我将通过我的点跟踪系统对象传递那个帧。
当我将其穿过,它给了我两个变量作为输出。它给了我一组点和一个名为有效性组标志,告诉我这点是可见的,这点不。所以我打算使用有效性标记,以在下一帧再删除不可见的点,所以我只跟踪那些帧与帧的可见点。
其实这是很常见的,当你跟踪点,是,像,说,如果迪马将他的脸,他脸上的一侧一整套点将不再是可见的,这就是为什么你需要保持跟踪这点不再是从帧到帧是可见的。然后,我只是插入一个绿色加号,只是为了纪念点是我要追踪,这样我就可以有一个更好的感觉如何以及该算法工作。让我跑的过程中,并期待看到它是如何工作的。
正如你所看到的,它在追踪Dima的面部特征方面做得很好。但有一个问题。就像你在这里看到的,我们有一些异常值,它们粘在了一些点上,这些点并不是真的在Dima的脸上。现在为了过滤掉这些,我们可以使用和第一个例子中相同的方法,RANSAC,来过滤掉不属于Dima脸的异常值。所以我们可以过滤掉每一帧的异常值。我来告诉你们怎么做。
为了做到这一点,我有一个单独的脚本叫faceTrackRANSAC。它和之前的脚本是一样的直到这一点,然后我从上一帧和当前帧中取两组点。我用RANSAC来估计点从一个坐标系到另一个坐标系的几何变换。这个的作用是,RANSAc实际上给了我一组inliers,在过滤掉那些不在Dima脸上的异常值之后。我来运行一下。
正如你所看到的,现在它做跟踪迪马的脸一个更好的工作,没有太多的异常值周围迪马的脸区域之外。现在,这是做跟踪,但让我告诉你,说明做跟踪的完全不同的方式从计算机视觉系统工具箱另一个例子的一种方式。
为了做到这一点,我要回到我的文档中心,我要点击计算机视觉系统工具箱,我要去到范例标签。让我向下滚动到所有的跟踪例子,你可以看到有大量的跟踪例子。现在我要点击这个基于多目标跟踪的运动。
现在,这是一个非常,非常酷的例子。其原因,我认为这太酷了它实际上是给你一个框架,你可以用它来追踪移动物体。所以,你可以只取这个例子中,并用它来解决一些相当复杂的问题。现在跟踪算法这样做是因为我在我的最后一个例子后提到的一样,是它使用卡尔曼文件管理器来跟踪对象。
现在卡尔曼滤波器在物体跟踪和计算机视觉方面非常流行。这有很多原因。第一,卡尔曼滤波在实时中工作得很好。第二,卡尔曼滤波器能预测出物体的位置,即使你看不见物体,这在计算机视觉中很有用,因为物体经常会被其他物体遮挡住。
我们打开这个例子,看看它是什么样的。我来运行一下。你可以看到我的背景减法结果在右边,我的跟踪结果在左边。它会在人们进入场景时开始跟踪他们,它会给他们唯一的id,那些是上面的数字。正如你所看到的,当它们消失在视野之外,不再可见,卡尔曼滤波实际上试图预测它们的位置。这是使用卡尔曼滤波器最有趣的特性之一,它能让你继续跟踪,即使在几帧内物体不可见的情况下。
现在,有些人可能在想自己,我已经学会了三种方式的物体检测,为什么不让我刚刚从帧检测对象框架,而不是通过对象跟踪的麻烦了?嗯,有三个主要原因做到这一点。一,对象检测器是不完美的。他们失败不时。二,如果你有一个需要维护对象的帧与帧的标识中的应用程序,对象检测器就不能做到这一点。
三,这是非常关键的,在一般情况下,物体跟踪算法需要比目标检测较少的处理能力。所以,如果你想你的算法部署到移动设备上,你可能想要做的少物体检测和多个对象跟踪。
下面是我们用来跟踪一个人的运动算法的快速摘要。我们使用的级联对象检测器来检测迪马的脸。然后,我们用最小的本征特性,发现检测到物体上的特征点。而我们使用的KLT点跟踪器,这是在vision.PointTracker系统对象实现真正追踪对象帧与帧。
因此,在总结,你为什么要使用MATLAB计算机视觉?嗯,首先,MATLAB是探索和发现的一个大环境。但是,简单的编程语法,使您能够实现公平在短短复杂的系统,30行代码,由脸部追踪例子就是证明。然后有全面的文档,我一直在利用整个网络研讨会的过程。然后还有一个巨大的例子目录,你可以用它来了解更多关于计算机视觉和你甚至可以适应于自己的工作。
下面是一些推荐的下一步。我强烈建议您试用本次网络研讨会的代码。请在显示的链接上探索更多的计算机视觉示例。并通过这两个网络研讨会,实现了图像处理的简易化和计算机视觉对目标的检测与跟踪。最后,如果您还有任何问题,请将您的问题发送到下面的链接,我们将很乐意回答。
记录:2014年3月6日