我想到的一种快速方法是将两种方法结合起来。
使用直方图和均值偏移进行颜色跟踪
这是使用直方图的另一种颜色检测方法:
Robust Hand Detection via Computer Vision
这个想法是这样的:对于已知颜色的上限,比如亮绿色/蓝色(就像您在图像抠图屏幕上看到的那种颜色),您可以仅使用色调和饱和度颜色通道预先计算直方图。我们故意排除亮度通道,使其对光照变化更加稳健。现在,使用直方图,您可以创建一个反投影图,即一个蒙版,在图像中的每个像素处都有一个概率值,表明那里的颜色是帽子颜色的概率。
现在,在获得概率图之后,您可以在此概率图(不是图像)上运行meanshift或camshift算法(在 OpenCV 中可用),将初始窗口放置在您使用 OpenCV 算法检测到的面部上方的某个位置。这个窗口最终会以概率分布的模式结束,即上限。
详细信息在我上面给出的鲁棒手部检测的链接中。有关更多详细信息,您应该考虑获取官方 OpenCV 书籍或从当地图书馆借阅。关于使用 meanshift 和 camshift 跟踪对象有一个非常好的章节。或者,只需使用沿 meashift/camshift 的任何查询搜索 Web 以进行对象跟踪。
检测正方形/圆形以获取头部方向
此外,如果您希望进一步确认这个最终位置,您可以在帽的正面添加 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++ 的优点展开一场激烈的战争。
希望这可以帮助。