本文介紹一個運行於 tango 手機的應用 demo,功能是測量人體高度。
效果預覽
原理概述
該應用主要使用了 tango 的深度感知技術。
如上圖,通過深度感知技術,我們可以獲取設備周圍物體的點雲座標集合。如果深度相機前面站着一個人,我們可以拿到這個人的身體的三維座標集合(當然也混雜着無關物體的座標),然後對這些集合進行篩選,篩選出人的頭頂座標和地面座標,再將這兩個座標的 y 值相減,絕對值即爲人體身高。
開發思路
本應用的開發環境是 tango + unity,測試機型是聯想 phab2 pro。
最關鍵的步驟是找出頭頂座標和地面座標,找出這兩點座標之後,就可以算出身高值了,同時也可以通過 untiy 在座標位置繪製出線條和箭頭以及高度文本等。
尋找地面座標
尋找地面座標有兩種方式:
- 遍歷人體的點雲座標集合,找出 y 值最小的座標點,即可近似認爲是地面的 y 座標;
- 通過 TangoPointCloud.FindFloor() 方法找到地面(使用方法見官方demo:ExperimentalFloorFinding)及其 y 座標值;
尋找頭頂座標
尋找頭頂座標,也有兩種方法:
- 遍歷人體的點雲座標集合,找出 y 值最小的點,即可近似做爲地面的 y 座標;
- TangoPointCloud.FindClosetPoint() 方法(使用方法見官方 demo:PointToPoint),在手機屏幕上點擊預覽幀圖像上的人的頭頂,通過該方法找出離點擊位置最近的人體三維座標點,即可近似做爲頭頂座標;
爲簡單起見,筆者都是採用第一種方式得到兩個目標座標點的。
目前能想到的最優的方法是圍繞人體進行 360 度掃描,然後將獲取的身體座標集合進行 3d 建模,這樣得到的人體數據(不止是身高,連三圍數據都易如反掌)才最靠譜最準確。目前還未驗證該想法的可行性。
一些經驗
tango 的深度感知對頭髮不敏感,拿到的人體最高點的座標往往是額頭上的,而非頭頂(光頭除外)。
設備獲取的點雲座標集合,除了人體座標,還會有周圍干擾物體的座標(比如牆壁、沙發、天花板、吊燈等),需要用某種策略篩選人體座標點,然後找出的最高點才能作爲頭頂座標。