Open Vtuber Studio 之開發(2)
Toby
Toby
要讓身體動起來一點都不簡單

身體姿態捕捉

說實話,身體姿態捕捉算是其中一個最麻煩的部分。外面的系統有不少的方法可用於捕捉身體姿勢,好像說 Vive 的 Sense SDK ,KinectToVR 之類的,然而大部分都需要特定的硬件如 HTC Vive,Kinect 或後繼型號如 RealSense 等等的。對於開源系統來說是能用,但是不夠完美,畢竟有一部分的東西還是有專利保護或屬於一家商業機構的(如 Kinect 的 API)。

所以在這系統中,我偏向使用 Webcam 來進行捕捉,在這篇文章裡,我主要會跟你分享使用單個 Webcam 對動作進行捕捉的想法。

為甚麼只用一個鏡頭?

當然如果可以的話 3 個鏡頭一定會比較好(畢竟你要捕捉到完整的 3D 影像,兩個鏡頭是必須的,第三個是用於正面和表情捕捉),然而,如果一個都能做到 3D 捕捉的效果不會更便宜更方便嗎?

PoseNet

https://github.com/tensorflow/tfjs-models/tree/master/posenet

poseNet 是一個在 browser 上捕捉身體姿態的神經網絡,它能捕捉身體骨幹位置於攝影平面上的位置,並即時回傳到另一個 function 裡面。這東西的好處就是使用起來超級方便,而缺點就是會讓 GPU 著火(對 GPU 運算能力需求超級的高)。

使用 2D 影像預測手部 3D 動作的想法

如果以 Vtuber 這個例子來說,手部一般都只會出現在鏡頭正面,而甚少出現在後面。因此在理論上,只要我們取得上手臂跟下手臂的長度,我們就能透過計算球型路徑來取得手部的 3D 位置,並自動移除其負值的答案。

計算原理圖,先假設肩膀的位置是 0,0,0 點(origin)
手部對應的骨架位置(pt1, pt2 及 pt3)

這不行欸。為甚麼?不知道。

對,最後把上面的運算式掉進去測試了,就不知道為甚麼不能用。不是手在亂轉就是根本捕捉不到手的 3D位置。所以最後在打算放棄,換回去 3 鏡頭系統的時候想到了一個新的運算方式:

其實不用這麼複雜,我們只看手跟肩膀的距離就好

這裡的數學模型相信大家都學過,就是球體中心到球體表面任何一點的距離都是一樣的,但是如果你在正面看上去距離比較短,那就是代表有部分「長度」被轉換成「距離」,因此有錯覺看上去比較短而已。使用這原理,我們可以大約估算到手跟身體的距離差距。

結果?她動了。

最後手臂就能動了

最後手臂的部分就能動了。然而,這也有一個問題,那就是手臂的旋轉狀態我們仍然是不知道的。如果真的要量度到那個準確度的話,看來我們只能轉用加速度傳感器 + Arduino 來做了。但是在那個之前,我打算先處理好基本的動作再想辦法處理像旋轉角度,手指之類的微動作。