蔡志兆,吕建勋
北京航空航天大学自动化科学与电气工程学院,北京100191
运动检测技术是计算机视觉领域重要的技术之一,在自动导航、智能车辆等方面都有很好的应用[1]。随着软硬件技术,特别是各类图像传感器技术的发展,进一步促进了物体的运动检测技术的研究。Liu等[2]利用Kinect获取人体深度信息,利用深度信息计算人体的位置信息,实现ATM机前的人体异常检测,包括脸部遮挡、偷窥他人信息、长时间逗留等。Parra-Dominguez等[3]利用Kinect获取人的行为信息,使用监督学习进行训练,能够检测人体上楼跌倒的异常行为。与传统的仅使用彩色信息的方法相比,运动检测加上深度信息很大程度上提升了检测的准确率。
本文建立了基于Kinect的运动检测平台,检测物体的运动信息。为了提高运动检测的准确性,加入深度信息进行边界判断。基于物体边界信息计算单应性矩阵,从而进行物体的运动检测。本文首先介绍了基于Kinect的运动检测平台的搭建,对各个功能模块进行了叙述;然后提出了基于单应性矩阵的物体运动检测算法;最后基于Kinect采集的图像数据进行检测算法的验证。
本实验平台采用Kinect2进行图像数据的采集,Kinect2通过红外线脉冲反射回来的时间来获得深度信息(物体到传感器的距离)。Kinect2性能较Kinect1有很大提升,且图像分辨率有所提高,有更好的视觉效果,检测范围也更广。Kinect2外观图如图1所示。
图1 Kinect2外观
1.1.1 图像数据获取
获取Kinect2数据源的流程如下:Sensor->Reader->Frame->Data。
Kinect数据模式有以下几种:
1)Source。Kinect上的各个传感器,给了每个传感器源的入口。
2)Reader。有了Reader就可以访问各个传感器上的数据帧,一个传感器源上可有多个Reader。
3)Frame References。帧引用,通过它访问帧本身,可以用AcquireFrame获取此引用所持有的帧。
4)Frame。帧本身,有了Frame就可以访问实际数据并进行处理,即可以得到数据。
1.1.2 图像数据
对Kinect2采集的各种图像格式进行分析。
1)彩色图像:Kinect2采集的彩色图像分辨率是1920×1080,采样率为30f/s[4],采集到的图像有多种格式,如Rgba、Yuv等,本文采用RGB格式;
2)深度图像:Kinect2采集到的深度图是单通道的,每个通道存储16bit的深度值,以mm为单位,在程序编写时需要注意单位转换。测量的深度值范围在0.5~4.5m。
由于本文需要对大量的图像数据进行实时采集和处理,如果只是调用相应的函数对数据进行保存和记录,会增加图像读取线程的负担;同时如果想要记录时间、传感器的数据等,需要调用多个函数来实现,既繁琐又耗时。ROS提供了一系列的库和工具,可以有效帮助开发人员实现这些功能。
1.2.1 ROS系统介绍
ROS安装是在Ubuntu操作系统上进行的,Ubuntu是Linux系统的一个变形,通过终端命令进行操作,同时具有图形化的操作工具。
ROS提供了消息的传输和软件包管理等许多功能,它遵循BSD开源许可协议。ROS被称为一个进程管理的操作系统,每个进程在ROS上都是一个节点,它通过发布节点进行通信。我们可以根据节点看到进程之间的通信[5]。
1.2.2 ROS驱动流程
本检测平台使用ROS驱动Kinect进行图像数据的采集和保存。流程如下:
1)roscore运行一个节点管理器master;
2)roslaunch将多个rosnode结合起来,一起运行,其文件是使用XML语言来描述节点以及相关参数的设置和软件的启动的,通过roslaunch运行Kinect2_bridge.launch,运行多个节点;
3)rosrun运行节点执行viewer.cpp程序,驱动相机进行图像数据采集,通过修改viewer.cpp程序,添加控制命令,以一定的采样率控制图像采集的开始和停止。
ROS驱动Kinect采集的示意图如图2所示。
图2 彩色−深度图像
本文的研究内容涉及到对图像数据进行预处理和可视化等。这部分内容主要是基于OpenCV开源库进行的。下面对OpenCV的环境搭建做介绍。
1)OpenCV介绍
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Mac OS等操作系统上,实现了图像处理和计算机视觉方面的很多通用算法[6]。目前很多新的开发和算法都是用C++接口,本平台采用C++编程语言来实验运动检测算法。
2)OpenCV安装
1.2节介绍了ROS驱动相机进行图像数据采集的相关内容。在Ubuntu基础上安装了ROS,OpenCV也是基于Ubuntu进行安装。在使用cmake编译程序形成可执行文件时,首先需要编写CMakeLists文件定义相关的包和头文件路径等。由于ROS的安装带有OpenCV3的相关模块,若需要使用OpenCV2相关功能的模块,且CMakeLists文件不指定寻找的OpenCV的包的版本,则默认寻找OpenCV3。由于OpenCV2和OpenCV3的版本差异,有些模块做了修改,所以需要根据实际要求在CMakeLists里用FIND_PACKAGE()指定OpenCV版本。
对于物体的运动检测,主要分为边界检测、特征点检测、单应性矩阵计算、运动检测4个部分。本章旨在讨论运动检测的关键技术,基于已有的算法进行改进,讨论算法的有效性和可靠性。
边界是图像的一个重要的特征,对图像的处理经常需要用到边界信息。在光流场的计算中,对边界检测的准确性直接决定了运动信息检测的精度。
2.1.1 Canny边界检测
Canny是目前使用最多的边界检测算子,相比较其他边界检测算子,适用于更多的场景,是目前最优的边界检测算法,Canny边界检测可以分为以下几个部分[7]:
1)高斯去噪:一般的原始图像都会含有很大的噪声,所以在图像处理之前需要进行去噪处理,特别是边界检测,在含有噪声的原图上进行边界检测效果都不会很好。Canny算子加入了高斯核对原图进行卷积,去除单个像素点噪声的影响。
2)非极大值抑制:Canny算子的非极大值抑制原理是搜索像素点P(i,j)梯度方向上8领域内最大梯度幅值点,保留最大幅值像素点,抑制掉非极大值点。
3)滞后阈值:滞后阈值需要2个阈值,一个高阈值,一个低阈值。Canny算子使用2个阈值分别来控制边界的选择和连通性。
2.1.2 基于深度信息的边界检测
Canny边界检测算法能够很好地检测到物体的边界,如图3所示。检测结果表明,其不仅能够检测到目标物体的边界信息,对于背景的边界信息也能检测出来。
图3 Canny边界检测效果
在实际的运动检测中,我们所需要关注的对象是目标物体,对于背景的边界并不关心。基于此,在Canny边界检测算法的基础上,加上深度信息进行边界判断。如果该边界与目标物体不在同一深度位置则表明此边界不是目标物体上的边界。检测结果如图4所示,加上深度信息进行判断,去除了多余的边界信息,简化了边界,提取目标物体整体轮廓。
图4 基于深度信息的边界检测效果
运动检测的第二步即为特征点检测,图像特征点能够反映图像本质特征,能够标识图像中目标物体。图像特征点在基于特征点的图像匹配算法中有着十分重要的作用。同时特征点检测的结果决定了单应性矩阵的计算优劣。
2.2.1 Harris特征点检测
角点是图像的一大特征点,其表现为轮廓之间的交点,该点附近的像素点无论在梯度幅值还是梯度方向上都有着较大变化。角点对于小孔径的视野,具有很稳定的特性。
Harris角点检测[8]的原理是使用一个滑动窗口,沿着不同方向对像素值进行卷积,比较窗口滑动前与滑动后窗口内像素值的变化,若不论哪个方向都有着很大的灰度值变化,则此点定义为角点。
检测效果如图5、6所示,由图5和图6可知,Harris角点检测具有比较好的特征点检测的效果,但此算法针对的是整个场景,检测出来的目标物体以外的特征点需要去除。
图5 物体1特征点检测效果
图6 物体2特征点检测效果
2.2.2 基于边界信息的特征点检测
基于之前的内容,已经研究了目标物体的边界检测。本文研究的目的是检测物体的运动信息,对于目标物体以外的特征点我们并不关心。为了去除边界外的特征点,利用目标物体的边界信息进行特征点提取,判断各特征点与边界的关系:在边界内、在边界上、在边界外。提取边界内和边界上的特征点进行下面的特征点匹配和单应性矩阵的计算。
去除目标物体边界外的特征点的检测结果如图7、8所示,由图7、8可以知道,加上目标物体的边界信息能够很好地去除边界外的特征点,留下目标物体内的有效特征点,特征点具有一定分散性,能够一定程度上代表目标物体。
图7 物体1基于边界的特征点检测效果
图8 物体2基于边界的特征点检测效果
在计算机视觉中,平面的单应性被定义为一个平面到另外一个平面的投影映射。对于特征点匹配和计算单应性矩阵算法的设计,采用LK[9]光流法进行运动物体匹配点计算,基于匹配点进行单应性矩阵的计算,有2种方法可进行单应性矩阵的计算。
2.3.1 基于图像的单应性矩阵计算
针对全部场景(整幅图像)进行单应性矩阵的计算,设定阈值,去除误差值超过阈值的特征点。如图9所示,浅色和深色圆点代表被检测到的特征点,其中浅色的特征点为第一帧图片的特征点,深色的特征点为第二帧图像的特征点。通过融合前后2帧图像,将前后2帧图像的特征点融合在一起,图片中的箭头显示第1帧和第2帧对应匹配特征点的运动方向。
图9 基于图像的特征点集匹配
基于图像的单应性矩阵计算流程如下:
1)Harris算法检测第一帧图片特征点集points1;
2)LK算法计算第1帧图片到第2帧图片的匹配点集points2;
3)LK算法计算points2在第1帧图片的匹配点集points3;
4)计算每对匹配点的距离值d[i]=|point3[i]−points1[i]|,设定阈值Tth,如果d[i]>Tth,则舍弃第i个特征点points1[i];如果d[i] 5)计算最优特征点集points4在第2帧图片的匹配点集points5; 6)利用最优匹配点集points4和points5计算第1帧图像和第2帧图像之间的单应性矩阵。 2.3.2 基于目标物体的单应性矩阵计算 为了提高精确度,需要剔除目标物体以外的特征点,进行单应性矩阵的计算。如图10所示,与图9相似,浅色与深色的特征点分别代表第1帧和第2帧的特征点,箭头代表运动方向,去除了目标物体以外的匹配点。 图10 基于目标物体的特征点集匹配 基于目标物体的单应性矩阵计算流程如下: 1)Harris算法检测第一帧图片特征点集points1; 2)基于边界检测去除目标物体以外的特征点,保留目标物体上的特征点集point2; 3)与基于图像的单应性矩阵计算流程步骤2)~6)类似。 由于图像除目标物体外会有其他的背景,对于其他材质和形状的物体单应性矩阵的计算可能会不同。相比较基于整幅图像的单应性矩阵的计算,基于目标物体的单应性矩阵计算加入了边界信息,去除了边界外的特征点,对满足阈值内的特征点进行保留,计算第1帧和第2帧图像之间的单应性矩阵。此方法准确性更高。 二维图像的运动可以表现为像素点的运动,像素点的运动形成光流场,通过估计光流场即可得到物体的运动信息,进而对物体进行运动检测。本课题的研究对象是刚体,而刚体没有形变,对小运动的相邻帧图片,可以用光流场代表其运动场。 前文已经讨论了物体的边界检测和特征点检测,计算了相邻帧图像之间的单应性矩阵,为了对物体进行运动检测,还需要进行光流估计。 设计算的单应性矩阵为H,检测的第1帧特征点集为C1,估计的第2帧图像对应的匹配点集为C2,则有: 设p1(x1,y1)为第1帧图像上检测到的特征点,p2(x2,y2)为由式(1)计算出来的匹配点,设2点运动为(∆u, ∆v),有 ∆u=x2−x1, ∆v=y2−y1,要计算光流场即计算第1帧图像每一帧检测出的特征点与对应第2帧匹配点的差值[10]。整体光流计算公式为: 3.1.1 稀疏光流结果可视化 稀疏光流计算即提取目标物体的特征点进行光流场计算,可视化结果如图11、12所示。目标物体均往图像左边运动,运动检测结果显示箭头指向左边,箭头越长代表运动速度越快,能够通过稀疏光流可视化结果大概推断出物体的运动信息,与实际运动状态相符。 图11 物体1稀疏光流可视化结果 图12 物体2稀疏光流可视化结果图2 3.1.2 稀疏光流结果验证 由于检测数据太多,选取前8个特征点进行验证,表1的数据由原始数据精确到小数点后4位得到。像素点平均误差用欧氏距离进行计算,如上所示:LK检测的像素点平均误差 εx,y=0.3805,大于基于单应性矩阵计算的匹配点平均误差 εx,y=0.0589。由于基于单应性矩阵方法匹配效果好,所以本实验的运动检测基于单应性矩阵方法进行,具有较好的准确性。 表1 匹配点检测结果 如表2所示,运动检测平台每2帧运动检测的运行时间都在0.1s左右。本检测平台针对室内运动物体,运动速度较低,选取图像帧间隔为0.5s,运动检测算法可以满足平台需要。 表2 检测平台运行时间 s 相比较于稀疏光流,密集光流需要把目标物体每个像素点的光流计算出来[11],以更好地表示物体的运动状态。为了更好地把运动检测结果显示出来,基于色环进行密集光流的可视化[12]。在编程过程中设定共有55个颜色表示不同的方向,每个色系颜色的深浅又代表物体在该方向上运动速度的大小。通过计算物体运动的最大速度,进行速度归一化。色环图如图13所示。 图13 色环 Farneback是一种常用的经典密集光流检测算法,利用Farneback算法获得的密集光流检测结果如图14、15所示。由图14可以看出,可视化结果为蓝色但颜色深浅不一,对比图13可知,蓝色代表物体往左边运动,该可视化结果可以大致代表物体的真实运动。而对于图15,可视化结果主要为黄色且颜色不单一,相比较实际物体向左的运动,对比图13可知,该结果并不能代表物体的真实运动。 图14 物体1Farneback方法可视化结果 图15 物体2Farneback方法可视化结果 运用基于改进的单应性矩阵方法进行物体运动信息检测,检测结果如图16、17所示。实际运动过程中物体均往左运动,可视化结果显示为蓝色,所代表的物体运动方向与实际一致。实验结果验证了运动检测平台的有效性。 图16 物体1改进的单应性矩阵计算方法可视化结果 图17 物体2改进的单应性矩阵计算方法可视化结果 本文设计了基于Kinect的运动检测平台,经运动结果可视化显示和数据验证,本检测平台提高了运动检测的精度,符合实际物体运动情况。 1)本文在彩色图像的基础上,加上深度信息进行边界判断,基于感兴趣区域进行单应性矩阵的计算,提高了算法的精度。 2)在Ubuntu系统下开发基于Kinect的运动检测平台,搭建ROS和OpenCV库,实现了物体的图像数据采集。 3)基于Kinect的运动检测平台可视化结果对比情况表明,该检测平台有较好的准确性,可提升运动检测的精度,能够很好地表示物体的运动信息。2.4 光流估计
3 运动检测平台实验验证
3.1 稀疏光流法结果验证
3.2 密集光流法结果验证
4 结论