精华内容
下载资源
问答
  • openCV手势识别

    2019-03-18 15:07:26
    实现1-5手势的图片识别,采用最基础的模板匹配方法。需要的自己取
  • opencv 手势识别实例

    2018-07-15 08:37:05
    opencv手势识别实例。c++ 11。支持摄像头和图片两种方式。
  • 基于Python的OpenCV手势识别程序代码+文档+演示视频,利用图像数据处理,用Python编写的手势识别小游戏
  • opencv手势识别

    2017-07-17 22:38:26
    包含手势识别(拳头)的python代码和cpp代码以及最重要的训练好的xml文件
  • opencv 手势识别

    2014-01-14 12:09:21
    opencv 手势识别 可以在 ubantu 下面直接运行
  • OpenCV手势识别

    2020-11-24 07:30:00
    本文会在OpenCV中使用dnn模块调用OpenPose工程中的手部关键点检测(hand pose estimation)模型来实现对手势识别。 基础环境 ubuntu安装nvidia显卡驱动的2种方法 ubuntu安装CUDA和cuDNN opencv使能CUDA openpose姿态...

    软硬兼环境

    • ubuntu 18.04 64bit

    • anaconda with python 3.7

    • nivdia gtx 1070Ti

    • opencv 4.2.0

    前言

    本文中使用的算法模型是CMU Perceptual Computing Lab开源的集合人体、人脸、手部关键点检测的开源库OpenPose,这个项目前文已经介绍过了。本文会在OpenCV中使用dnn模块调用OpenPose工程中的手部关键点检测(hand pose estimation)模型来实现对手势的识别。

    基础环境

    • ubuntu安装nvidia显卡驱动的2种方法

    • ubuntu安装CUDA和cuDNN

    • opencv使能CUDA

    • openpose姿态识别

    示例代码

    import cv2
    import time
    import numpy as np
    
    
    protoFile = "pose_deploy.prototxt"
    weightsFile = "pose_iter_102000.caffemodel"
    nPoints = 22
    POSE_PAIRS = [ [0,1],[1,2],[2,3],[3,4],[0,5],[5,6],[6,7],[7,8],[0,9],[9,10],[10,11],[11,12],[0,13],[13,14],[14,15],[15,16],[0,17],[17,18],[18,19],[19,20] ]
    
    threshold = 0.2
    
    # 读取内置摄像头或者usb摄像头
    cap = cv2.VideoCapture(0)
    hasFrame, frame = cap.read()
    
    frameWidth = frame.shape[1]
    frameHeight = frame.shape[0]
    
    aspect_ratio = frameWidth/frameHeight
    
    inHeight = 368
    inWidth = int(((aspect_ratio*inHeight)*8)//8)
    
    # 处理结果保存成视频
    vid_writer = cv2.VideoWriter('output.avi',cv2.VideoWriter_fourcc('M','J','P','G'), 15, (frame.shape[1],frame.shape[0]))
    
    # 加载模型权重
    net = cv2.dnn.readNetFromCaffe(protoFile, weightsFile)
    k = 0
    while True:
        k+=1
        t = time.time()
        # 读取每一帧的数据
        hasFrame, frame = cap.read()
        frameCopy = np.copy(frame)
        if not hasFrame:
            cv2.waitKey()
            break
        
        # blobFromImage将图像转为blob
        inpBlob = cv2.dnn.blobFromImage(frame, 1.0 / 255, (inWidth, inHeight),
                                  (0, 0, 0), swapRB=False, crop=False)
    
        net.setInput(inpBlob)
    
        # forward实现网络推断
        # 模型可生成22个关键点,其中21个点是人手部的,第22个点代表着背景
        output = net.forward()
    
        print("forward = {}".format(time.time() - t))
    
        # Empty list to store the detected keypoints
        points = []
    
        for i in range(nPoints):
            probMap = output[0, i, :, :]
            probMap = cv2.resize(probMap, (frameWidth, frameHeight))
    
            # 找到精确位置
            minVal, prob, minLoc, point = cv2.minMaxLoc(probMap)
    
            if prob > threshold :
                cv2.circle(frameCopy, (int(point[0]), int(point[1])), 6, (0, 255, 255), thickness=-1, lineType=cv2.FILLED)
                cv2.putText(frameCopy, "{}".format(i), (int(point[0]), int(point[1])), cv2.FONT_HERSHEY_SIMPLEX, .8, (0, 0, 255), 2, lineType=cv2.LINE_AA)
    
                points.append((int(point[0]), int(point[1])))
            else :
                points.append(None)
    
        # 画出关键点
        for pair in POSE_PAIRS:
            partA = pair[0]
            partB = pair[1]
    
            if points[partA] and points[partB]:
                cv2.line(frame, points[partA], points[partB], (0, 255, 255), 2, lineType=cv2.LINE_AA)
                cv2.circle(frame, points[partA], 5, (0, 0, 255), thickness=-1, lineType=cv2.FILLED)
                cv2.circle(frame, points[partB], 5, (0, 0, 255), thickness=-1, lineType=cv2.FILLED)
    
        print("Time Taken for frame = {}".format(time.time() - t))
    
        cv2.imshow('webcam', frame)
        # 监听键盘事件
        key = cv2.waitKey(1)
        if key == 27:
            break
    
        print("total = {}".format(time.time() - t))
    
        vid_writer.write(frame)
    
    vid_writer.release()
    

    运行上述代码,使用本地usb摄像头进行手势检测

    opencv_hand

    opencv_hand

    模型下载

    百度网盘链接:https://pan.baidu.com/s/17QGpualKBdtl4uvbYzIWLg ,提取码:3ljn

    展开全文
  • 基于 Opencv手势识别系统分析 指导老师:鲁晓军 作者:毛晓洁 日期:2013.10.18 基于 Opencv手势识别系统分析 系统研究背景 手势识别流程分析 系统总体结构 系统的设计与实现 总结 1.系统研究背景及应用 人机交互在...
  • 通过手势识别控制虚拟键盘响应控制电脑游戏
  • 使用OpenCV 手势识别

    2018-08-23 09:30:30
    1.先采集摄像头视频, 对每一帧图像进行处理。(这部分在主函数里面) 2.然后对每一帧图像进行 hsv 颜色空间变换, 这个模型中颜色的参数分别是: 色调(H...5.然后对目标轮廓的凹凸包的个数就可以的出手势表示的数字。
  • OpenCV手势识别-手掌特征提取源码

    热门讨论 2015-05-12 13:57:48
    本文对http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/hull/hull.html#hull以及http://www.intorobotics.com/9-opencv-tutorials-hand-gesture-detection-recognition/两个部分进行合并。并加入...
  • OpenCV+python手势识别框架和简单例子 基于 静默虚空 大神文章的原码修改调通的。https://blog.csdn.net/linsk/article/details/76457955 
  • 介绍introduction从opencv2.4开始,加入了新的类facerecognizer,我们可以使用它便捷地进行人脸识别实验。本文既介绍代码使用,又介绍算法原理。(他写的源代码,我们可以在opencvopencv\modules\contrib\doc\...

    2013-06-22 回答

    1.1.介绍introduction

    从opencv2.4开始,加入了新的类facerecognizer,我们可以使用它便捷地进行人脸识别实验。本文既介绍代码使用,又介绍算法原理。(他写的源代码,我们可以在opencv的opencv\modules\contrib\doc\facerec\src下找到,当然也可以在他的github中找到,如果你想研究源码,自然可以去看看,不复杂)

    目前支持的算法有

    eigenfaces特征脸createeigenfacerecognizer()

    fisherfaces createfisherfacerecognizer()

    localbinary patterns histograms局部二值直方图 createlbphfacerecognizer()

    下面所有的例子中的代码在opencv安装目录下的samples/cpp下面都能找到,所有的代码商用或者学习都是免费的。

    1.2.人脸识别face recognition

    对人类来说,人脸识别很容易。文献[tu06]告诉我们,仅仅是才三天的婴儿已经可以区分周围熟悉的人脸了。那么对于计算机来说,到底有多难?其实,迄今为止,我们对于人类自己为何可以区分不同的人所知甚少。是人脸内部特征(眼睛、鼻子、嘴巴)还是外部特征(头型、发际线)对于人类识别更有效?我们怎么分析一张图像,大脑是如何对它编码的?david hubel和torstenwiesel向我们展示,我们的大脑针对不同的场景,如线、边、角或者运动这些局部特征有专门的神经细胞作出反应。显然我们没有把世界看成零散的块块,我们的视觉皮层必须以某种方式把不同的信息来源转化成有用的模式。自动人脸识别就是如何从一幅图像中提取有意义的特征,把它们放入一种有用的表示方式,然后对他们进行一些分类。基于几何特征的人脸的人脸识别可能是最直观的方法来识别人脸。第一个自动人脸识别系统在[kanade73]中又描述:标记点(眼睛、耳朵、鼻子等的位置)用来构造一个特征向量(点与点之间的距离、角度等)。通过计算测试和训练图像的特征向量的欧氏距离来进行识别。这样的方法对于光照变化很稳健,但也有巨大的缺点:标记点的确定是很复杂的,即使是使用最先进的算法。一些几何特征人脸识别近期工作在文献[bru92]中有描述。一个22维的特征向量被用在一个大数据库上,单靠几何特征不能提供足够的信息用于人脸识别。

    特征脸方法在文献[tp91]中有描述,他描述了一个全面的方法来识别人脸:面部图像是一个点,这个点是从高维图像空间找到它在低维空间的表示,这样分类变得很简单。低维子空间低维是使用主元分析(principal component analysis,pca)找到的,它可以找拥有最大方差的那个轴。虽然这样的转换是从最佳重建角度考虑的,但是他没有把标签问题考虑进去。[gm:读懂这段需要一些机器学习知识]。想象一个情况,如果变化是基于外部来源,比如光照。轴的最大方差不一定包含任何有鉴别性的信息,因此此时的分类是不可能的。因此,一个使用线性鉴别(linear discriminant analysis,lda)的特定类投影方法被提出来解决人脸识别问题[bhk97]。其中一个基本的想法就是,使类内方差最小的同时,使类外方差最大。

    近年来,各种局部特征提取方法出现。为了避免输入的图像的高维数据,仅仅使用的局部特征描述图像的方法被提出,提取的特征(很有希望的)对于局部遮挡、光照变化、小样本等情况更强健。有关局部特征提取的方法有盖伯小波(gabor waelets)([wiskott97]),离散傅立叶变换(discretecosinus transform,dct)([messer06]),局部二值模式(localbinary patterns,lbp)([ahp04])。使用什么方法来提取时域空间的局部特征依旧是一个开放性的研究问题,因为空间信息是潜在有用的信息。

    1.3.人脸库face database

    我们先获取一些数据来进行实验吧。我不想在这里做一个幼稚的例子。我们在研究人脸识别,所以我们需要一个真的人脸图像!你可以自己创建自己的数据集,也可以从这里(http://face-rec.org/databases/)下载一个。

    at&tfacedatabase又称orl人脸数据库,40个人,每人10张照片。照片在不同时间、不同光照、不同表情(睁眼闭眼、笑或者不笑)、不同人脸细节(戴眼镜或者不戴眼镜)下采集。所有的图像都在一个黑暗均匀的背景下采集的,正面竖直人脸(有些有有轻微旋转)。

    展开全文
  • 基于Opencv手势识别

    2018-04-27 16:30:38
    基于Opencv凸包检测的手势识别,使用训练好的XML文件,可以识别0,1,2,3,4,5,6,8等手势。
  • MacOS 下使用Opencv +机器学习,来识别左右人手掌,识别左右手手势,实现胜利手势,OK手势识别
  • opencv实现两种手势识别,拳头和手掌,效果还是可以的
  • 基于python+opencv实现初步手势识别,经过本人亲测代码,能够实现基本的手势识别 但是对于背景要求光线等等有着一定要求,各位大佬们可以在这基础上加以改进,手势识别的原理在凸凹包点上下功夫.
  • 一个实现石头剪刀布的小程序,基于opencv,在vs2010和opencv2.4.4下可以完美运行,另一个是一个根据手势播放音频的,还有一个提供参考
  • OPENCV手势动作识别-石头剪刀布,OpenCV3.0版本,VS2012完美运行。
  • 手势识别 基于OpenCV的数字手势识别算法
  • openCV 手势识别

    2010-12-19 19:04:16
    这个是 用openCV 写的 手势识别 程序 里面有很详细的介绍 ,适用于基础的几个手势的识别 ,是书本上的例子的衍生
  • opencv手势识别(1_手势分割)

    千次阅读 2021-01-18 22:56:34
    手势识别系列博文1:手势分割 琴某人... •๑)   后文有代码实现:    6种肤色检测方法的原理及实现:https://blog.csdn.net/qinqinxiansheng/article/details/112795823   opencv手势识别(2_KNN算法识别):...

    手势识别系列博文1:手势分割

    琴某人辛辛苦苦码的报告,当然不能让你们这么容易复制过去(๑• . •๑)
      后文有代码实现:
       6种肤色检测方法的原理及实现:https://blog.csdn.net/qinqinxiansheng/article/details/112795823
      opencv手势识别(2_KNN算法识别):https://blog.csdn.net/qinqinxiansheng/article/details/112797191
      opencv手势识别(3_SVM算法识别):https://blog.csdn.net/qinqinxiansheng/article/details/112797429
      运行视频链接:
      https://www.bilibili.com/video/BV1RN411d73D?from=search&seid=5357954524943558564
      https://www.bilibili.com/video/BV1dN411d7E5?from=search&seid=7564954739334335222

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 当初选择opencv这个库是因为感觉它较skimage对新手比较友好,现在在学图像识别之前想把手势识别再看一遍,且思且记,以便日后复习。 好了废话不多说,上干货! 首先,我们要对手势识别的基本步骤做一个了解:打开...

    前言:在各类的智能识别中,手势识别是比较简单的一种了。本人大二,在大一下学期做了一个简单的树莓派摄像头手势识别的程序。当初选择opencv这个库是因为感觉它较skimage对新手比较友好,现在在学图像识别之前想把手势识别再看一遍,且思且记,以便日后复习。

    好了废话不多说,上干货!

    首先,我们要对手势识别的基本步骤做一个了解:打开摄像头 ——>截取图像手势——>图像处理——>手势模型匹配预测——>给出判断。再本篇博客中我重点介绍的是图像处理这个环节,因为这是最基本的,手势模型预测可能会涉及机器学习(还是有点难度的)。大家可以参考这一篇博客:https://cuijiahua.com/blog/2017/11/ml_8_svm_1.html

    第一步:去噪即滤波,因为我们截取的图像可能会包含很多无用的干扰信息,所以这一步是对图像进行预处理。代码块如下:

    blur = cv2.bilateralFilter(img,9,75,75)

    主要函数方法介绍:1.cv2的bilateral Filter方法含有四个参数,img是图像,9代表处理面积,75是空间高斯标准差和相似性高斯函数标准差(这边至于为啥是75应该是个数据我们不在深究)

    效果图:

    第二步:二值化黑白处理

    def binaryMask(frame,x0,y0,width,height):
        cv2.rectangle(frame,(x0,y0),(x0+width,y0+height),(0,255,0))
        roi = frame[y0:y0+height,x0:x0+width]
        cv2.imshow("roi",roi)#读取roi文件
        res = skinMask(roi)
        cv2.imshow("res",res)

    这边定义一个函数,有四个参数分别是:frame要处理的图像,x0和y0要处理图片的左上角的坐标,width和heignt是你要处理图片的长和宽。该函数的作用就是绘制一个手势框图来获取最初的手势图像。

    主要函数方法介绍:1.rectangle绘制一个矩形区域即绘制手势框图。

                                    2.fream绘制手势框图。

                                    3.imshow显示手势框图。

    第三步:肤色检测,所谓肤色检测顾名思义就是把人皮肤的颜色的区域保留,不是人皮肤颜色的区域掩膜成黑色。

    具体的代码如下:

    ​
    ​
    def skinMask(roi):
    	rgb = cv2.cvtColor(roi, cv2.COLOR_BGR2RGB) #转换到RGB空间
    	(R,G,B) = cv2.split(rgb) #获取图像每个像素点的RGB的值,即将一个二维矩阵拆成三个二维矩阵
    	skin = np.zeros(R.shape, dtype = np.uint8) #掩膜
    	(x,y) = R.shape #获取图像的像素点的坐标范围
    	for i in range(0, x):
    		for j in range(0, y):
    			#判断条件,不在肤色范围内则将掩膜设为黑色,即255
    			if (abs(R[i][j] - G[i][j]) > 15) and (R[i][j] > G[i][j]) and (R[i][j] > B[i][j]):
    				if (R[i][j] > 95) and (G[i][j] > 40) and (B[i][j] > 20) \
    						and (max(R[i][j],G[i][j],B[i][j]) - min(R[i][j],G[i][j],B[i][j]) > 15):
    					skin[i][j] = 255
    				elif (R[i][j] > 220) and (G[i][j] > 210) and (B[i][j] > 170):
    					skin[i][j] = 255
    	res = cv2.bitwise_and(roi,roi, mask = skin) #图像与运算
    
        return res
    ​
    
    ​

     定义函数skinMask参数为roi,想用numpy中的zeros方法返回一个给定形态和类型的用0填充的数组,YCrCb则是返回的roi把它转换到RGB空间。因为imread读取的图片是以BGR的形式的。

    这边我提一句奥,那边if里面的条件判断语句是在一般的光线下,所有的的RGB特定数据,也就是说在强光或者是很暗的环境下手势识别的效果可能没有那么好。

    一般光照条件下的判断条件:R>95 AND G>40 B>20 AND MAX(R,G,B)-MIN(R,G,B)>15 AND ABS(R-G)>15 AND R>G AND R>B

    在侧光拍摄环境下,R>220 AND G>210 AND B>170 AND ABS(R-G)<=15 AND R>B AND G>B

    效果图:

     

     

    第四步:轮廓提取

      

    camera = cv2.VideoCapture(0)
    
    camera.set(10, 150)
    
    while camera.isOpened():
        ret, frame = camera.read()
        threshold = cv2.getTrackbarPos('trh1', 'trackbar')
        frame = cv2.bilateralFilter(frame, 5, 50, 100)  # smoothing filter
        frame = cv2.flip(frame, 1)  # flip the frame horizontally
        cv2.rectangle(frame, (int(cap_region_x_begin * frame.shape[1]), 0),
                      (frame.shape[1], int(cap_region_y_end * frame.shape[0])), (255, 0, 0), 2)
        cv2.imshow('original', frame)
    
        #  Main operation
        if isBgCaptured == 1:  # this part wont run until background captured
            img = removeBG(frame)
            img = img[0:int(cap_region_y_end * frame.shape[0]),
                  int(cap_region_x_begin * frame.shape[1]):frame.shape[1]]  # clip the ROI
            # cv2.imshow('mask', img)
    
            # convert the image into binary image
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            blur = cv2.GaussianBlur(gray, (blurValue, blurValue), 0)
            # cv2.imshow('blur', blur)
            ret, thresh = cv2.threshold(blur, threshold, 255, cv2.THRESH_BINARY)
            # cv2.imshow('ori', thresh)
    
            # get the coutours
            thresh1 = copy.deepcopy(thresh)
            contours, hierarchy = cv2.findContours(thresh1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
            length = len(contours)
            maxArea = -1
            if length > 0:
                for i in range(length):  # find the biggest contour (according to area)
                    temp = contours[i]
                    area = cv2.contourArea(temp)
                    if area > maxArea:
                        maxArea = area
                        ci = i
    
                res = contours[ci]
               
                hull = cv2.convexHull(res)
                drawing = np.zeros(img.shape, np.uint8)
               
                cv2.drawContours(drawing, [res], 0, (0, 255, 0), 2)
                cv2.drawContours(drawing, [hull], 0, (0, 0, 255), 3)
    
    
          cv2.imshow('output', drawing)

    效果图:

             

     

    总结:实现了简单的图像处理和轮廓绘制。为接下来的特征提取打下了基础 

    展开全文
  • 2, (0,0,255), 3, cv2.LINE_AA) GPIO.output(led,GPIO.LOW)#关灯 elif l==3: if arearatio(frame,'3',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA) GPIO.output(beep,GPIO.HIGH)#蜂鸣器响 else: pass#屏蔽ok手势 ...
  • 通过opencv&KNN实现手势识别,代码简单,效果很好。功能包含,图片采集,特征处理,k值调整,手势预测,石头剪刀布小游戏
  • 基于opencv的数字手势识别,平台是基于vs2010开发的,需要配置opencv
  • 利用Android开发中的JNI接口,导入OpenCV库进行手势识别,所使用的图片全部从Android的camera中进行采集,手势需要带上红手套,程序识别红色的方块物体,能够识别出1,2,3。。。的数字。
  • 基于 Opencv手势识别系统分析 指导老师:鲁晓军 作者:毛晓洁 日期:2013.10.18 基于 Opencv手势识别系统分析 系统研究背景 手势识别流程分析 系统总体结构 系统的设计与实现 总结 1.系统研究背景及应用 人机交互在...

空空如也

空空如也

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

opencv手势识别

友情链接: 99702960.rar