上次我尝试做了一个给眼镜加特效,针对的是静态图像,具体文章参考 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 为官网获取的SKclient_id = '【百度云应用的AK】'  # API keyclient_secret = '【百度云应用的SK】'  # Secret keyurl = 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_keyrequest_url = request_url + "?access_token=" + access_tokenres = 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] + bboxresult.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 randomtoken_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) & 0xFFif 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

转载于:https://www.cnblogs.com/AIBOOM/p/11214398.html

智能家居手势识别,只需百度AI即可搞定相关推荐

  1. 安卓9去掉搜索栏_小米9pro桌面下边搜索栏怎么关闭 只需一招即可搞定

    小米9pro升级到miui11之后桌面下方多出了一个搜索栏,对于不喜欢这个搜索栏的用户来说是想要关闭的,具体关闭方法一起来了解一下吧. 想要关闭小米9pro桌面下边的搜索栏,只需打开手机,接着长按桌面 ...

  2. 电脑计算机音乐删了怎么找回,电脑中误删除的音乐文件如何恢复?只需五步即可搞定!...

    当我们宅在家里做家务时,或者是坐车无聊时,我们都会打开手机上的音乐软件,播放音乐听听歌曲,来让劳动或无聊的时间变得更加轻松.快乐. 而有的人喜欢用手机听歌,而有的人喜欢用电脑听歌,如果使用电脑听歌的话 ...

  3. 手机如何去视频水印?只需几步轻松搞定

    手机如何去视频水印?只需几步轻松搞定 很多人对于ps相关的功能有极大的误解,认为必须通过专业的软件才能够实现,而且很多专业的ps软件并不是仅仅拥有一部手机就能够使用的,还需要具备一定配置的电脑. 其实 ...

  4. 并联串联混合的电压和电流_串联、并联电路的电压、电流和电阻是关键,“只需8句”口诀搞定...

    串联.并联电路的电压.电流和电阻是关键,"只需8句"口诀搞定 电路的串联.并联是初中物理的常考点,也是必考点.更是我们学习物理电路的基础,不同电路的电流和电压的计算却别很大,或许简 ...

  5. [JavaScript]只需一行代码,轻松搞定快捷留言-V2升级版

    前天熬了大半宿发了一篇[一行代码轻松搞定快捷留言功能],同时发布了V1.0beta版的快捷留言功能和源代码,之所以是beta版,就是当时感觉虽然基本功能有了,但是还不够完善,特性也不一定合理,今天不知 ...

  6. 转换文档参数_Word、Excel、PDF多格式转换?只需1招全搞定

    在工作学习中,我们常常会遇到一些文档需要进行格式转换,比如Word文档.excel表格与PDF的互转需求.而想要实现这一操作的技巧有很多,但今天君君要分享的这个PDF转换工具基本可以覆盖全平台了,真正 ...

  7. 多人同时编辑excel,只需一招就搞定

    很多企业都会用EXCEL办公,它是个功能强大的软件,但很多用EXCEL的人也都体会到,EXCEL这东西真不是十天半个月能掌握的,企业所需的多人协同办公,需要编程语言才能实现,更多企业办公所需的功能也存 ...

  8. 怎样翻译word文档中的英文,仅需三分钟即可搞定

    怎样翻译word文档中的英文?在职场办公当中,难免会遇到外国客户.在与外国客户沟通.合作的过程当中,所使用得合作文件.资料的内容几乎都是英文.这也就使得英文不好的职员,除了准备合作资料外还需要花费大量 ...

  9. java request 克隆_Java 复制HttpServletRequest InputStream的方法 只需2步轻松搞定

    你可能很疑惑,为什么request对象中的InputStream或者Reader只能使用一次? 原理很简单,可以把流比喻成水,request里面的inputStream就好比杯子中的水.试问杯子中的水 ...

最新文章

  1. 邬贺铨:工业物联网的技术与前景
  2. Expected BEGIN_OBJECT but was BEGIN_ARRARY at line 1 column 2 path$异常解决方法
  3. linux下单点故障的软件,KeepAlived防止单点故障
  4. Spring中的用到的设计模式大全
  5. 44年前的一个数学猜想终被破解
  6. code blocks代码性能分析_Julia系列教程13--如果写出高性能的Julia代码
  7. (二十)ArcGIS JS 加载WMTS服务(超图示例)
  8. python image.open函数_PIL.Image.open和cv2.imread的比较与相互转换的方法
  9. flutter 进度条_OkHttp 在 Flutter中的运用场景,Flutter语言连接网络的方法介绍
  10. matlab遗传算法选址(多约束条件)
  11. 最强联合!北大清华互相开放本科课程(附课程名单)
  12. java int 32位_JAVA基本数据类型所占字节数是多少?(32位系统)
  13. 计网实验(一):IP子网划分
  14. 一个计算机系统配置有3台打印机,我们是局域网3站点 3台电脑共享一个打印机 3台电脑相同的系统 打印参数也设置完全一样 但是打印出来的效果却不同 请问什么原因?需要怎么设置?...
  15. 罗永浩,天下“老赖”不独你一人!6位创业明星的陨落
  16. mkisofs命令制作光盘ISO
  17. ubuntu播放不了本地视频
  18. 山东赛区|数学建模国赛山东赛区成绩发布
  19. java getmethods_java中Class.getMethods()和Class.getDeclaredMethods()方法的区别
  20. 美国互联网影视业的盈利模式

热门文章

  1. 实现HashTable
  2. 怎样定义函数指针数组
  3. springBoot使用webclient的demo
  4. Android Launcher 界面添加未接来电 / 未读短信条数显示
  5. 可禁用计算机服务,台式电脑哪些服务不能禁用?或者哪些服务必须禁用?
  6. Web3中文|年度回顾:2022年Web3的发展情况
  7. 判断苹果黑条_iPhone12 悄悄隐藏着7个细节,你可能不知道
  8. python:基金净值与龙头股收盘价 数据的相关性分析
  9. FORTRAN 写代码过程中遇到的问题记录1
  10. win10+Ubuntu16.04双系统安装gtx1070驱动 战神笔记本