Face++ API实现手势识别系统设计


Posted in Python onNovember 21, 2018

        通过普通摄像头拍摄出的照片来进行识别是存在很大的困难的,但是有困难才能找到更好的方法去解决。在百度上大致找了一下手语识别的案例,很少。API只是看到了Face++发布的手势识别,在我写文章的时候又看到了百度发布的手势识别API,之后会尝试去进行使用。

        这次使用的是Face++的API,Face++的API是在之前发现的,功能上的话还是比较强大的,但是没有离线版本,需要将数据进行上传,然后对JSON进行解析得到结果。

Face++ API实现手势识别系统设计

这是官网给出的一个Demo,识别率挺不错的,最后给出的是一个在20种手势上的分布概率,接下来我们自己调用一下API分析自己的手势。

1. 查看官方的API。找到Gesture API,先看一下是怎么说的。

Face++ API实现手势识别系统设计

调用参数:

Face++ API实现手势识别系统设计

Face++ API实现手势识别系统设计

官方还给出了一些调用错误返回的参数的说明,有兴趣的可以去官网看一下。

还给出了一个使用命令行调用API的实例:

Face++ API实现手势识别系统设计

从实例上不难看出,向 https://api-cn.faceplusplus.com/humanbodypp/beta/gesture 发送请求,默认的参数有 api_key,api_secret,image_file。api_key和api_secret可以通过控制台进行生成。

Face++ API实现手势识别系统设计

接下来开始写代码的调用,Python版本的,其他版本的类似。

我们将API封装成一个类 Gesture:

Face++ API实现手势识别系统设计

将其中的key和secret替换成自己的就可以使用:

'''
# -*- coding:utf-8 -*-
@author: TulLing
'''
import requests 
from json import JSONDecoder 
 
gesture_englist = ['big_v','fist','double_finger_up','hand_open','heart_d','index_finger_up','ok','phonecall','palm_up','rock','thumb_down','thumb_up','victory']
gesture_chinese = ["我最帅",
   "拳头,停下",
   "我发誓",
   "数字5",
   "比心",
   "数字1",
   "好的呢,OK",
   "打电话",
   "手心向上",
   "爱你,520",
   "差评,不好的",
   "好评,Good,很棒",
   "胜利,开心"]
# 将字典排序
def sort_dict(adict):
 return sorted(adict.items(),key= lambda item:item[1])
 
class Gesture(object):
 def __init__(self):
 self.http_url = 'https://api-cn.faceplusplus.com/humanbodypp/beta/gesture'
 self.key = '*****'
 self.secret = '******'
 self.data = {"api_key":self.key,"api_secret":self.secret}
 
 
 # 获取手势信息
 def get_info(self,files):
 response = requests.post(self.http_url,data=self.data,files=files)
 req_con = response.content.decode('utf-8')
 req_dict = JSONDecoder().decode(req_con)
 #print(req_dict)
 if('error_message' not in req_dict.keys()) and (len(req_dict['hands'])):
 # 获取
  hands_dict = req_dict['hands']
  #print(type(hands_dict))
  # 获取到手的矩形的字典
  gesture_rectangle_dict = hands_dict[0]['hand_rectangle']
  # 获取到手势的字典
  gesture_dict = hands_dict[0]['gesture']
  
  return gesture_dict,gesture_rectangle_dict
 else:
  return [],[];
 
 # 获取到手势文本信息
 def get_text(self,index):
 return gesture_chinese[index]
 
 # 获取到手势对应的概率
 def get_pro(self,gesture_dict,index):
 # print(gesture_dict)
 if(gesture_dict is None or gesture_dict == []):
  return 0
 return gesture_dict[gesture_englist[index]]
 
 # 获取到手势的位置
 def get_rectangle(self,gesture_rectangle_dict):
 if(gesture_rectangle_dict is None or gesture_rectangle_dict == []):
  return (0,0,0,0)
 x = gesture_rectangle_dict['top']
 y = gesture_rectangle_dict['left']
 width = gesture_rectangle_dict['width']
 height = gesture_rectangle_dict['height']
 return (x,y,width,height)

封装好了Gesture类后接下来就是调用:先将官方给出的手势的图片保存起来,为了方便只保留单手的手势,然后生成随机数读取手势图片,我们去模仿手势,后台显示是正确手势的概率以及具体的位置,如果图像中没有手势则概率为0,位置为(0,0,0,0)。

'''
# -*- coding:utf-8 -*-
@author: TulLing
'''
import sys
sys.path.append("../gesture/")
 
import os
import random
import cv2 as cv
import time
import LearnGesture
 
