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