手势识别
更新时间:2021-05-27
手势识别
在DuMix AR中可通过扫描识别特定的手势识别AR特效内容,目前支持的可识别手势为单手手掌(五指伸展)、点赞(拇指向上)、OK(食指和拇指扣环)、比心(食指和拇指交叉)、单手比1(仅食指伸出)等五种手势,使用场景限空间识别IMU场景,不能和slam场景以及2D跟踪场景结合使用。
Sample case :代码下载
SDK 最低支持版本:2.2
百度App 最低支持版本:10.3
手势识别模型
手势识别的模型是基于paddlepaddle模型库经由AR算法训练封装而成,开发者在使用手势识别能力前,需要在ar场景包中引入该paddle模型文件gesture.paddle,固定路径为 ar/models/paddle/gesture.paddle :
效果demo中的paddle文件包含了目前支持的五种手势的模型,可直接复用。
导入模型后,需在target.json文件中配置相关参数。
"paddle_model":{
"path":"models/paddle/gesture.paddle"
}
path为模型文件所在路径,仅手势paddle可用。
注意:
- paddle文件在ar场景包中占用空间较大,请注意资源的分配,不同的算法模型包含的可识别手势不同。
- 如未使用paddle能力,不要在json中配置paddle模型,因为SDK会根据paddle配置做一些数据准备工作,带来不必要的性能损耗。
手势识别实现
LUA 代码参考:
app.on_loading_finish = function()
--API1:开启手势识别能力
PaddleGesture:send_control_msg(1)
end
--API2:手势识别回调接口
PaddleGesture.on_gesture_detected = function(mapData)
local count = mapData['gesture_count']
resultMap = mapData['gesture_result1']
result = resultMap['type']
score = resultMap['score']
x1 = resultMap['x1']
y1 = resultMap['y1']
x2 = resultMap['x2']
y2 = resultMap['y2']
if (score < 0.8) then
--得分小于0.8的手势弃用
return
end
if (result == 2) then
--当识别到手掌后显示模型
scene.pod:set_visible(true)
end
end
注意:
- 手势识别的API详解见:Lua API。
- MapData里为手势的检测结果,包含gesture_count和gesture_result两个字段,gesture_result也为mapdata类型,包含7个字段,其中type字段表示手势类型,是5个固定值,分别对应五种手势。在场景交互脚本里可根据需要取出相应的手势类型,当判断相应手势类型识别成功后执行对应的function()实现逻辑。如果Case里算法模型有更新,type的对应关系以及值是会发生变化和扩充的。
- gesture_result中的score字段表示手势得分,取出该字段后可在场景交互脚本中控制手势的有效性。
- x1、y1、x2、y2为相机识别到的手势轮廓(矩形区域对角点坐标)在屏幕上的占比,在未使用接口PaddleGesture:send_control_msg(0)关闭手势识别回调前,会根据手势的移动不断更新这些数据,开发者可根据需要取出这些数据做动态处理。
- 如果未使用接口关闭手势识别,算法会不断检测手势并返回数据,会对手机的功耗产生影响。
- 因为安卓手机配置不同,各手机识别一次手势并回调数据的时间间隔也不同,大概范围在几十毫秒到300毫秒以上不等。