def gestureLearning():
 os.system("cls")
 print("进入学习手势模式!")
 print("我们有13个手势,来和我学吧!(每次结束后可以选择输入 Q\q 退出!)")
 while(True):
 pic_num = random.randint(0,12) # 生成显示的图片的编号(随机数: 0 - 13)
 print(pic_num)
 pic_path = '../gesture/pic/gesture' + str(pic_num) + ".jpg" # 生成图片路径
 
 pic = cv.imread(pic_path) # 加载图片
 pic = cv.resize(pic,(120,120))
 cv.imshow("PIC",pic) # 显示要学习的手势
 
 print("即将打开摄像头,你有5秒种的时间准备手势,5秒种保持手势!")
 write_path = "../gesture/pic/test.jpg"
 cap = cv.VideoCapture(1)
 while(True):
  _,frame = cap.read()
  cv.imshow("Frame",frame)
  key = cv.waitKey(10)
  if(key == ord('Q') or key == ord('q')):
  cv.imwrite(write_path,frame)
  cv.waitKey(200)
  cap.release()
  cv.destroyAllWindows()
  break
  
 # 此处应该有手势识别
 files = {"image_file":open(write_path,'rb')}
 gesture = LearnGesture.Gesture()
 
 # 获取到手势文本
 ge_text = gesture.get_text(pic_num)
 # 获取手势信息
 gesture_dict,gesture_rectangle_dict = gesture.get_info(files)
 # 获取手势的概率
 ge_pro = gesture.get_pro(gesture_dict,pic_num)
 # 获取到手势的坐标
 ge_rect = gesture.get_rectangle(gesture_rectangle_dict)
 print("您学习的手势是:",ge_text)
 print("相似度达到:",ge_pro)
 print("具体位置:",ge_rect)
 
 
 # print("一轮学习结束,是否继续学习?(Y/N)")
 # 退出程序,回到主菜单或者继续
 commend = input("一轮学习结束,是否继续学习?(Y/N):")
 print(commend)
 
 if( commend == 'N' or commend == "n"):
  break
gestureLearning()

Face++ API实现手势识别系统设计

图片保存的路径:./pic/

运行结果:

Face++ API实现手势识别系统设计

显示的随机手势

Face++ API实现手势识别系统设计

模仿的手势(打个码,主要看手)

点击Q后:

Face++ API实现手势识别系统设计

手势做的有点不标准,但是没关系,系统可以运行。

调用Face++API的文章到此结束。代码打包后会上传。之后会修改链接地址。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python开发编码规范
Sep 08 Python
Python实现调度算法代码详解
Dec 01 Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
Jul 30 Python
Django 对象关系映射(ORM)源码详解
Aug 06 Python
用Python调用win命令行提高工作效率的实例
Aug 14 Python
Python:合并两个numpy矩阵的实现
Dec 02 Python
Python enumerate函数遍历数据对象组合过程解析
Dec 11 Python
Tensorflow 多线程与多进程数据加载实例
Feb 05 Python
Pygame的程序开始示例代码
May 07 Python
如何把外网python虚拟环境迁移到内网
May 18 Python
python3代码输出嵌套式对象实例详解
Dec 03 Python
利用Python+OpenCV三步去除水印
May 28 Python
详解django自定义中间件处理
Nov 21 #Python
pygame游戏之旅 添加游戏界面按键图形
Nov 20 #Python
pygame游戏之旅 添加游戏介绍
Nov 20 #Python
pygame游戏之旅 计算游戏中躲过的障碍数量
Nov 20 #Python
pygame游戏之旅 添加碰撞效果的方法
Nov 20 #Python
pygame游戏之旅 如何制作游戏障碍
Nov 20 #Python
用Python编写一个简单的CS架构后门的方法
Nov 20 #Python
You might like
Jquery工作常用实例 使用AJAX使网页进行异步更新
2011/07/26 Javascript
JQuery扩展插件Validate 5添加自定义验证方法
2011/09/05 Javascript
通过jQuery源码学习javascript(三)
2012/12/27 Javascript
用JavaScript实现页面重定向功能的教程
2015/06/04 Javascript
纯javascript实现自动发送邮件
2015/10/21 Javascript
原生js编写autoComplete插件
2016/04/13 Javascript
使用jquery.form.js实现图片上传的方法
2016/05/05 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
2016/09/01 Javascript
基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )
2017/03/30 Javascript
Spring shiro + bootstrap + jquery.validate 实现登录、注册功能
2017/06/02 jQuery
js字符限制(字符截取) 一个中文汉字算两个字符
2017/09/12 Javascript
细说webpack源码之compile流程-rules参数处理技巧(1)
2017/12/26 Javascript
nodejs搭建本地服务器轻松解决跨域问题
2018/03/21 NodeJs
js实现导航跟随效果
2018/11/17 Javascript
微信小程序实现的动态设置导航栏标题功能示例
2019/01/31 Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
2019/04/28 Javascript
JavaScript实现移动端拖动元素
2020/11/24 Javascript
python 统计代码行数简单实例
2017/05/04 Python
Python 读取某个目录下所有的文件实例
2018/06/23 Python
python斐波那契数列的计算方法
2018/09/27 Python
浅谈pytorch、cuda、python的版本对齐问题
2020/01/15 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
2020/02/19 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
2021/01/18 Python
python上下文管理器异常问题解决方法
2021/02/07 Python
Ted Baker美国官网:英国时尚品牌
2018/10/29 全球购物
俄罗斯有趣和原创礼物网上商店:MagicMag
2019/08/01 全球购物
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
营销与策划应届生求职信
2013/11/04 职场文书
大学生新闻专业个人自我评价
2013/11/12 职场文书
暑期实践思想汇报
2014/01/06 职场文书
事务机电主管工作职责
2014/02/25 职场文书
医生学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
django如何自定义manage.py管理命令
2021/04/27 Python
Python内置的数据类型及使用方法
2022/04/13 Python
vue使用watch监听属性变化
2022/04/30 Vue.js
Win11 Build 22000.829更新补丁KB5015882发布(附更新修复内容汇总)
2022/07/15 数码科技