目录
1.测速/测距应用介绍
2.光流算法
1.测速/测距应用介绍
单纯的光流可以测速和追踪object。但这些都是在像素域的。即可以得到速度为移动了x个pixel/s,追踪轨迹也是视频上的轨迹。
两种已经比较成熟的视觉感知系统:光流测速模块和视觉里程计。
光流测速模块顾名思义,只能测速度。通常一个光流测速模块由一个相机、一个惯性测量元件、一个超声波模块构成,它的主要原理是计算机视觉技术中于1981年被发展出来的“光流追踪”算法。
“光流”的概念最早在1950年代由心理学家和生物学家提出,指的是一个观察者和他在观察的事物发生相对运动时,这些事物在他眼前成的像会产生“运动的模式”,人脑利用这种“运动的模式”能够更灵敏地感知周围什么东西在动。比如下图中,读者一看就可以直观理解“光流”的意义。后来计算机科学家布鲁斯-卢卡斯和金出武雄在1981年发明了Lucas-Kanade算法,通过算法计算出连续拍摄的图片上的光流,并证明了光流可以反解出相对运动的速度。虽然三十多年来,Lucas-Kanade算法始终被公认为最好的“光流追踪”算法,但是它有比较大的局限性,它包含很多假设,比如假设连续图片的平均亮度相同,比如假设图片中的物体只发生平面运动等等。另外,光流算法算出的速度是没有尺度的,因为相机图像的单位是像素,所以光流算法只能给出“你现在的速度是10个像素每秒”,但是没法算出10个像素是1厘米还是1米。恢复尺度的方式是增加一个超声波模块测量平面运动离相机的距离,这样就能够把像素运动转换成真实的运动。最后,如果要让光流测速模块在晃来晃去的多旋翼飞行器上也能使用,通过惯性测量元件找出图像所代表的平面也是必不可少的,这一点需要在算法上进行两种传感器很好的配合。
光流测速模块测出的三维速度积分获得三维位置,但是就像惯性测量元件积分会发散一样,光流测速模块积分得到的位置也会发散。好在它不会天马行空地失去控制,和组合导航技术中除了GPS之外的传感器妥善融合之后,它可以做到悬停时测量的位置不发散。因此可以说光流测速模块只在有限的条件下能够替代GPS。
光流测速模块已经形成了非常标准的解决方案。大疆悟以及精灵3上都装载了自主研发的光流测速模块,另外著名的开源飞控产品Pixhawk中包含了一个叫做PX4Flow的光流测速模块,并且开源了所有的代码和硬件方案。所以光流测速模块目前已经广泛出现在了各大厂商的多旋翼飞行器产品上。视觉里程计相比光流测速模块,增加了直接测量位置的能力,所以才叫“里程计”。视觉里程计比光流测速模块能力更强,性能更好。
前面已经说到光流追踪算法有很多简化的假设,只能测量平面运动,增加其他传感器硬件一定程度上是为了把那些为了计算方便而简化掉的因素重新弥补起来。
有些视觉里程计的算法甚至包含完整的光流追踪的算法,但是仅仅把计算光流作为预处理图像的步骤。
视觉里程计能够直接测量位置,测量值也比较准确,不会像光流测速模块那样发散。通常比较优秀的视觉里程计飞100米之后只会积累十几厘米到几十厘米的误差,这个测量水平比起导弹上几百万的惯性测量元件还是差了不少,但是考虑到视觉里程计的价格极其低廉,对比起来它的性价比非常高。
两个相机构成的双目立体视觉系统加惯性测量元件,最难的是一个相机构成的单目视觉系统加惯性测量元件。如果视觉里程计和光流测速模块硬件一致,那么这里的视觉里程计采用的是单目视觉系统。目前,双目立体视觉系统加惯性测量元件实现自身状态观测已经是比较完善的技术,而单目视觉系统则是活跃的研究方向,世界上做这个研究方向较好的大学有美国的宾西法尼亚大学、瑞士的苏黎世联邦理工学院、英国的牛津大学、我国的香港科技大学和其他一些欧美院校。
2.光流算法
光流算法是怎样的?为何要结合pyrmid?
为什么要用金字塔?因为LK算法的约束条件即:小速度,亮度不变以及区域一致性都是较强的假设,并不很容易得到满足。如当物体运动速度较快时,假设不成立,那么后续的假设就会有较大的偏差,使得最终求出的光流值有较大的误差。构建图像金字塔可以解决大运动目标跟踪,也可以一定程度上解决孔径问题(相同大小的窗口能覆盖大尺度图片上尽量多的角点,而这些角点无法在原始图片上被覆盖)。
考虑物体的运动速度较大时,算法会出现较大的误差。那么就希望能减少图像中物体的运动速度。一个直观的方法就是,缩小图像的尺寸。假设当图像为400×400时,物体速度为[16 16],那么图像缩小为200×200时,速度变为[8,8]。缩小为100*100时,速度减少到[4,4]。所以光流可以通过生成 原图像的金字塔图像,逐层求解,不断精确来求得。简单来说上层金字塔(低分辨率)中的一个像素可以代表下层的两个。