用胯!論Openpose轉(zhuǎn)Unity.humanoid一種方案(一)
Openpose介紹
openpose是git上一個開源庫。(開源其實無所謂,你有那條件訓練嗎)
可以用視頻出實時的3d骨骼測算:

也可以從單張圖出靜態(tài)的2d測算:

Unity.Humanoid介紹
就是一種標準,用來將各種用戶自定義骨骼和Unity的標準人體對應(yīng)起來。這樣的話,人型動作和骨骼可以合理地自動轉(zhuǎn)換:


Openpose的Body_25介紹
類似的,openpose中也有一套人體標準:

因為本文主要關(guān)注的是bodykey的映射,所以其他面部,手部什么的就不拿出來對應(yīng)了。
兩邊的映射關(guān)系
? ? 可以看出humanoid和openpose并無母子關(guān)系,屬于這邊有的,那邊不一定有,那邊有的,這邊不一定有。比如openpose有腳跟和大小腳趾,而humanoid沒有;humanoid有臉手部等,但openpose的手部,臉部另算,不在body_25里;而且huamanoid沒有耳朵,眼睛也是非必須等等....
? ? 所以無法自動映射。如果我們要把openpose的數(shù)據(jù)映射到humanoid里,對于body_25而言,只能我們手動一一找對應(yīng)。好在兩邊都是固定的標準,對應(yīng)關(guān)系也是固定的,所以是一勞永逸的事情。
其中右邊的string是我輸出avatar.humanDescription.human中所有humanName的結(jié)果中對應(yīng)找到的。
Openpose格式解析(單張測算的Openpose原始結(jié)果數(shù)據(jù))
python調(diào)用openpose.bin使用命令:
輸出了[圖片名稱]_keypoints.json的測算文件。其json結(jié)構(gòu)是:

其中pose_keypoints_2d就是我們要的body_25數(shù)據(jù),但它有75個float,每個節(jié)點有3個float,前2個float是節(jié)點的圖片像素位置,以圖片1像素為單位(注意數(shù)據(jù)uv.v方向可能上下顛倒);后一個float是置信度,有時候會出現(xiàn)置信度為0,說明這個節(jié)點沒有識別出來。
? ? 我寫了點代碼在Unity可視化。很明顯有一個節(jié)點超出了圖片范圍,沒有被識別出來:

數(shù)據(jù)轉(zhuǎn)換思路
先讀取openposeJson數(shù)據(jù),然后對25點遍歷,
根據(jù)openID找到對應(yīng)humanoid的名稱humanName(不一定找到)
然后依據(jù)avatar.humanDescription.human,根據(jù)humanName找到實際的boneName
然后從skinedMeshRenderer.bones中,根據(jù)boneName找到對應(yīng)的transform,設(shè)置上openpose的數(shù)據(jù)

字太多了,還有很多內(nèi)容,切下一篇繼續(xù)講吧,下篇教你怎么用胯!
下一篇鏈接看評論。
至此我們已經(jīng)將數(shù)據(jù)從Openpose對應(yīng)到了每個Unity.SkinnedMeshRenderer.bones,下一篇描述怎樣把2d位置數(shù)據(jù)應(yīng)用到transform上。