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