Tuesday 15 December 2015

OpenCV for secret agents - head gesture recogntion

本章主要讲解如何判断一个人在点头还是在摇头。人脸识别用的是opencv的cascadeclassifier,在识别成功后用goodFeaturesToTrack检测人脸的特征,然后用calcOpticalFlowPyrLK来追踪这些特征。如果特征点的中心上下移动,就认为是点头。如果是左右移动,就认为是摇头。

在跟踪特征的时候要用到光流,这里有三个附加说明:
1. 我们不区分相机和人脸的运动
2. 特征的颜色和亮度在图像中保持相似
3.相邻的特征有相似的运动

在opencv中,calcOpticalFlowPyrLK函数用了Lucas Kanade方法计算光流。这个方法基于每个特征点周围的$3\times 3$的图像块,然后在相邻图像中寻找能使得残差平方最小的匹配图像块。opencv中还用了图像金字塔来进行多尺度处理,这样就能处理大的或者小的运动。其他的函数,比如calcOpticalFlowSF或者calcOpticalFlowFarneback都是跟踪每一个点,所以calcOpticalFlowPyrLK的计算量更小,处理不同远近的人脸也更加稳定。

goodFeaturesToTrack选取了更容易被跟踪的点,抛弃了不易被跟踪的点,比如反射的阳光,树枝的交叉点,因为这些点会很快变化或者消失。相机的视角变换可以用warping来模拟,这样不同视角下都稳定出现的点就会被选取。good features to track是基于minimum eigenvalue corners和Harris corners的改进。更先进的特征点检测,比如FAST,ORB,SIFT,SURF,FREAK更广泛的选取特征点,计算量也更大,不适合用在基础的光流计算上。尤其是对于头部运动的识别来说,速度更快更重要,并不需要找到很多的特征点。

No comments:

Post a Comment