在人机交互领域,如果可以比较好的检测指尖,对于交互的丰富度、灵活性来说是有很大提升
的。目前指尖检测的方法也很多,我这里稍微尝试了下简单了两种。这两种方法都借助了手的几何特征,简单但比较粗糙,鲁棒性不够。
方法一:重心距离法
见下图,红色点是手的重心,那么手的边缘的所有点与重心点的距离按顺时针方向或者逆时针方向遍历,就会出现五个峰值,分别是五个手指,这样我们就可以简单找到了。如果你是只伸出一两个手指,那么就只有一两个峰值了。
简单的如下:
1、对图像做高斯模糊;
2、肤色分割(背景不要有类肤色,如果有,就需要加其他信息来排除干扰);
3、找到手轮廓;
4、计算矩,即重心;
5、寻找指尖。
- // 简单的指尖检测
- #include "opencv2/opencv.hpp"
- using namespace cv;
- using namespace std;
- void skinExtract(const Mat &frame, Mat &skinArea);
- int main(int argc, char* argv[])
- {
- Mat frame, skinArea;
- VideoCapture capture;
- capture.open(0);
- if (!capture.isOpened())
- {
- cout<<"No camera!\n"<<endl;
- return -1;
- }
- while (1)
- {
- capture >> frame;
- //Mat frame = imread("fingertips(1).jpg");
- if (frame.empty())
- break;
- skinArea.create(frame.rows, frame.cols, CV_8UC1);
- skinExtract(frame, skinArea);