#基于VR环境下的手指识别键盘输入# 利用摄像头完成简单的手指识别的方法

因为我们在进行虚拟键盘的设定的时候,需要利用摄像头对手指进行拍摄,确定手指当前的位置,然后进行键盘输入内容的估计,所以采用了以下方法:方法一:重心距离法        见下图,红色点是手的重心,那么手的边缘的所有点与重心点的距离按顺时针方向或者逆时针方向遍历,就会出现五个峰值,分别是五个手指,这样我们就可以简单找到了。如果你是只伸出一两个手指,那么就只有一两个峰值了。简单的代码如下:1、对图像做高...
摘要由CSDN通过智能技术生成

因为我们在进行虚拟键盘的设定的时候,需要利用摄像头对手指进行拍摄,确定手指当前的位置,然后进行键盘输入内容的估计,所以采用了以下方法:

方法一:重心距离法


        见下图,红色点是手的重心,那么手的边缘的所有点与重心点的距离按顺时针方向或者逆时针方向遍历,就会出现五个峰值,分别是五个手指,这样我们就可以简单找到了。如果你是只伸出一两个手指,那么就只有一两个峰值了。








简单的代码如下:


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);    
        Mat show_img;    
        frame.copyTo(show_img, skinArea);    
    
        vector<vector<Point> > contours;    
        vector<Vec4i> hierarchy;    
    
        //寻找轮廓    
        findContours(skinArea, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);    
    
        // 找到最大的轮廓    
        int index;    
        double area, maxArea(0);    
        for (int i=0; i < contours.size(); i++)    
        {    
            area = contourArea(Mat(contours[i]));    
            if (area > maxArea)    
            {    
                maxArea = area;    
                index = i;    
            }               
        }    
    
        //drawContours(frame, contours, index, Scalar(0, 0, 255), 2, 8, hierarchy );    
           
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值