手势识别 订阅
在计算机科学中,手势识别是通过数学算法来识别人类手势的一个议题。手势识别可以来自人的身体各部位的运动,但一般是指脸部和手的运动。用户可以使用简单的手势来控制或与设备交互,让计算机理解人类的行为。其核心技术为手势分割、手势分析以及手势识别。 展开全文
在计算机科学中,手势识别是通过数学算法来识别人类手势的一个议题。手势识别可以来自人的身体各部位的运动,但一般是指脸部和手的运动。用户可以使用简单的手势来控制或与设备交互,让计算机理解人类的行为。其核心技术为手势分割、手势分析以及手势识别。
信息
外文名
Gesture recognition
核心技术
分割、分析、识别
方    法
通过数学算法来识别人类手势
中文名
手势识别
隶    属
计算机科学
手势识别简介
手势识别是计算机科学和语言技术中的一个主题,目的是通过数学算法来识别人类手势。 手势可以源自任何身体运动或状态,但通常源自面部或手。 本领域中的当前焦点包括来自面部和手势识别的情感识别。 用户可以使用简单的手势来控制或与设备交互,而无需接触他们。姿势,步态和人类行为的识别也是手势识别技术的主题。手势识别可以被视为计算机理解人体语言的方式,从而在机器和人之间搭建比原始文本用户界面或甚至GUI(图形用户界面)更丰富的桥梁。 [1]  手势识别使人们能够与机器(HMI)进行通信,并且无需任何机械设备即可自然交互。 使用手势识别的概念,可以将手指指向计算机屏幕,使得光标将相应地移动。 这可能使常规输入设备(如鼠标,键盘甚至触摸屏)变得冗余。
收起全文
精华内容
参与话题
问答
  • 手势识别

    2017-03-03 15:02:20
    手势识别

    手势识别原理
    1.手指触摸屏幕那一刹那 会触发MotionEvent事件
    2.被onTouchListener监听 在onTouch()中获得MotionEvent
    3.GestureDetector(手势识别器) 可以将MotionEvent对象转交给OnGestureListener接口
    4.在OnGestureListener接口中可以获取到MotionEvent事件。
    9.2
    MotionEvent 主要用于封装手势 触摸笔 轨迹球 等动作事件 内部记录横轴和纵轴坐标
    GestureDetetor 用来识别各种手势
    OnGestureListener:手势交互接口
    GestureDetetor(手势识别器)工作原理:
    当接收到用户触摸消息时 将消息给手势识别器进行加工处理 我们只需要监听GestureDetetor处理后手势即可
    GestureDetector.OnDoubleTapListener//处理双击消息
    new GestureDetector.OnDoubleTapListener(){
    //单击确认
    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
    return false;
    }
    //双击
    @Override
    public boolean onDoubleTap(MotionEvent e) {
    return false;
    }
    //双击按下和抬起各一次
    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {
    return false;
    }
    };
    GestureDetector.OnGestureListener//处理单击消息
    9.4 代码 在imageview左右滑动
    //设置onTouchListener()实现ontouch()在onTouch()中进行MotionEvent事件转发
    //捕获触摸屏幕发生的事件
    @Override
    public boolean onTouch(View v, MotionEvent event) {
    gestureDetector.onTouchEvent(event);//转发MotionEvent
    return true;
    }
    //初始化GestureDetector(手势处理器) 需要传入一个
    OnGestureListener接口
    gestureDetector=new GestureDetector(new MyGestor());
    //创建一个类继承自SimpleOnGestureListener(这个类已经继承了处理单击、双击接口)在这个类中进行手势滑动操作
    class MyGestor extends GestureDetector.SimpleOnGestureListener {
    @Override//滑动 e1 开始事件 e2 结束事件 但是这个有些不精确
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    if (e1.getX() - e2.getX() > 50) {
    Toast.makeText(MainActivity.this, “从右往左移动”, Toast.LENGTH_SHORT).show();
    } else if (e2.getX() - e1.getX() > 50) {
    Toast.makeText(MainActivity.this, “从走往右移动”, Toast.LENGTH_SHORT).show();
    }
    return super.onFling(e1, e2, velocityX, velocityY);
    }
    }
    9.5GestureOverlayView(android提供的控件)继承自帧布局
    要将手势库加入到raw文件夹下面 也就是说手势库是固定的  只能比对手势库中存在的手势
    android.gesture.GestureOverlayView在布局中要写全类名否则不显示
    包裹控件情况下控件大小不是控件决定的 而是由GestureOverlayView决定的
    一种用于手势输入的透明覆盖层 也可以覆盖在其他控件上方 也可以包裹控件,有三个监听接口
    GestureOverlayView.OnGestureListener 手势监听器
    GestureOverlayView.OnGesturePerformedListener 手势执行监听器
    GestureOverlayView.OnGesturingListener 手势执行中监听器
    //找到手势文件
    //找到手势文件中所有手势
    //匹配识别
    final GestureLibrary gestureLibrary = GestureLibraries.fromRawResource(MainActivity.this, R.raw.gestures);
    gestureLibrary.load();
    gestureDetector.addOnGesturePerformedListener(new GestureOverlayView.OnGesturePerformedListener() {
    @Override
    public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
    //读取手势库中手势
    ArrayList recognize = gestureLibrary.recognize(gesture);//所有手势
    Prediction prediction = recognize.get(0);
    if (prediction.score >= 5.0) {//手势相似度
    if (prediction.name.equals(“12345”)) {

                        Toast.makeText(MainActivity.this, "没有该手势fdsfds", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    Toast.makeText(MainActivity.this, "没有该手势", Toast.LENGTH_SHORT).show();
                }
            }
        });
    
    展开全文
  • android手势识别两个对勾手势 OnGestureListener手势识别 可用于加载手势库
  • python实现手势识别

    万次阅读 多人点赞 2020-04-14 20:39:59
    python实现手势识别(入门) 使用open-cv实现简单的手势识别 1.获取视频(摄像头) 2.肤色检测 3.轮廓提取 最终实现结果

    python实现手势识别(入门)

    使用open-cv实现简单的手势识别。刚刚接触python不久,看到了很多有意思的项目,尤其时关于计算机视觉的。网上搜到了一些关于手势处理的实验,我在这儿简单的实现一下(PS:和那些大佬比起来真的是差远了,毕竟刚接触不久),主要运用的知识就是opencv,python基本语法,图像处理基础知识。

    最终实现结果:
    在这里插入图片描述

    获取视频(摄像头)

    这部分没啥说的,就是获取摄像头。
    `

    cap = cv2.VideoCapture("C:/Users/lenovo/Videos/1.mp4")#读取文件
    #cap = cv2.VideoCapture(0)#读取摄像头
    while(True):
        ret, frame = cap.read()    key = cv2.waitKey(50) & 0xFF
        if key == ord('q'):
        	break
    cap.release()
    cv2.destroyAllWindows()
    
    

    肤色检测

    这里使用的是椭圆肤色检测模型
    在RGB空间里人脸的肤色受亮度影响相当大,所以肤色点很难从非肤色点中分离出来,也就是说在此空间经过处理后,肤色点是离散的点,中间嵌有很多非肤色,这为肤色区域标定(人脸标定、眼睛等)带来了难题。如果把RGB转为YCrCb空间的话,可以忽略Y(亮度)的影响,因为该空间受亮度影响很小,肤色会产生很好的类聚。这样就把三维的空间将为二维的CrCb,肤色点会形成一定得形状,如:人脸的话会看到一个人脸的区域,手臂的话会看到一条手臂的形态。

    def A(img):
    
        YCrCb = cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB) #转换至YCrCb空间
        (y,cr,cb) = cv2.split(YCrCb) #拆分出Y,Cr,Cb值
        cr1 = cv2.GaussianBlur(cr, (5,5), 0)
        _, skin = cv2.threshold(cr1, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) #Ostu处理
        res = cv2.bitwise_and(img,img, mask = skin)
        return res
    

    轮廓处理

    轮廓处理的话主要用到两个函数,cv2.findContours和cv2.drawContours,这两个函数的使用使用方法很容易搜到就不说了,这部分主要的问题是提取到的轮廓有很多个,但是我们只需要手的轮廓,所以我们要用sorted函数找到最大的轮廓。

    def B(img):
    
        #binaryimg = cv2.Canny(Laplacian, 50, 200) #二值化,canny检测
        h = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE) #寻找轮廓
        contour = h[0]
        contour = sorted(contour, key = cv2.contourArea, reverse=True)#已轮廓区域面积进行排序
        #contourmax = contour[0][:, 0, :]#保留区域面积最大的轮廓点坐标
        bg = np.ones(dst.shape, np.uint8) *255#创建白色幕布
        ret = cv2.drawContours(bg,contour[0],-1,(0,0,0),3) #绘制黑色轮廓
        return ret
    

    全部代码

    """ 从视频读取帧保存为图片"""
    import cv2
    import numpy as np
    cap = cv2.VideoCapture("C:/Users/lenovo/Videos/1.mp4")#读取文件
    #cap = cv2.VideoCapture(0)#读取摄像头
    
    #皮肤检测
    def A(img):
    
        YCrCb = cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB) #转换至YCrCb空间
        (y,cr,cb) = cv2.split(YCrCb) #拆分出Y,Cr,Cb值
        cr1 = cv2.GaussianBlur(cr, (5,5), 0)
        _, skin = cv2.threshold(cr1, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) #Ostu处理
        res = cv2.bitwise_and(img,img, mask = skin)
        return res
    
    def B(img):
    
        #binaryimg = cv2.Canny(Laplacian, 50, 200) #二值化,canny检测
        h = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE) #寻找轮廓
        contour = h[0]
        contour = sorted(contour, key = cv2.contourArea, reverse=True)#已轮廓区域面积进行排序
        #contourmax = contour[0][:, 0, :]#保留区域面积最大的轮廓点坐标
        bg = np.ones(dst.shape, np.uint8) *255#创建白色幕布
        ret = cv2.drawContours(bg,contour[0],-1,(0,0,0),3) #绘制黑色轮廓
        return ret
    
    
    while(True):
    
        ret, frame = cap.read()
        #下面三行可以根据自己的电脑进行调节
        src = cv2.resize(frame,(400,350), interpolation=cv2.INTER_CUBIC)#窗口大小
        cv2.rectangle(src, (90, 60), (300, 300 ), (0, 255, 0))#框出截取位置
        roi = src[60:300 , 90:300]  # 获取手势框图
    
        res = A(roi)  # 进行肤色检测
        cv2.imshow("0",roi)
    
        gray = cv2.cvtColor(res, cv2.COLOR_BGR2GRAY)
        dst = cv2.Laplacian(gray, cv2.CV_16S, ksize = 3)
        Laplacian = cv2.convertScaleAbs(dst)
    
        contour = B(Laplacian)#轮廓处理
        cv2.imshow("2",contour)
    
        key = cv2.waitKey(50) & 0xFF
        if key == ord('q'):
                break
    cap.release()
    cv2.destroyAllWindows()

    注意:最后送大家一套2020最新企业Pyhon项目实战视频教程,点击此处 进来获取 跟着练习下,希望大家一起进步哦!

    毕竟刚学不久,做出这个东西自己已经很满足了,当然和那些大佬也是没法比的,没有什么东西是速成的,只能一步一个脚印的走。

    展开全文
  • 手势识别demo

    2017-06-26 21:49:56
    手势识别

空空如也

1 2 3 4 5 ... 20
收藏数 5,969
精华内容 2,387
关键字:

手势识别