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 文件处理注意事项总结
Apr 10 Python
python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法
May 24 Python
python自动化脚本安装指定版本python环境详解
Sep 14 Python
使用python编写udp协议的ping程序方法
Apr 22 Python
Python爬虫实战之12306抢票开源
Jan 24 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
Jun 19 Python
Python pandas.DataFrame调整列顺序及修改index名的方法
Jun 21 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
Jul 01 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
Feb 13 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
Feb 14 Python
python统计mysql数据量变化并调用接口告警的示例代码
Sep 21 Python
python 如何做一个识别率百分百的OCR
May 29 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
php SQL之where语句生成器
2009/03/24 PHP
php去掉字符串的最后一个字符附substr()的用法
2011/03/23 PHP
基于php iconv函数的使用详解
2013/06/09 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
2018/06/19 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
Javascript全局变量var与不var的区别深入解析
2013/12/09 Javascript
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
javascript实现随机读取数组的方法
2015/08/03 Javascript
关于javascript中dataset的问题小结
2015/11/16 Javascript
原生JS实现轮播效果+学前端的感受(防止走火入魔)
2016/08/21 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
2016/10/25 Javascript
Angular使用Md5加密的解决方法
2017/09/16 Javascript
JS中获取 DOM 元素的绝对位置实例详解
2018/04/23 Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
2018/05/21 Javascript
从0到1构建vueSSR项目之node以及vue-cli3的配置
2019/03/07 Javascript
Vue使用鼠标在Canvas上绘制矩形
2020/12/24 Vue.js
[36:41]完美世界DOTA2联赛循环赛FTD vs Magma第一场 10月30日
2020/10/31 DOTA
python实时分析日志的一个小脚本分享
2017/05/07 Python
python中利用Future对象回调别的函数示例代码
2017/09/07 Python
Django使用HttpResponse返回图片并显示的方法
2018/05/22 Python
Python爬取视频(其实是一篇福利)过程解析
2019/08/01 Python
Python matplotlib生成图片背景透明的示例代码
2019/08/30 Python
深入了解python列表(LIST)
2020/06/08 Python
3分钟看懂Python后端必须知道的Django的信号机制
2020/07/26 Python
布里斯班女装时尚品牌:Adrift
2017/12/28 全球购物
如何防止同一个帐户被多人同时登录
2013/08/01 面试题
浙大毕业生自荐信
2014/01/26 职场文书
经典婚礼主持开场白
2014/03/13 职场文书
公司年会主持词
2014/03/22 职场文书
三月法制宣传月活动总结
2014/07/03 职场文书
《金钱的魔力》教学反思
2016/02/20 职场文书
写给医护人员的一封感谢信
2019/09/16 职场文书
Python实现位图分割的效果
2021/11/20 Python
Golang数据类型和相互转换
2022/04/12 Golang
java版 联机五子棋游戏
2022/05/04 Java/Android