智能家居手势识别,只需百度AI即可搞定
上次我尝试做了一个给眼镜加特效,针对的是静态图像,具体文章参考 https://ai.baidu.com/forum/topic/show/942890 。
这次我尝试在视频中加眼镜特效,并且加上手势识别,不同的手势佩戴不同的眼镜。接下来将介绍手势识别接口,并介绍如何接入。
手势识别接口
接口描述
识别图片中的手势类型,返回手势名称、手势矩形框、概率分数,可识别24种常见手势,适用于手势特效、智能家居手势交互等场景。
支持的24类手势列表:拳头、OK、祈祷、作揖、作别、单手比心、点赞、Diss、我爱你、掌心向上、双手比心(3种)、数字(9种)、Rock、竖中指。
注:
- 上述24类以外的其他手势会划分到other类。
- 除识别手势外,若图像中检测到人脸,会同时返回人脸框位置。
人体分析的请求方式和人脸识别的请求方式有所不同,具体的使用说明参见文档 https://ai.baidu.com/docs#/Body-API/27495b11
请求格式
POST 方式调用,请求 URL 为 https://aip.baidubce.com/rest/2.0/image-classify/v1/gesture ,Content-Type 为 application/x-www-form-urlencoded,然后通过 urlencode 格式化请求体。
请求参数
返回说明
返回示例
{
"log_id": 4466502370458351471,
"result_num": 2,
"result": [{
"probability": 0.9844077229499817,
"top": 20,
"height": 156,
"classname": "Face",
"width": 116,
"left": 173
},
{
"probability": 0.4679304957389832,
"top": 157,
"height": 106,
"classname": "Heart_2",
"width": 177,
"left": 183
}]
}
实例
1. 创建应用
由于戴眼镜是使用的人脸识别的接口,手势识别是人体分析的接口,因此为了将手势识别应用到戴眼镜特效中,需要在创建人脸识别应用时勾选人体分析的手势识别。
首先进入“控制台”的“人脸识别”,然后“创建应用”。
然后填上“应用名称”和“应用描述”,并且接口勾选上“人体分析”下的“手势识别”。
之后点击“立即创建”,创建好之后我们就能够获取到应用的 “API key” 和 “Secret key”,用于后面获取 “token key”。
2.获取 token key
通过 API Key 和 Secret Key 获取的 access_token。更多关于 access_token 的获取方法参考 http://ai.baidu.com/docs#/Auth/top。
下面代码是 python3 获取 access_token 的代码
def get_token_key():
# client_id 为官网获取的AK, client_secret 为官网获取的SK
client_id = '【百度云应用的AK】' # API key
client_secret = '【百度云应用的SK】' # Secret key
url = f'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials' \
f'&client_id={client_id}&client_secret={client_secret}'
headers = {'Content-Type': 'application/json; charset=UTF-8'}
res = requests.post(url, headers=headers)
token_content = res.json()
assert "error" not in token_content, f"{token_content['error_description']}"
token_key = token_content['access_token']
return token_key
3.调用手势识别接口
调用手势识别接口的 python3 代码实现如下:
def get_hand_info(image_base64, token_key):
request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/gesture"
params_d = dict()
params_d['image'] = str(image_base64, encoding='utf-8')
access_token = token_key
request_url = request_url + "?access_token=" + access_token
res = requests.post(url=request_url,
data=params_d,
headers={'Content-Type': 'application/x-www-form-urlencoded'})
data = res.json()
assert 'error_code' not in data, f'Error: {data["error_msg"]}'
return data
正确调用接口获取到数据之后,我们可以得到一些想要的信息。例如:获取检测的类别的数量、各个类别的类别名以及边框。
def get_hand_num(data):
return data['result_num'] def get_hand_cls_and_bbox(data):
result = list()
cls_list = list()
hand_num = get_hand_num(data)
for i in range(hand_num):
res_dict = data['result'][i]
cls = res_dict['classname']
cls_list.append(cls)
bbox = [res_dict['left'], res_dict['top'], res_dict['width'], res_dict['height']]
res = [cls] + bbox
result.append(res)
return result, cls_list
案例代码与说明
整个案例的核心代码如下:(由于人脸识别的 QPS 为 2,因此在显示图像时使用了 cv2.waitKey(500),所以这个应用看起来不是很流畅)
import cv2
from util import pic_base64, get_face_info, get_face_location, get_face_num, frame2base64, get_hand_info
from pprint import pprint
import util
import face_util
import gesture_util
import os
import random token_key = '【获取的 token key】'
glasses_img = ['images/glasses/'+img for img in os.listdir('images/glasses')] glasses = cv2.imread('images/glasses/glasses6.png', cv2.IMREAD_UNCHANGED) cap = cv2.VideoCapture(0)
while True:
_, image = cap.read()
detect_img = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image_base64 = frame2base64(image)
face_data = get_face_info(image_base64, token_key)
hand_data = get_hand_info(image_base64, token_key)
_, cls_list = util.get_hand_cls_and_bbox(hand_data)
if face_data:
location = get_face_location(face_data)
face_num = util.get_face_num(face_data)
landmark4 = util.get_landmark4(face_data)
if util.compare_hand(cls_list, 'Heart_single'):
detect_img = gesture_util.draw_heart_single(detect_img)
if util.compare_hand(cls_list, 'Ok'):
detect_img = gesture_util.draw_firework(detect_img)
if util.compare_hand(cls_list, 'One'):
glasses = cv2.imread(glasses_img[1], cv2.IMREAD_UNCHANGED)
detect_img = gesture_util.draw_one(detect_img)
if util.compare_hand(cls_list, 'Two'):
glasses = cv2.imread(glasses_img[2], cv2.IMREAD_UNCHANGED)
detect_img = gesture_util.draw_two(detect_img)
if util.compare_hand(cls_list, 'Three'):
glasses = cv2.imread(glasses_img[3], cv2.IMREAD_UNCHANGED)
detect_img = gesture_util.draw_three(detect_img)
if util.compare_hand(cls_list, 'Four'):
glasses = cv2.imread(glasses_img[4], cv2.IMREAD_UNCHANGED)
detect_img = gesture_util.draw_four(detect_img)
if util.compare_hand(cls_list, 'Five'):
glasses = cv2.imread(glasses_img[5], cv2.IMREAD_UNCHANGED)
detect_img = gesture_util.draw_five(detect_img)
if util.compare_hand(cls_list, 'Fist'):
glasses = cv2.imread(glasses_img[random.randint(0, len(glasses_img)-1)], cv2.IMREAD_UNCHANGED)
if util.compare_hand(cls_list, 'ILY'):
detect_img = gesture_util.draw_love(detect_img) detect_img = face_util.wear_glasses(detect_img, glasses, face_num, landmark4)
detect_img = cv2.flip(detect_img, 1)
else:
detect_img = cv2.flip(detect_img, 1)
# for i, cls in enumerate(cls_list):
# if cls != 'Face':
# cv2.putText(detect_img, cls, (50, 50 + 100 * i), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 255), 2)
cv2.imshow('pic', detect_img)
key = cv2.waitKey(500) & 0xFF
if key == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
该代码主要识别数字1-5、比心、OK、单手我爱你和拳头手势,数字1-5对应不同类型的眼镜,拳头代表随机更换眼镜,比心会在界面上画出心❤,OK会在界面上展示一些烟花,单手我爱你展示爱你的表情。
下面是一些截图展示:
one:
two:
three:
four:
five:
OK:
比心:
我爱你:
项目代码地址: https://github.com/busyboxs/baiduAIFace ,修改好自己的 API key 和 Secret Key 之后直接执行 camera_face 即可。
作者:busyboxs
智能家居手势识别,只需百度AI即可搞定的更多相关文章
- PDF怎么旋转页面,只需几步轻松搞定!
有时候我们下载一个PDF文件里面有页面是旋转的情况,用手机看的时候可以把手机旋转过来看,那么用电脑的时候总不可能也转过来看吧,笔记本是可以的台式的是不行的,这个时候我们就需要把PDF文件中旋转的页面转 ...
- CentOS安装Yarn只需两步就搞定
Yarn 是一个依赖管理工具.它能够管理你的代码,并与全世界的开发者分享代码.Yarn 是高效.安全和可靠的,你完全可以安心使用.代码是通过包(有时也被称为组件). 在每一个包中会定义一个 packa ...
- windows下ipython的tab补全,只需安装pyreadline即可.
运行ipython提示缺失模块 在windows下安装readline失败. 根据提示访问 https://urllib3.readthedocs.org/en/latest/security.htm ...
- centos lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress 安装phpmyadmin 定时备份mysql两种方法 第二十五节课
centos lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress 安装phpmyadmin 定时备份mysql两种方法 第二十五节 ...
- Json串与实体的相互转换 (不依赖于jar包 只需Eclipse环境即可)
Json串与实体的相互转换 (不依赖于jar包 只需Eclipse环境即可) 最近学习了javaWeb开发,用的是ssh框架里面自己整合了hibernate 和Struts2 和spring框架,其中 ...
- 忘带U盘了??别急!一行python代码即可搞定文件传输
近日发现了python一个很有趣的功能,今天在这里给大伙儿做一下分享 需求前提 1.想要拷贝电脑的文件到另一台电脑但是又没有U盘2.手机上想获取到存储在电脑的文件3.忘带U盘- 您也太丢三落四了吧,但 ...
- 仅需1秒!搞定100万行数据:超强Python数据分析利器
前言 使用Python进行大数据分析变得越来越流行.这一切都要从NumPy开始,它也是今天我们在推文介绍工具背后支持的模块之一. 2 Vaex Vaex是 一种更快.更安全.总体上更方便的方法,可以使 ...
- vue调用兄弟组件的方法使用vueBus调用$emit、$on(只需触发方法即可,不需要考虑传值或参数的问题)
触发方: vueBus.$emit('queryAll') 被触发方: created() { vueBus.$on('queryAll', () => { this.getList() // ...
- Keycloak快速上手指南,只需10分钟即可接入Spring Boot/Vue前后端分离应用实现SSO单点登录
登录及身份认证是现代web应用最基本的功能之一,对于企业内部的系统,多个系统往往希望有一套SSO服务对企业用户的登录及身份认证进行统一的管理,提升用户同时使用多个系统的体验,Keycloak正是为此种 ...
随机推荐
- 初探three.js材质
这节我们浅谈一下THREE的材质.材质就是物体的皮肤,决定物体的表面.THREE的材质有很多种,他们有的和到相机的距离有关,有的和面的法向量角度有关,有的不受光照的影响,有的受到光照的影响会产生反射效 ...
- scrapy的CrawlSpider类
了解CrawlSpider 踏实爬取一般网站的常用spider,其中定义了一些规则(rule)来提供跟进link的方便机制,也许该spider不适合你的目标网站,但是对于大多数情况是可以使用的.因此, ...
- 【决战西二旗】|理解Sort算法
前言 前面两篇文章介绍了快速排序的基础知识和优化方向,今天来看一下STL中的sort算法的底层实现和代码技巧. 众所周知STL是借助于模板化来支撑数据结构和算法的通用化,通用化对于C++使用者来说已经 ...
- JS的引用顺序真的灰常重要
JS的引用一定要记得顺序,不然常常会被小小的问题卡住很久.
- Scrapy爬虫及案例剖析
由于互联网的极速发展,所有现在的信息处于大量堆积的状态,我们既要向外界获取大量数据,又要在大量数据中过滤无用的数据.针对我们有益的数据需要我们进行指定抓取,从而出现了现在的爬虫技术,通过爬虫技术我们可 ...
- 【LiteOS】STM32F103-LiteOS移植教程(详细篇)【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- Python面试的一些心得,与Python练习题分享【华为云技术分享】
版权声明:本文为CSDN博主「华为云」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/devcloud/arti ...
- YUM平台的搭建
网络安全学习内容 三.挂载yum仓库 3.1连接映像文件 步骤如下: 1.右击映像文件,单击设置,选择CentOS映像文件 2.右击映像文件,单击连接 3.2挂载本地yum 打开终端,输入vim /e ...
- Android 自定义饼状图
github 地址:https://github.com/dkest/PieView 简单分析 其实根据我们上面的知识已经能自己制作一个饼状图了.不过制作东西最重要的不是制作结果,而是制作思路. 相信 ...
- BZOJ 1861书架
小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些书太有吸引 ...