Awesome
说明
repo没有给大家提供足够有用的信息,我对此感到很抱歉。这是我在2018年10月份一时兴起(hhh很怀念)做的一个demo,上传到github主要是为了留档,所以没有整理出完整的代码,而在18年之后我就不再做这个方向了,后续的工作都交给了一个师妹。我看已经有一些比较完整的repo了,有兴趣可以参考一下~
https://github.com/CMU-Perceptual-Computing-Lab/openpose_unity_plugin https://github.com/Jacob12138xieyuan/real-time-3d-pose-estimation-with-Unity3D
OpenPose + 3dPoseBaseline + Unity3d
Display
source video
online display video
offline display video
online 3d display video
offline 3d display video
Introduction
在Ubuntu 16.04下(使用笔记本电脑的单个摄像头)基于OpenPose和3dPoseBaseline来实时捕获人体关节点并将其转化为三维空间坐标,最后通过Unity3d来控制模型的动作。我的Baseline基于n1ckfg-OpenPoseRig,使用的机器是GTX 1060的笔记本电脑,实时检测的速度可以达到每秒10帧左右。这只是一个简易版本,原因在于我的程序存在下面两个问题
- 当OpenPose检测的人体关节点不全时,将输入反馈到3dPoseBaseline中会导致三维关节点的转化出错
- Unity三维人体模型的关节点移动依旧存在一些问题(关于这个问题,我会考虑请教U3D方向的大佬)
如果时间和精力充足,我会修复这两个问题,并考虑进一步优化整个过程。这里先把自己参考和学习的链接都放上来(剩下的都是自己走的弯路,没有太多参考价值)。
Experiment
joint point
OpenPose虽然具备检测三维关节点的功能,但是它需要多个摄像头才可以实现(而且维护人员好像对这个功能并不重视)。当然也有使用OpenPose二维关节点来控制Unity的开源程序,然而遗憾的是,在阅读源码之后,我发觉这个程序对我的帮助微乎其微。因此需要重新考虑使用其他方式来进行三维关节点坐标的获取,比如3dPoseBaseline。虽然ArashHosseini已经对3dPoseBaseline进行改进来转化OpenPose的关节点,但程序是基于COCO模型的,这个模型的检测速度很慢且OpenPose官方说后期会移除该模型。此外ArashHosseini的程序存在两个主要的不足
- 没有很好的处理某一帧检测出错,即该帧没有检测到任何关节点的情况
- 离线处理所有帧的效果确实非常好,但在线处理没有使用平滑且实时读取关节点JSON存在一些问题
unity3d
在与Unity模型进行交互的过程中,我认识到将真实世界坐标应用到Unity空间确实有难度。本以为只是简单的矩阵变换,但是我低估了这个过程的难度(也高估了自己在一年前对Unity的熟悉度)。阅读Kinect源码、查找相关博文......经过将近一星期的摸索,我也没有实现很理想的变换及应用方式(这也与自己的时间分配有关)。在一个很偶然的机会下,我发现了三位日本老哥的博文:博客1,博客2,博客3。感谢他们的博文,让我初步实现了这一功能(虽然展示效果依旧不是很理想)。这里我使用的核心Unity项目基于OpenPose-Rig。
data transmission
可以考虑使用计算机网络的知识来完成该过程,具体参考网络传输,不过该方法不太稳定。这里建议使用本地数据传输。需要注意的是:文件的读和写不可以同时进行,这里需要做一些特殊处理。
result
最后我使用BODY_25模型来代替ArashHosseini程序中的COCO模型并修复该程序中的两个问题,最后对整个流程进行简化和整合。只需要运行一个简单的shell脚本,就可以完成实时检测关节点控制Unity的模型的功能,既可以自主选择交互的时间,也可以通过按下"Enter"键来退出程序并kill后台进程。基于OpenPose官方源程序,我禁用了UI和Render,这也在一定程度上提升了实时检测的速度。
Reference
https://github.com/CMU-Perceptual-Computing-Lab/openpose
https://github.com/n1ckfg/OpenPoseRig
https://github.com/keel-210/OpenPose-Rig
https://github.com/miu200521358/3d-pose-baseline-vmd
https://github.com/ArashHosseini/3d-pose-baseline
https://github.com/una-dinosauria/3d-pose-baseline
https://github.com/unity3d-jp/unitychan-crs
http://unity-chan.com/contents/guideline/
http://www.manew.com/thread-22128-1-1.html
https://pterneas.com/2014/05/06/understanding-kinect-coordinate-mapping/