10分钟用python实现手势识别

环境准备

①百度获取SDK

浏览器搜索百度云,如未注册请先注册,然后登录点击管理控制台。点击左侧产品服务→人工智能→人体分析。点击创建应用,输入应用名称如“Baidu_OCR”,选择用途如“学习办公”,最后进行简单应用描述,即可点击“立即创建”。会出现应用列表,包括AppID、API Key、Secret Key等信息,这些稍后会用到。在这里插入图片描述
点进去之后,勾选所需要的api
在这里插入图片描述

②所需的库

程序整体是由python实现的,环境所包含的第三方库有cv2,threading,time,playsound,baidu-aip。没有这些库的同学可以win+R输入cmd进入命令行终端pip install 库名。
安装cv2 ,如果你已经装好了pip,那就直接

pip install opencv-python -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

流程步骤

①开启摄像头功能

这里我们用cv2来开启摄像头。

	capture = cv2.VideoCapture(0)#0为默认摄像头
	def camera():
	
	    while True:
	        #获得图片
	        #第一个参数ret 为True 或者False,代表有没有读取到图片
			#第二个参数frame表示截取到一帧的图片
	        ret, frame = capture.read()
	        # cv2.imshow(窗口名称, 窗口显示的图像)
	        #显示图片
	        cv2.imshow('frame', frame)
	        if cv2.waitKey(1) == ord('q'):
	            break

②手势识别

手势识别调用baidu的api来实现。首先,我们通过摄像头获得一帧图片,格式转换后作为参数传入百度的gesture函数。

def gesture_recognition():
    
    #第一个参数ret 为True 或者False,代表有没有读取到图片

    #第二个参数frame表示截取到一帧的图片
    
    while True:
        try:
            ret, frame = capture.read()

            #图片格式转换
            image = cv2.imencode('.jpg',frame)[1]
            
            gesture =  gesture_client.gesture(image)   #AipBodyAnalysis内部函数
            #获得手势名称
            words = gesture['result'][0]['classname']
            #语音播报
            voice(hand[words])
            print(hand[words])
            
        except:
            voice('识别失败')
        if cv2.waitKey(1) == ord('q'):
            break

③语音播报

手势识别完之后,我们只是把识别结果输出在了窗口上。效果不是那么绚丽。我们能不能把识别结果语音播报出来呢?答案是肯定的。playsound库可以很轻松的完成这项工作。但是playsound有个问题,就是无法解除占用,也就是说一个音频只能播放一次,要想再次播放,修改就会提示拒绝访问。
打开python安装地址:在这里插入图片描述
在Lib->sitepackages中找到playsound.py用IDE打开,编辑如下,增加一行

具体解决方法:点击这里
在这里插入图片描述

	def voice(words):
	    #语音函数
	    result  = client.synthesis(words, 'zh', 1, {
	        'vol': 5,
	    })
	    if not isinstance(result, dict):
	    	#写入文件
	        with open('./res.mp3', 'wb') as f:
	            f.write(result)
	            f.close()
	        #播放音频
	        playsound('./res.mp3')

成果展示

源码

	import os
	import cv2
	from aip import AipBodyAnalysis
	from aip import AipSpeech
	from threading import Thread
	import time
	from playsound import playsound
	
	""" 你的 APPID AK SK """
	APP_ID = '********'
	API_KEY = '********'
	SECRET_KEY =  '********'
	''' 调用'''
	
	hand={'One':'数字1','Five':'数字5','Fist':'拳头','Ok':'OK',
	      'Prayer':'祈祷','Congratulation':'作揖','Honour':'作别',
	      'Heart_single':'比心心','Thumb_up':'点赞','Thumb_down':'Diss',
	      'ILY':'我爱你','Palm_up':'掌心向上','Heart_1':'双手比心1',
	      'Heart_2':'双手比心2','Heart_3':'双手比心3','Two':'数字2',
	      'Three':'数字3','Four':'数字4','Six':'数字6','Seven':'数字7',
	      'Eight':'数字8','Nine':'数字9','Rock':'Rock','Insult':'竖中指','Face':'脸'}
	
	#语音合成
	client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
	
	#手势识别
	gesture_client = AipBodyAnalysis(APP_ID, API_KEY, SECRET_KEY)
	
	capture = cv2.VideoCapture(0)#0为默认摄像头
	def camera():
	
	    while True:
	        #获得图片
	        ret, frame = capture.read()
	        # cv2.imshow(窗口名称, 窗口显示的图像)
	        #显示图片
	        cv2.imshow('frame', frame)
	        if cv2.waitKey(1) == ord('q'):
	            break
	Thread(target=camera).start()#引入线程防止在识别的时候卡死
	
	def gesture_recognition():
	    
	    #第一个参数ret 为True 或者False,代表有没有读取到图片
	
	    #第二个参数frame表示截取到一帧的图片
	    
	    while True:
	        try:
	            ret, frame = capture.read()
	
	            #图片格式转换
	            image = cv2.imencode('.jpg',frame)[1]
	            
	            gesture =  gesture_client.gesture(image)   #AipBodyAnalysis内部函数
	            words = gesture['result'][0]['classname']
	            
	            voice(hand[words])
	            print(hand[words])
	            
	        except:
	            voice('识别失败')
	        if cv2.waitKey(1) == ord('q'):
	            break
	
	
	        
	def voice(words):
	    #语音函数
	    result  = client.synthesis(words, 'zh', 1, {
	        'vol': 5,
	    })
	    if not isinstance(result, dict):
	        with open('./res.mp3', 'wb') as f:
	            f.write(result)
	            f.close()
	        playsound('./res.mp3')
	
	gesture_recognition()

效果视频在这里插入图片描述

  • 65
    点赞
  • 405
    收藏
    觉得还不错? 一键收藏
  • 71
    评论
评论 71
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值