通过普通摄像头拍摄出的照片来进行识别是存在很大的困难的,但是有困难才能找到更好的方法去解决。在百度上大致找了一下手语识别的案例,很少。api只是看到了face++发布的手势识别,在我写文章的时候又看到了百度发布的手势识别api,之后会尝试去进行使用。
这次使用的是face++的api,face++的api是在之前发现的,功能上的话还是比较强大的,但是没有离线版本,需要将数据进行上传,然后对json进行解析得到结果。
这是官网给出的一个demo,识别率挺不错的,最后给出的是一个在20种手势上的分布概率,接下来我们自己调用一下api分析自己的手势。
1. 查看官方的api。找到gesture api,先看一下是怎么说的。
调用参数:
官方还给出了一些调用错误返回的参数的说明,有兴趣的可以去官网看一下。
还给出了一个使用命令行调用api的实例:
从实例上不难看出,向 https://api-cn.faceplusplus.com/humanbodypp/beta/gesture 发送请求,默认的参数有 api_key,api_secret,image_file。api_key和api_secret可以通过控制台进行生成。
接下来开始写代码的调用,python版本的,其他版本的类似。
我们将api封装成一个类 gesture:
将其中的key和secret替换成自己的就可以使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
''' # -*- 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)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
''' # -*- 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() |
图片保存的路径:./pic/
运行结果:
显示的随机手势
模仿的手势(打个码,主要看手)
点击q后:
手势做的有点不标准,但是没关系,系统可以运行。
调用face++api的文章到此结束。代码打包后会上传。之后会修改链接地址。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/RookieSa/article/details/84196341