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语言的优雅之处
Jul 04 Python
Python、PyCharm安装及使用方法(Mac版)详解
Apr 28 Python
Python中GeoJson和bokeh-1的使用讲解
Jan 03 Python
python删除列表元素的三种方法(remove,pop,del)
Jul 22 Python
利用Python绘制有趣的万圣节南瓜怪效果
Oct 31 Python
Python函数的定义方式与函数参数问题实例分析
Dec 26 Python
TensorFlow加载模型时出错的解决方式
Feb 06 Python
python读写文件write和flush的实现方式
Feb 21 Python
vue常用指令代码实例总结
Mar 16 Python
Django实现前台上传并显示图片功能
May 29 Python
基于python实现图片转字符画代码实例
Sep 04 Python
python爬虫爬取某网站视频的示例代码
Feb 20 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
咖啡店都有些什么常规豆子呢?有什么风味在里面
2021/03/04 咖啡文化
用PHP和ACCESS写聊天室(五)
2006/10/09 PHP
PHP四大安全策略
2014/03/12 PHP
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
2014/06/21 PHP
PHP中文字符串截断无乱码解决方法
2016/10/10 PHP
Zend Framework数据库操作方法实例总结
2016/12/11 PHP
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
JS数组array元素的添加和删除方法代码实例
2015/06/01 Javascript
js解决movebox移动问题
2016/03/29 Javascript
javascript中this指向详解
2016/04/23 Javascript
原生JS封装Ajax插件(同域、jsonp跨域)
2016/05/03 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
2017/04/20 Javascript
详解webpack 多页面/入口支持&公共组件单独打包
2017/06/29 Javascript
解决vuecli3.0热更新失效的问题
2018/09/19 Javascript
jQuery点击页面其他部分隐藏下拉菜单功能
2018/11/27 jQuery
记一次vue去除#问题处理经过小结
2019/01/24 Javascript
JS实现字体背景跑马灯
2020/01/06 Javascript
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
2020/07/21 Javascript
python self,cls,decorator的理解
2009/07/13 Python
Python中防止sql注入的方法详解
2017/02/25 Python
教大家玩转Python字符串处理的七种技巧
2017/03/31 Python
详解python--模拟轮盘抽奖游戏
2019/04/12 Python
python中selenium操作下拉滚动条的几种方法汇总
2019/07/14 Python
pycharm专业版远程登录服务器的详细教程
2020/09/15 Python
体验完美剃须:The Art of Shaving
2018/08/06 全球购物
工程师自我评价怎么写
2013/09/19 职场文书
总经理岗位职责范本
2014/02/02 职场文书
活动策划邀请函
2014/02/06 职场文书
建筑结构施工专业推荐信
2014/02/21 职场文书
职工代表大会主持词
2014/04/01 职场文书
保洁公司服务承诺书
2014/05/28 职场文书
领导班子个人对照检查材料(群众路线)
2014/09/26 职场文书
Java实现房屋出租系统详解
2021/10/05 Java/Android
JS中如何优雅的使用async await详解
2021/10/05 Javascript
Java 异步任务计算FutureTask
2022/04/28 Java/Android