用胯!论Openpose转Unity.humanoid一种方案(一)
Openpose介绍
openpose是git上一个开源库。(开源其实无所谓,你有那条件训练吗)
可以用视频出实时的3d骨骼测算:

也可以从单张图出静态的2d测算:

Unity.Humanoid介绍
就是一种标准,用来将各种用户自定义骨骼和Unity的标准人体对应起来。这样的话,人型动作和骨骼可以合理地自动转换:


Openpose的Body_25介绍
类似的,openpose中也有一套人体标准:

因为本文主要关注的是bodykey的映射,所以其他面部,手部什么的就不拿出来对应了。
两边的映射关系
可以看出humanoid和openpose并无母子关系,属于这边有的,那边不一定有,那边有的,这边不一定有。比如openpose有脚跟和大小脚趾,而humanoid没有;humanoid有脸手部等,但openpose的手部,脸部另算,不在body_25里;而且huamanoid没有耳朵,眼睛也是非必须等等....
所以无法自动映射。如果我们要把openpose的数据映射到humanoid里,对于body_25而言,只能我们手动一一找对应。好在两边都是固定的标准,对应关系也是固定的,所以是一劳永逸的事情。
其中右边的string是我输出avatar.humanDescription.human中所有humanName的结果中对应找到的。
Openpose格式解析(单张测算的Openpose原始结果数据)
python调用openpose.bin使用命令:
输出了[图片名称]_keypoints.json的测算文件。其json结构是:

其中pose_keypoints_2d就是我们要的body_25数据,但它有75个float,每个节点有3个float,前2个float是节点的图片像素位置,以图片1像素为单位(注意数据uv.v方向可能上下颠倒);后一个float是置信度,有时候会出现置信度为0,说明这个节点没有识别出来。
我写了点代码在Unity可视化。很明显有一个节点超出了图片范围,没有被识别出来:

数据转换思路
先读取openposeJson数据,然后对25点遍历,
根据openID找到对应humanoid的名称humanName(不一定找到)
然后依据avatar.humanDescription.human,根据humanName找到实际的boneName
然后从skinedMeshRenderer.bones中,根据boneName找到对应的transform,设置上openpose的数据

字太多了,还有很多内容,切下一篇继续讲吧,下篇教你怎么用胯!
下一篇链接看评论。
至此我们已经将数据从Openpose对应到了每个Unity.SkinnedMeshRenderer.bones,下一篇描述怎样把2d位置数据应用到transform上。