[MCU] 【K230嵌入式AI开发板测评】+手语简单识别篇(二)

jinglixixi   2024-10-20 09:55 楼主

对于待识别的5个手指,它与色彩的对应关系如图10所示。

image.png  

图10 色彩对应关系

 

以色彩标识手指的绘制程序为:

for i in range(5):
        j = i*8
        if i==0:
           R = 255; G = 0; B = 0
        if i==1:
           R = 255; G = 0; B = 255
        if i==2:
           R = 255; G = 255; B = 0
        if i==3:
           R = 0; G = 255; B = 0
        if i==4:
           R = 0; G = 0; B = 255
        pl.osd_img.draw_line(results_show[0], results_show[1], results_show[j+2], results_show[j+3], color=(255,R,G,B), thickness = 3)
        pl.osd_img.draw_line(results_show[j+2], results_show[j+3], results_show[j+4], results_show[j+5], color=(255,R,G,B), thickness = 3)
        pl.osd_img.draw_line(results_show[j+4], results_show[j+5], results_show[j+6], results_show[j+7], color=(255,R,G,B), thickness = 3)
        pl.osd_img.draw_line(results_show[j+6], results_show[j+7], results_show[j+8], results_show[j+9], color=(255,R,G,B), thickness = 3)

        gesture_str=gesture_res[k][1]
        pl.osd_img.draw_string_advanced( x_det , y_det-50,32, " " + str(gesture_str), color=(255,0, 255, 0))

 

那么除了所测试的3种手势外,还能识别出哪些手势呢?

共有9种手势,即fist(拳头)、five(五)、gun(枪)、love(喜爱 )、one(一)、six(六)、three(三)、thumbUp(翘拇指)、yeah(对)。

 

定义和识别手势的程序为:

# 根据手掌关键点检测结果判断手势类别
def hk_gesture(self,results):
with ScopedTiming("hk_gesture",self.debug_mode > 0):
angle_list = []
for i in range(5):
angle = self.hk_vector_2d_angle([(results[0]-results[i*8+4]), (results[1]-results[i*8+5])],[(results[i*8+6]-results[i*8+8]),(results[i*8+7]-results[i*8+9])])
angle_list.append(angle)
thr_angle,thr_angle_thumb,thr_angle_s,gesture_str = 65.,53.,49.,None
if 65535. not in angle_list:
if (angle_list[0]>thr_angle_thumb) and (angle_list[1]>thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):
gesture_str = "fist"
elif (angle_list[0]<thr_angle_s) and (angle_list[1]<thr_angle_s) and (angle_list[2]<thr_angle_s) and (angle_list[3]<thr_angle_s) and (angle_list[4]<thr_angle_s):
gesture_str = "five"
elif (angle_list[0]<thr_angle_s) and (angle_list[1]<thr_angle_s) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):
gesture_str = "gun"
elif (angle_list[0]<thr_angle_s) and (angle_list[1]<thr_angle_s) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]<thr_angle_s):
gesture_str = "love"
elif (angle_list[0]>5) and (angle_list[1]<thr_angle_s) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):
gesture_str = "one"
elif (angle_list[0]<thr_angle_s) and (angle_list[1]>thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]<thr_angle_s):
gesture_str = "six"
elif (angle_list[0]>thr_angle_thumb) and (angle_list[1]<thr_angle_s) and (angle_list[2]<thr_angle_s) and (angle_list[3]<thr_angle_s) and (angle_list[4]>thr_angle):
gesture_str = "three"
elif (angle_list[0]<thr_angle_s) and (angle_list[1]>thr_angle) and (angle_list[2]>thr_angle) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):
gesture_str = "thumbUp"
elif (angle_list[0]>thr_angle_thumb) and (angle_list[1]<thr_angle_s) and (angle_list[2]<thr_angle_s) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):
gesture_str = "yeah"
return gesture_str

 

那这9个手势是怎样的形式呢?

由程序可知,这9个手势是以5个手指的状态来表现的,即手指是处于伸直状态还是弯曲状态。

image.png  

图11 手指排列顺序

 

在图11中,若按由左至右的顺序来建立与数组angle_list[]的关系。并以“1”来表示伸直状态,以“0”来表示弯曲状态。则其判别条件就是看数组angle_list[]是否超过判别的角度,大于判别角,则为“0”,小于判别角,则为“1”。

这样我们就得到了9种手势的表现形式,见图12所示。

image.png  

image.png  

图12  9种手势

 

掌握了前面的手势定义规则,就可以按照手语规范来改写手势识别程序,以得到手语识别的目标。

当然要识别完整的手语信息还是比较困难的,因为在手语中不仅仅是静态的手势,还包含着更复杂的动态手姿,如移动、环绕、摆动、翻转、屈展以及与身体状态相配合的手势等,是一个非常据有研究挑战性的课题。

回复评论 (2)

完全能识别完整的手语信息这个是挑战

点赞  2024-10-21 07:50
引用: Jacktang 发表于 2024-10-21 07:50 完全能识别完整的手语信息这个是挑战

的确,其内容太多且复杂,但可以进行一些简单的尝试。

点赞  2024-10-21 13:12
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复