实习的时候做的一个虚拟动作捕捉和人物驱动的项目,里面可分析的知识还是比较多的,主要是我还没用过unity,这软件花了半个月才熟悉起来。先看一下人物驱动的效果,可能看着有些卡,第一是我开了那个屏幕录像,还有一个是加了手指部分关键点的识别,所以帧率就下来了。在我笔记本电脑上跑的时候就还好。可以看到手指部分的细节捕捉的还可以。这个只是初步做了简单的优化时候的展示。
下面这个是对视频的动作捕捉(至于为什么手指没有动作,是因为mediapipe没有捕捉到手指的细节,也就是手离镜头太远了),可以看到整个模型的动作还是比较流畅的,这里面做了更近一步非常细致的优化,又引入了质心,可以有效的缓解抖动的问题,对关键点用卡尔曼滤波法做平滑的处理(用其他的滤波法也可以,比如卡euro filter,Savgol过滤器,指数滑动均值滤波器),人体的骨骼不能任意角度的旋转,所以要对模型的骨骼的欧拉角进行限制。
另外,要想驱动人体的动画模型,还需要对检测到的关键点做尺度的变换,要变换到模型骨骼的尺度,就像每个人手有长有短一样,这些点要一一对应起来才能完美的驱动人体模型。人物模型的驱动差不多就这些难点。
mediapipe的介绍:
用到的人体关键点检测的算法是Google开发的基于深度学习的实时多媒体套件,汇集了人体、手部、人脸关键点追踪、物体检测、物体识别等多个流行的视觉任务的成果。整套 Mediapipe正如其名字,专门为便携设备上的多媒体应用设计,模型非常小,在笔记本手机上也能实时跑,跨平台、跨语言。
mediapipe实时性是没什么问题。但是是以牺牲了质量为代价的,这种关键点检测一般是用来做动作识别,类似于运动app跳绳计数、判定瑜伽动作标不标准这种。用单目视觉来做人物模型的驱动,总差点意思。我们平时用的摄像头是二维的,动作捕捉是三维的(例如深度摄像机就有深度输出),或者从多个视角,也能重建出三维的关键点。然而对于单目图像的关键点,各个关键点到相机深度。
Mediapipe Pose 能够预测一个相对深度,也就是各个关键点离相机的大致远近关系;人体各个部位的尺寸及比例是有先验的。因此mediapipe能估计一个大致的三维的人体姿态,它可以输出pose_world_landmark。不过这个world_landmark和图像的关键点并不一致,而且是以屁股为原点的,没有绝对位置。Mediapipe 既能输出2D图像关键点的坐标,又能输出3D的关键点坐标,我们只需要额外提供一个相机内参,用Perspective-n-Points算法去求解出3D关键点相对于相机的变换,相机内参不用精确,差不多就行。用solvePNP的结果并不能完美的投影,也就是结果和输入的人体动作对不齐,看了一个大佬的暴力做法直接保持z坐标不变,调整x,y使得投影结果和2D关键点一致。
这只是先大概的介绍一下,后续我还会出讲解,代码部分我后边整理好了会放出来,并且会详细的讲解这些难点部分。喜欢的后续可以关注一下!!!