简介:增强现实项目
目标:在某人的头上加载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库中使用的不同功能。
很抱歉我的英语不完美。
非常感谢!
我想到的一个快速方法是将这两种方法结合起来。
使用直方图和mean shift进行颜色跟踪
这是使用直方图的另一种颜色检测方法:基于计算机视觉的鲁棒手部检测
这个想法是这样的:对于已知颜色的帽子,比如亮绿色/蓝色(就像你在图像抠图屏幕上看到的那种颜色),你可以只使用色调和饱和度颜色通道预先计算直方图。我们故意排除了亮度通道,使其更健壮的照明变化。现在,有了直方图,你可以创建一个反向投影图,即一个蒙版,在图像的每个像素上都有一个概率值,表明那里的颜色与帽子颜色的概率。
现在,在获得概率图之后,你可以在这个概率图(不是图像)上运行meanshift或camshift算法(在OpenCV中可用),初始窗口放置在你使用OpenCV算法检测到的人脸上方的某个地方。这个窗口最终将结束于概率分布的模式,即上限。
细节在我上面给出的鲁棒手检测的链接中。要了解更多细节,您应该考虑获取官方的OpenCV书籍或从当地图书馆借阅。有一个非常好的章节是关于使用meanshift和camshift来跟踪对象的。或者,只需使用沿meashift/camshift的任何查询搜索网络,即可进行对象跟踪。
检测方块/圆圈获取头部方向
如果你想进一步确认这个最终位置,你可以在帽子的前面添加4个小正方形/圆圈,并使用OpenCV的内置算法只在这个感兴趣的区域(ROI)检测它们。这有点像检测QR码中的方块。这一步进一步给你关于帽子的方向的信息,因此,头部,这可能是有用的,当你渲染头发。例如,找到两个相邻的正方形/圆形后,可以计算它们与水平线/垂直线之间的夹角。
您可以使用OpenCV中的标准角检测器等检测正方形/角。对于圆圈,您可以尝试使用HoughCircle算法:http://docs.opencv.org/modules/imgproc/doc/feature_detection.html#houghcircles
加速
广泛使用利益区域
为了加快速度,你应该尽可能多地在图像的小区域(roi)(也就是概率图)上运行你的算法。您可以从OpenCV图像中提取ROI,这些图像本身就是图像,并在它们上运行OpenCV的算法,就像在整个图像上运行它们一样。例如,您可以计算在检测到的人脸周围的ROI的概率图。同样,meanshift/camshift算法应该只在这个较小的地图上运行。同样,对于检测正方形或圆形的附加步骤也是如此。详细信息可以在OpenCV书中找到,也可以在网上快速搜索。
用TBB和CUDA编译OpenCV
许多OpenCV的算法可以实现显著的加速,而程序员无需做任何额外的工作,只需编译带有TBB(线程构建块)和CUDA支持的OpenCV库。特别是,OpenCV (Viola Jones)中的人脸检测算法将运行速度提高几倍。
只有在安装了TBB和CUDA的软件包后才能打开这些选项。
TBB: 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++孰优孰坏的论战。