对象跟踪openCV,问题,建议?

Posted

技术标签:

【中文标题】对象跟踪openCV,问题,建议?【英文标题】:Object tracking openCV, questions, advices? 【发布时间】:2013-03-12 02:08:03 【问题描述】:

简短介绍:增强现实项目

目标:在某人的头上加载 3D 发型模板。

所以我使用 OpenCV 来跟踪人的面部,然后我必须跟踪帽子(我们假设用户有帽子,我们可以决定一个地标或帽子上我们需要检测它的所有东西)的用户。一旦检测到地标,我必须获取地标的坐标,然后将其发送到 3D 引擎以启动/更新 3D 对象。

所以,为了准确检测帽子的地标,我首先测试了几种方法:

cvFindChessBoardCorner ... 在平面上非常有效,但在上限上却没有 (http://dsynflo.blogspot.com/2010/06/simplar-augmented-reality-for-opencv.html)

颜色检测 (http://www.aishack.in/2010/07/tracking-colored-objects-in-opencv/) ... 效率不高。如果亮度改变,颜色就会改变......

我今天来找你是想和你一起考虑。帽子上需要特殊的地标吗? (如果是,是哪一个?如果不是,我该怎么办?) 将颜色检测和形状检测混在一起是不是一个好主意?

....我走对了吗? ^^ 我很感激任何关于使用帽子来瞄准用户头部的建议,以及我必须在 OpenCV 库中使用的不同功能。

对不起,如果我的英语不完美。

非常感谢!

【问题讨论】:

【参考方案1】:

我想到的一种快速方法是结合这两种方法。

使用直方图和均值偏移进行颜色跟踪

这是使用直方图的另一种颜色检测方法: Robust Hand Detection via Computer Vision

这个想法是这样的: 对于已知颜色的上限,比如亮绿色/蓝色(就像您在图像抠图屏幕上看到的那种颜色),您可以仅使用色调和饱和度颜色通道预先计算直方图。我们故意排除亮度通道,使其对光照变化更加稳健。现在,使用直方图,您可以创建一个反投影图,即一个蒙版,在图像中的每个像素处都有一个概率值,表示那里的颜色是帽子颜色的概率。

现在,在获得概率图后,您可以在此概率图(不是图像)上运行 meanshift 或 camshift 算法(在 OpenCV 中可用),并将初始窗口放置在您使用检测到的面部上方的某个位置OpenCV的算法。这个窗口最终会以概率分布的模式结束,即上限。

详细信息在我上面给出的鲁棒手部检测的链接中。有关更多详细信息,您应该考虑获取官方 OpenCV 书籍或从当地图书馆借阅。关于使用 meanshift 和 camshift 跟踪对象有一个非常好的章节。或者,只需使用沿 meashift/camshift 的任何查询搜索网络以进行对象跟踪。

检测正方形/圆形以获取头部方向

如果您还想进一步确认这个最终位置,您可以在帽的正面添加 4 个小方块/圆圈,并使用 OpenCV 的内置算法仅在此感兴趣区域 (ROI) 中检测它们。这有点像检测那些二维码中的方块。此步骤进一步为您提供有关帽子方向以及头部方向的信息,这在您渲染头发时可能很有用。例如。找到 2 个相邻的正方形/圆形后,您可以计算它们与水平/垂直线之间的角度。

您可以使用 OpenCV 中的标准角检测器等检测正方形/角。 对于圆圈,您可以尝试使用 HoughCircle 算法:http://docs.opencv.org/modules/imgproc/doc/feature_detection.html#houghcircles

加快速度

广泛使用感兴趣区域 (ROI)

为了加快速度,您应该尽可能多地在图像的小区域 (ROI)(也是概率图)上运行算法。您可以从 OpenCV 图像中提取 ROI,这些图像本身就是图像,并在它们上运行 OpenCV 的算法,就像在整个图像上运行它们一样。例如,您可以计算检测到的面部周围 ROI 的概率图。同样,meanshift/camshift 算法应该只在这个较小的地图上运行。同样对于检测正方形或圆形的附加步骤。详细信息可以在 OpenCV 书籍以及在线快速搜索中找到。

用 TBB 和 CUDA 编译 OpenCV

许多 OpenCV 的算法可以实现显着的速度提升,而程序员无需做任何额外的工作,只需在 TBB(线程构建块)和 CUDA 支持开启的情况下编译 OpenCV 库即可。特别是,OpenCV (Viola Jones) 中的人脸检测算法运行速度会快几倍。

只有在安装了 TBB 和 CUDA 的软件包后才能打开这些选项。

待定:http://threadingbuildingblocks.org/download

CUDA:https://developer.nvidia.com/cuda-downloads

然后从源代码编译OpenCV:http://docs.opencv.org/doc/tutorials/introduction/windows_install/windows_install.html#windows-installation

最后,我不确定您是否使用的是 OpenCV 的“C 版本”。除非绝对必要(出于兼容性问题等),否则我建议使用 OpenCV 的 C++ 接口,因为它更方便(至少从我个人的经验来看)。现在让我先声明,我不打算在此声明中就 C 与 C++ 的优点展开一场激烈的战争。

希望这会有所帮助。

【讨论】:

以上是关于对象跟踪openCV,问题,建议?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 对象跟踪

OpenCV 对象跟踪

Opencv 对象跟踪和计数在视频帧中通过 ROI 的对象

OpenCV 的 findHomography 产生无意义的结果

OpenCV跟踪轮廓将整个图像跟踪为最大轮廓?

[OpenCV实战]16 使用OpenCV实现多目标跟踪