使用Azure Kinect Body骨骼构造SMPL三维人体模型
1.SMPL模型簡介
SMPL是通過參數控制的人體模型,可控制的參數為Pose和Shape。總共有24個關節點和10個Shape控制參數,模型及關節索引如下圖。
1.1.Pose——旋轉向量控制關節點旋轉
每個關節通過一個旋轉向量控制,如下圖為手動控制關節點4繞Z軸旋轉90度、關節點19繞Y軸旋轉90度的結果。
旋轉關節點是在關節點的坐標系下操作的旋轉,部位會隨著父節點旋轉而聯動位移旋轉。例如上述再繞Z軸旋轉-90度,結果如下圖。
1.2.Shape——10個Shape參數控制體型
Shape參數是通過PCA提取的10個參數。通過Shape可以控制體型,如下為控制第一個參數為-10和10的結果。通過10個參數控制可以逼近真實人體體型,影響高低、胖瘦、關節長短等。
SMPL的骨骼如下圖所示
2.Azure Kinect Body
Azure Kinect通過深度圖可以檢測出穩定的人體關節,關節點及其索引如下圖所示。
同樣可以獲得關節點的旋轉,但是每個關節的坐標系獨立且方向不全一致,每個關節點的坐標系如下圖。
通過Azure Kinect實際采集的骨架繪制結果如下:
3.人體骨骼擬合
3.1.初步對齊
由于SMPL與Azure Kinect坐標系不一致,首先需要將SMPL與Kinect Body移動旋轉到同一個位置。未對齊的示意圖如下:
根據上述兩節的關節對應關系,形成對應的參考點對齊Map。首先將SMPL Joint0與Kinect Body Joint0移動到一起,然后構造 SMPL Joint0->Joint3 向量 VsVsVs 和 Kinect Body Joint0->Joint1 向量 VkVkVk。之后構造 VsVsVs 旋轉到 VkVkVk 的旋轉向量。操作SMPL模型進行旋轉平移,即完成初步對齊,示意圖如下:
3.2.調節參數進行骨骼對齊
設計能量函數為:
E(β,θ)=∑i=124(Rθ(J(β)i)?Jkinect,i)E(\beta,\theta)=\sum_{i=1}^{24}(R_\theta(J(\beta)_i)-J_{kinect,i})E(β,θ)=i=1∑24?(Rθ?(J(β)i?)?Jkinect,i?)
即,讓SMPL的關節點與Kinect Body的對應關節點距離最小。最終優化的結果如下圖所示:
此時Azure Kinect Body與SMPL的三維人體模型初步對齊。效果并不是特別好,因為Azure Kinect Body與SMPL的關節點不是完全一致的。需要對Azure Kinect Body骨骼進行變形,形成Azure Kinect Body到SMPL骨骼的近似轉化關系。從而更加準確的進行人體建模。骨骼變形結果如下:
(藍色為Azure Kinect Body采集原始骨骼,綠色SMPL骨骼,紅色為Azure Kinect Body變形到SMPL之后的骨骼)
此時進行迭代優化,即可得到較好結果。如下圖為擬合結果與采集點云的融合:
如上完成了使用Azure Kinect Body構造SMPL模型的過程,后續可以增加與點云的迭代優化本文中不再贅述。
總結
以上是生活随笔為你收集整理的使用Azure Kinect Body骨骼构造SMPL三维人体模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++使用OCC读取igs文件时路径为中
- 下一篇: java实现单机版和网络对战版五子棋