预期效果
机器人可以在较为简单的生活环境背景中,实现对单个人体目标的检测和实时跟踪,做出前进、后退、左转和右转等基本操作。
运行环境
- Windows7、 Visual Studio 2013
- EmguCv2.4.9
- 小R科技-51duino WiFi视频智能小车机器人(更换加强版的路由模块)
基本思路
检测:我们要利用智能小车并不优秀的硬件设备来实现对人体目标的检测和实时跟踪,检测部分我们使用人脸来定位人体,虽然这样使得智能小车只能识别并跟踪正面人体,但是由于智能小车视角的原因(视角很低)并且摄像头和路由模块传输速率有限,没办法传输高分辨率的图像,这些外部因素使得我们最终确定使用人脸检测定位人体目标。但是如果硬件允许的话,这个完全可以将人脸替换成人体目标的检测。seetaFace引擎是一个开源项目,它的人脸检测模块较为准确,并且速度很快。
跟踪:跟踪主要是要满足实时跟踪,经过对比粒子滤波、Camshift、KCF算法等的优势和缺点,最终决定选择Camshift算法。Camshift算法基于颜色概率分布图进行选择,所以如果背景颜色和目标颜色很接近的时候会造成一定的干扰。算法的跟踪算法也可以随着目标的大小而变化,这对我们通过智能车摄像头来判断目标物体的运动状态是至关重要的。另外,针对我们的具体需求,对算法进行了优化和改进。
为了减少背景色对目标物体的干扰,我们加入了形态学检测,我们人脸的轮廓长宽比是有一定限制的,在这个比例区间内我们认为跟踪是成功的,一旦跟踪目标的矩形区域长宽比例超过这个阈值,我们先暂时忽略掉这一帧,继续用上一帧更新跟踪窗口。
仅使用Camshift算法:
加上形态学检测:
如果接连几帧都超过了阈值,我们就认为跟踪目标已经丢失,便暂时停止跟踪,重新检测定位目标再进行跟踪。(检测部分使用seetaFace的检测模块,平均检测时间为十几ms)
public ObjectTracking(Image<Bgr, Byte> image, Rectangle ROI)
{
// Initialize parameters