从系列:MATLAB计算机视觉
阿维纳什尼希米,MathWorks公司
在这个介绍性的网络研讨会,你将学习如何使用计算机视觉算法来解决现实世界的成像问题。计算机视觉使用图像和视频来检测、分类和跟踪对象或事件,以了解真实世界的场景。
你会发现如何:
我们将通过真实世界的例子来演示关键特性,包括:
本网络研讨会假设您有MATLAB方面的经验,但没有计算机视觉方面的经验。我们将重点介绍计算机视觉工具箱。
主持人:Avinash Nehemiah在MathWorks从事计算机视觉在技术营销中的应用。在加入MathWorks之前,他花了7年时间作为算法开发人员和研究人员,设计用于医院安全和视频监控的计算机视觉算法。他拥有卡内基梅隆大学的MSEE学位。
记录:2014年3月6日
欢迎来到本次网络研讨会上计算机视觉变得容易。我的名字是阿维纳什尼希米,我对计算机视觉在这里MathWorks公司的产品营销经理。在我们开始之前,这里就是我要谈谈接下来的40分钟左右的快速概览。
我将通过定义计算机视觉和显示你计算机视觉的几个有趣的例子开始。然后,我会向你展示它是多么容易使用MATLAB和计算机视觉系统工具箱解决实际的计算机视觉问题。我要告诉你如何解决问题,如杂乱的场景的图像中定位对象,分析在繁忙的街道交通的流量,并在视频跟踪人的动作。
那么,什么是计算机视觉?计算机视觉通过使用图像和视频来了解通过检测,分类和识别物体和事件的现实世界场景扩展图像处理。在此视频中,我使用图像处理通过调整输入图像的对比度和锐化了图像以提高图像质量。然后我用计算机视觉检测和计数的移动物体。我想指出的是,这是我将展示以后怎么解决这个研讨会的问题之一。
我们的客户已经在利用计算机视觉解决各种各样的问题已经非常成功了多年。例如,宝马采用计算机视觉创建的停车辅助系统。和NASA使用计算机视觉来帮助土地的火星车。
在我们开始之前,这里有一些提示,以帮助您得到最出此次研讨会。我们将可在网络研讨会结束的代码,我真的建议你检查出来。现在,让我们解决一些问题。对于我的第一个问题,就是我想要做的是左边检测书的对象的图像中,右侧的杂乱场景的图像。
现在有几个挑战来解决这个问题。该对象可以在场景中旋转显示。可能会出现比例变化,对象可能比模板更大或更小。或者你可能有杂乱的东西,或者你有其他的对象可以隐藏你正在寻找的对象的一部分,或者混淆者可能会混淆你的算法。
现在什么都这个手段是你不能使用标准的图像处理技术,如模板匹配,来解决这个问题。你需要找到一个算法,是一个有点更加复杂和强大。我选择了解决这个问题的方法是工作流称为特征检测,提取和匹配。现在我挑选这种做法的理由是,这是计算机视觉中一个非常基本的工作流程,并可以用来解决各种各样的问题。
第一步是检测在左侧的对象有趣的特点,并且这是由红色标记所示。下一步是把周围检测到的特征区域以及有关地区的一些信息编码到你所说的特征向量。然后你做同样的事情在右边的图像。在这之后,你找相应的特征向量,你的两个图像计算之间的匹配。
一旦你有了一组匹配的特征,你就可以估计物体在场景中的位置。在开始使用MATLAB之前,我想快速地讲一下什么是好的特性。因此,一个好的特征可以检测到一个不同的图像区域,这将导致在其他图像中出现明确的匹配,并且随着时间的推移可以在许多图像中重复。对于这张白色汽车的图片,可以是一个角落,或者是汽车本身的一个模板,或者一些更现代的东西,比如检测斑点的SURF功能,或者检测区域的MSER功能。
现在让我们用MATLAB开始。现在,我想首先要做的物体的图像中读取,我想检测并导入到我的MATLAB的工作空间。因此,要做到这一点,我要右键点击图片放在这里,单击导入数据,而MATLAB是要给我打算让我导入此数据到我的工作区MATLAB向导。
您将看到一个名为LostBook3的变量出现在我的工作区中。接下来我要做的是我要试着把这些数据形象化,只是为了确保我写的是正确的图像。为了做到这一点,我要点击这个变量,我要去MATLAB的plot标签。MATLAB所做的是它给了我一列对我点击的这个变量有效的图。我点击imshow,它会显示我刚读到的图像。
现在,作为一个边注,这本书中,数字图像处理与MATLAB,是一个很好的介绍图像处理。如果你是新的图像处理和计算机视觉,我会强烈建议你检查一下。
现在您不必总是使用这个点并单击interface来将数据导入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特征,这是要告诉我相当多的东西,我需要知道有关检测SURF在MATLAB功能。它要给我函数语法,功能的说明,以及有关参数的更多信息。如果我再向下滚动了一下,这其实表明了我的,我怎么能使用MATLAB检测SURF设有一个例子。
让我告诉你关于MATLAB帮助一个非常酷的事情。我所能做的就是,我可以高亮显示一行的代码在这里,我可以用鼠标右键单击和命中评价部分。而这样做是它将插入代码到命令行窗口,并运行它。所以你可以说,它的运行检测SURF采用了图像IIN上的功能,它的返回变量指向。如果我看这点变量我的工作区,它实际上是2048 SURF点,涨幅超过2000点SURF一点。
现在让我回到我的帮助,帮助实际上显示了我如何能可视化冲浪特征。这段代码所做的就是将检测到的2000个特征中的10个最强的特征可视化。因此,如果我评估这一部分,你可以看到,10个最强大的功能,实际上是在文字的数字图像处理。你有许多功能在信上。你有几个字母M,在字母N,和一个字母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引擎盖下的功能找出哪些我的正常值,并告诉我的对象和场景之间的转换。因此,让我运行,然后我将使用show匹配功能的作用再次显示匹配。
太棒了!你可以看到,RANSAC做了一个非常棒的工作,过滤掉了我的异常值,这些异常值是伪造的匹配,现在我有更少的匹配,但所有这些匹配都是非常好的匹配。你已经在左边的物体和右边的场景之间找到了精确的匹配。
现在我做的最后一步是定位在场景中的物体。因此,要做到这一点,我将使用变换我使用RANSAC计算。而且我会从对象中变换边框的方程到场景中。我将用一个函数调用转换点前做到这一点。因此,让我们看看如何看起来。你可以看到它的工作场景定位的书了出色的工作。这是,尽管事实上,我们使用这本书的模板是从我们有很大的不同。实际上,我们有这样的was--本书的封面是一个完全不同的颜色的模板。
现在,有一个脚本的另一个好处是我可以很快地改变一个变量,运行不同的数据,看看我的算法是如何工作的。我要换一幅图来读。我要运行整个程序。我不会像之前那样一步一步来。正如你所看到的,在这本书的左边,算法做了一个很好的工作在右边的相同的场景中定位它。
正如我前面提到的,这个工作流程提取和匹配功能,在很多的应用和计算机愿景使用。那么让我告诉你一个不同的应用程序的一个例子。因此,要做到这一点,就是我要做的就是我会通过点击问号那里打开文件中心。我要点击到计算机视觉系统工具箱。然后,我会打开实例标签,而这个名单出来的例子数量巨大,真正告诉你很多不同的计算机视觉问题。
点击视频马赛克。视频拼接是,你从不同的角度拍摄一个场景的图像,然后你把它们缝在一起,形成一个马赛克的场景。现在,特征检测提取和匹配被用于视频拼接,以找出如何将图像拼接在一起。这些特征在左边的图像中从一帧匹配到另一帧,这被用来估计帧之间的转换,然后用来创建你在图像中看到的漂亮的视频马赛克。
综上所述,为了在杂乱场景的图像中定位目标,我们使用了特征检测提取和匹配。我们发现该算法对旋转、尺度变化、甚至轻微的遮挡都具有很强的鲁棒性。我们了解了如何使用RANSAC来帮助去除异常值。我们还了解到,该算法在许多应用中得到了应用,比如图像配准和自主机器人,在这些应用中,机器人实际上使用该算法来帮助找到它们的充电站。
现在,在最后一个例子,我向您展示如何可以检测特定的对象和图像。在接下来的例子,我将告诉你如何探测到移动物体。而我们将利用这些信息来帮助分析在繁忙的街道的交通流。要做到这一点在MATLAB中,我要检测移动物体。然后,我要计数每个视频帧运动物体的数量。
现在有一件事你可能已经注意到的是这个例子和上次不同,是在这个例子中,我使用的视频流,而不是最后一个例子,我在那里用一对静止图像。协助处理MATLAB的流数据,我们使用一种叫做系统对象。现在,系统对象和MATLAB对象被设计以处理流数据,如视频。他们可以代表算法或输入输出功能。
现在,要记住的关键是系统对象有一个用于处理数据和运行系统对象的步骤方法。现在关于系统对象真正酷的事情是它们在MATLAB和Simulink之间架起了一座桥梁。万博1manbetx你在MATLAB中使用的系统对象也可以用在Simulink中。万博1manbetx因此,让我向您展示一个关于系统对象如何工作的快速示例。
所以我有这个剧本我要去哪里使用vision.VideoFileReader系统对象读取视频文件。然后我会使用视频播放系统对象,以显示视频。我将使用isdone方法。现在isdone方法是特定于VideoFileReader对象,它可以让你知道当你到达视频的结尾。
现在我要循环播放,直到视频结束。我将使用阶跃函数来读取下一帧视频。然后我要用阶跃函数来显示这个视频。我来运行一下,看看能得到什么。
可以看出,MATLAB已经用系统对象读取了视频,并显示出来了。现在你可能已经注意到了,这个视频实际上比实时播放要快得多。这样做的原因是MATLAB能以最快的速度从硬盘读取数据并显示在屏幕上。
让我们回到我们的问题。现在,你需要做的第一件事是找到每个视频帧中的移动像素。为此,我们将使用一种叫做背景减法的算法。背景减法,它的作用是估计背景的统计模型。所以这幅图的背景通常是建筑物,天空,道路的一部分。基本上,像素不会随着时间改变,可以被认为是背景的一部分。
如果你有一个输入图像,如果你减去你刚刚学过的背景模型,你会得到一个二元掩码。这也被称为前景遮罩,或者是运动遮罩,其中一个代表的像素实际上是不同于背景的像素。在这种情况下,你会看到汽车,汽车的位置,被像素表示为1。让我们进入MATLAB,看看怎么做。
我要打开另一个脚本,我有一个名为countingCars。我要通过清除我的工作区启动。然后我要创建一个视频文件读者我的数据读取。然后我实际上是创建两个视频文件显示,一个显示的前景,以及一个显示视频。
我要做的下一件事是创建一个系统对象的前景探测器。现在前台检测系统对象执行背景减法。让我们打开帮助来更好地了解它的作用。正如你所看到的,愿景。前景探测系统目标采用高斯混合模型对前景进行探测。
而我要在这里做的是我确实经历的前景探测器系统对象来运行视频的第一个75帧。而我这样做的原因是我想给它足够的时间来学习的前景。在这之后,我只是去车站,我要去看看视频的第75帧,而我也要去看看那个前景。
我来运行这个部分。正如你所看到的,对于这张图,前景实际上很好地表现了哪些像素在移动,哪些像素没有移动。所以背景减法在学习背景和找出哪个像素是前景方面做得很好。
然而,有一个小问题。如果你观察所有这些小的杂音,如果你用这些来自前景的数据来计算移动物体的数量,你会有数百个物体,因为这些杂音也会被计算为移动物体。这是非常不准确的。接下来要做的就是过滤掉前景中的噪声。
为了做到这一点,我要用到图像形态学。形态学是图像滤波的一种形式,它可以帮助过滤二值图像并对其进行清理,去除一些噪声。为此,我将使用在imopen函数中实现的开放形态学操作符。我将使用一个过滤元素,它是一个半径为1的圆盘。我来运行一下。哇,你可以看到它在去除所有噪音方面做得很好,它实际上保留了所有我想要计数的对象。
现在我们知道我们需要用到图像形态学,让我来告诉你们我是如何得出这个结论的我想用一个开放的操作来处理那个特定的结构元素。现在,我要点击MATLAB中的Apps标签。这里列出了我在MATLAB中安装的所有应用程序。现在,大多数MATLAB工具箱都附带了一套应用程序。但我要用一个叫morphTo的应用。这个应用程序是由Brett Shoelson创建的,他是MathWorks的一名应用工程师。这在MATLAB文件交换中是免费的。
我要做的是从我的工作空间中导入一个变量,在这个例子中是前台。morphTo应用程序能让我尝试MATLAB中所有不同的形态学运算,这样我就能找出解决我的问题的方法。我先试试膨胀函数。你可以看出,这让我的噪音情况变得更糟。这不是理想!
侵蚀函数实际上消除了所有的噪声,但它实际上破坏了一些我想要保留的移动像素。这也不理想。然后我尝试了imopen函数,这是一个先腐蚀后膨胀的函数,它在去除噪声和保持所有移动对象完整方面做得非常好。我还将尝试其他可用的操作,但如您所见,它们没有imopen做得那么好。
所以我要选择的IMOPEN,然后接下来的事情我能做的就是尽力为所有过滤元件不同的过滤元件和不同尺寸,我才终于安定下来半径为1的磁盘上,因为这似乎给我最好的结果。而这正是我想通了,我想用的打开操作与磁盘的半径为1的滤波元件。
现在,一旦你有一个干净的前景,接下来要做的事情就是群组的移动像素在一起,使您可以细分他们分为不同的移动物体。现在要做到这一点,我将使用一种叫做连接成分分析方法。这也是所谓的斑点分析系统的另一个对象来实现的。因此,让我们看看帮助来了解一点点更多地了解它。
因此,大家可以看到,斑点分析计算连通区域的二进制图像的统计信息。所以在这种情况下,二进制图像将是干净的前景。让我们看看统计它给了我们。所以,它会告诉你的东西,如地区,质心,边界框,在长轴和短轴的尺寸和取向的面积。
我要创建系统对象。我要让它列出所有连接组件的边界框。我还要告诉它过滤掉所有像素面积小于150的对象。所以这真的会给我一些额外的很好的过滤,我无法实现我的形态学。我来运行这个部分。
现在让我们进入主要的处理循环。正如你所看到的,我做的第一件事是通过步进视频文件读取器来读取我的视频帧。然后我将那个视频帧通过前景检测器,我从前景检测器中获取输出,然后对它执行打开操作。然后通过blob分析系统对象传递干净的照片。基本上它所做的就是列出每一帧中所有连接组件的边界框。
接下来我要做的就是数一数边界框的数目,这告诉我每一帧中有多少移动的物体。我还将使用这些边界框中的信息在每个移动对象周围绘制绿色矩形,以便更好地了解哪些对象在移动。让我们运行这个处理循环,看看我们得到了什么。
还有就是我们的清洁前景的视频。而且有结果,你可以看到我画中的运动物体周围的绿色长方形。而且我实际显示在屏幕上出现的顶部左手边的移动物体的计数。
现在检测移动对象实际上是在分析流量的流量只是第一步。接下来要做的是实际跟踪通过视频这些运动物体的身影,他们要去哪个方向,他们正在移动的速度有多快。我要谈的对象在下一节跟踪多一点点。现在让我告诉你我是如何延长当前的例子,在这里我们简单地检测对象。
现在我所做的是使用卡尔曼滤波器来跟踪被探测到的物体。卡尔曼滤波实际上给了我一个汽车运动方向的预测。我用这些信息来改变汽车周围包围框的颜色。
综上所述,为了分析交通流,我们学习了使用背景差来检测移动像素。然后我们学习了如何使用形态学来清理前景蒙版,以及如何使用连接组件分析来分割这些对象。然后我们还简单地讨论了如何通过对象跟踪扩展这个分析。
现在,我的最后一个例子,我将告诉你如何跟踪一个人从框移动到视频帧。所以我要在这里采取迪马的这部影片。现在迪马是计算机视觉工具箱的开发商之一。我还会来检测他的脸,然后跟踪有他从帧移动到帧这部影片。
这是一个两步的过程。我首先需要检测我试图跟踪的person对象,在本例中是Dima的脸。然后我将使用点跟踪算法来跟踪人从一帧到另一帧的运动。现在,为了在检测Dima的脸下执行对象检测,我将使用一种称为级联对象检测器的东西。
现在,这是基于维奥拉 - 琼斯算法。而且它是人脸检测等五官,像你的鼻子和眼睛特别好。而且中提琴 - 琼斯算法实际检测对象的类别,因此它可以识别图像中的所有面。现在有一两件事我想指出的是这种算法没有做脸部识别。它可以简单地检测人脸,但不能识别特定的阶段。
现在让我们进入MATLAB,看看怎么做。这里我有一个脚本叫facetrack。所以我要从清理我的工作空间开始。然后我将在视频中阅读,创建一个视频播放器来显示我的结果。然后我将读取视频的第一帧并显示它。
这是Dima的脸。然后我要创建一个系统对象,一个级联对象检测系统对象,来实际执行人脸检测。我要一步一步通过这个级联对象检测系统对象,我要在结果周围画一个边界框。我来试试。
正如你所看到的,它在检测迪玛的脸方面做得很好。正如我在幻灯片中提到的,这个级联物体探测器对于探测其他面部特征非常有用。所以让我们看看帮助,看看我还可以检测什么使用级联对象探测器。让我向下滚动,在那里,如果我改变分类模型,我可以检测到不同的特征。所以我能探测到上半身,这听起来很有趣,一对眼睛。我有一个大眼睛对的分类模型。让我看看能不能用它来探测迪玛的眼睛。
哇,你去那里。因此,大家可以看到,级联对象检测器进行检测迪马的眼睛一个很好的工作,这也是尽管事实上,迪马的戴眼镜。因此,让我却步,让我穿上面临着回来。
我想提的真快另一件事是计算机视觉系统工具箱附带了一些预训练对象探测器。但我们也有功能和应用程序,你可以用它来训练自己的探测器。所以,如果你想培养我们的探测器,以探测咖啡杯,我们所提供的框架来帮助你做到这一点。
因此,让我们回到我们的例子,让我再次运行此节。好。为我做的另一接下来的事情就是发现有趣的功能对我来说,跟踪,用我点跟踪算法。现在执行这一功能检测,我将使用一种叫做分钟的本征特性。现在,我用这些分本征特性的原因不是SURF功能,比如我做了我的第一个例子,这是最小的本征特性被称为是用于跟踪特别好。在一些其他的工具,最小本征特性被称为良好的功能来跟踪。
所以我要用特征最小特征检测函数来检测特征。这里有一些有趣的事情。我有一个论点说我只会给它ROI,或者感兴趣的区域。它只检测感兴趣区域内的特征,在这个例子中,是我检测到的物体的边界框,或者是Dima的脸。让我快速地讲一下。在这里你可以看到这些点只在检测Dima的脸的边界框中被检测到。
现在,下一步是初始化一个点跟踪系统对象,这是发生了什么事情来帮助我们跟踪这些组点的逐帧,那则使我们可以通过这个视频跟踪迪马的动作。因此,让我们再次打开帮助正好看到这点跟踪器做什么。你可以看到它跟踪使用卡纳德 - 卢卡斯 - 托马西算法,或KLT点和视频。
对于那些正在深入研究计算机视觉的人来说,你们将会经常看到KLT算法,因为这确实是一种更健壮的点跟踪算法。如果你向下滚动帮助,它实际上告诉你如何构造系统对象,如何用特征点初始化它,以及几乎所有你需要做的来使用系统对象。
我要继续,我要初始化点跟踪系统对象用我刚检测到的点,最小特征点。让我快速地讲一下。在运行它之前,让我们先来看看我们的处理循环。首先我要用视频文件阅读器来读取图像。然后我将通过我的点跟踪系统对象传递那个帧。
当我传递它时,它给我两个变量作为输出。它给我一组点和一组称为有效性的标志,告诉我哪些点是可见的,哪些点是不可见的。所以我将使用有效性标志来删除下一帧中不再可见的点,这样我就只记录了从一帧到另一帧中可见的点。
这是很常见的,当你跟踪点,是,,如果迪玛说他的脸,整个点集的一边脸将不再是可见的,这就是为什么你需要跟踪点停止从帧到帧可见。然后我插入一个绿色的加号,只是为了标记我所跟踪的点,这样我就能更好地感觉到算法是如何工作的。让我运行一下这个过程,看看它是如何工作的。
正如你所看到的,它做跟踪的大多数功能上迪马的脸做得非常好。但有一个问题。就像你可以在这里看到,我们所坚持的是不是真的在迪马的脸上点了几个异常值。现在,过滤这些的时候,我们实际上可以依靠同样的方法,RANSAC,我们在第一个例子用来过滤掉不属于迪马脸上的异常值。因此,我们可以筛选出异常帧与帧。因此,让我告诉你如何这样做了。
为了做到这一点,我有一个单独的脚本叫faceTrackRANSAC。它和之前的脚本是一样的直到这一点,然后我从上一帧和当前帧中取两组点。我用RANSAC来估计点从一个坐标系到另一个坐标系的几何变换。这个的作用是,RANSAc实际上给了我一组inliers,在过滤掉那些不在Dima脸上的异常值之后。我来运行一下。
正如你所看到的,现在它在追踪迪玛的面部方面做得更好了,而且在迪玛面部周围的区域之外没有太多的异常值。这是跟踪的一种方法,但让我给你们看另一个来自计算机视觉系统工具箱的例子它演示了一种完全不同的跟踪方法。
为了做到这一点,我要回到我的文档中心,我要点击计算机视觉系统工具箱,我要去到范例标签。让我向下滚动到所有的跟踪例子,你可以看到有大量的跟踪例子。现在我要点击这个基于多目标跟踪的运动。
现在,这是一个非常,非常酷的例子。其原因,我认为这太酷了它实际上是给你一个框架,你可以用它来追踪移动物体。所以,你可以只取这个例子中,并用它来解决一些相当复杂的问题。现在跟踪算法这样做是因为我在我的最后一个例子后提到的一样,是它使用卡尔曼文件管理器来跟踪对象。
现在卡尔曼滤波器在物体跟踪和计算机视觉方面非常流行。这有很多原因。第一,卡尔曼滤波在实时中工作得很好。第二,卡尔曼滤波器能预测出物体的位置,即使你看不见物体,这在计算机视觉中很有用,因为物体经常会被其他物体遮挡住。
我们打开这个例子,看看它是什么样的。我来运行一下。你可以看到我的背景减法结果在右边,我的跟踪结果在左边。它会在人们进入场景时开始跟踪他们,它会给他们唯一的id,那些是上面的数字。正如你所看到的,当它们消失在视野之外,不再可见,卡尔曼滤波实际上试图预测它们的位置。这是使用卡尔曼滤波器最有趣的特性之一,它能让你继续跟踪,即使在几帧内物体不可见的情况下。
现在,有些人可能在想自己,我已经学会了三种方式的物体检测,为什么不让我刚刚从帧检测对象框架,而不是通过对象跟踪的麻烦了?嗯,有三个主要原因做到这一点。一,对象检测器是不完美的。他们失败不时。二,如果你有一个需要维护对象的帧与帧的标识中的应用程序,对象检测器就不能做到这一点。
三,这是非常关键的,在一般情况下,物体跟踪算法需要比目标检测较少的处理能力。所以,如果你想你的算法部署到移动设备上,你可能想要做的少物体检测和多个对象跟踪。
这是我们用来跟踪一个人的运动的算法的一个快速总结。我们使用级联目标探测器来检测Dima的面部。然后利用最小特征量特征来寻找被检测对象的特征点。我们使用了KLT点跟踪器,它是在vision中实现的。PointTracker系统对象来实际跟踪对象从一帧到另一帧。
总而言之,为什么要用MATLAB来实现计算机视觉呢?对于初学者来说,MATLAB是一个很好的探索和发现环境。但是简单的编程语法使您能够在30行代码中实现相当复杂的系统,面部跟踪示例就是一个很好的例子。然后是我在整个网络研讨会过程中使用的综合文档。还有大量的例子,你可以用它们来学习更多关于计算机视觉的知识,你甚至可以把它们应用到你自己的工作中。
现在,这里为大家介绍一些建议的后续步骤。我强烈建议你尝试从本次网络研讨会的代码。请浏览上显示的链接的更多计算机视觉的例子。而且还检查了这两个研讨会,图像处理变得容易与计算机视觉与MATLAB进行目标检测与跟踪。最后,如果您有任何疑问,请向我们提供您的问题在下面的链接,我们将很乐意回答他们。
我们不会出售或出租您的个人信息。详见我们的隐私政策。
您已经登录到MathWorks帐户。请按“提交”按钮完成整个过程。
您还可以选择从下面的列表中的网站:
选择中国网站(中文或英文),以获得最佳的网站表现。其他MathWorks国家站点没有针对您所在位置的访问进行优化。