怎么玩穿越?從樓梯上摔下?被車撞?被雷電劈?太危險鳥!最新穿越方式:一台 Kinect 即可。
去年上半年開發了一個Kinect項目,這是一個類似於虛擬演播室的項目,它使用 Kinect 實時捕捉圖像,將人物摳出來,然后與圖像、其它視頻或其它程序里的內容實時合成。
過完年了,與對方約定的保密期也過去了,且撰文總結一下,談談開發這個項目過程中的體會。
先上圖,去年夏天拍的。
在這張圖的電腦屏幕上有一個睿智的中年大叔,哦……這不是我,這是魔獸世界里大名鼎鼎的青銅龍王諾茲多姆。走在最前方那個讓諾茲多姆仰望、讓戰五渣側目、讓綠龍女王害羞、讓紅龍女王情不自禁、把薩爾氣得跳了大漩渦的英俊瀟灑的人類大帥哥才是我。
好一副穿越的場景。這個場景怎么來的呢?
主角就是Kinect。具體步驟為:
(1)人物站在房間中做動作;
(2)Kinect 找到人物的景深圖和彩圖,配准后,將人物摳出來;
(3)對摳出來的圖進行處理,讓它變得穩定平滑;
(4)后台解碼待合成的視頻,將摳圖與視頻進行圖像融合,然后一幀、一幀的在屏幕上顯示;
(5)這個照片是手中拿的IPad實時拍下來的。
來段新錄制的視頻(由於是一邊跑程序一邊錄制的,看起來比較卡。實際情況比這流暢,大概能到每秒10幀。我的顯卡比較爛,換好顯卡更流暢):
(薩爾你這么苦大仇深的看着我干啥?)
項目總結:
(1)Kinect 的景深圖非常的不穩定。如何讓它穩定的貼合人體的邊緣是個非常困難的事情。雖然做了一定的工作,效果只能說是可接受,而並不完美。
(2)摳出來的圖不能直接貼上去,而要使用圖像融合技術讓邊緣過度盡量自然。常見的圖像融合方法有拉普拉斯融合和泊松融合。這里借 XXX Tech 博客里的的一張圖來說明,直接貼圖、泊松融合和拉普拉斯融合的對比。
為性能起見,我采用的是拉普拉斯融合。泊松融合太復雜了,直接放棄。后來又發現了更好的高性能算法,鑒於當時效果對方已經滿意了,就沒具體實現。
(3)性能!性能!
整個項目一大半時間在優化性能。因為要實時視頻解碼,要實時從Kinect處拿到彩色圖片和景深圖片,實時配准,實時穩定邊緣,實時圖像融合,以上操作最少要達到每秒十幾幀,因此需要極度的壓榨性能。壓榨到什么程度呢?壓榨到CPU和圖像尺寸近似的情況下,我用C#寫的拉普拉斯混合性能是別人論文中VC版本性能的幾十倍(不是說C#比VC快,優化的是拉普拉斯混合算法本身),以至於只用C#單線程就實現了640×480大小的拉普拉斯混合。后來,對方要做1280×960分辨率的,C#歇菜了,直接上了CUDA。
Kinect感想:
(1)Kinect為我們提供了一個非常經濟的獲得景深圖、骨骼圖的設備;
(2)除了游戲外,使用這套設備我們可以做很多事情,比如,能自動跟蹤垃圾的垃圾桶,試衣服,以及本文講的這個可用於虛擬演播室。
發揮想象力吧,想象你K歌的時候,Kinect把你融合進大屏幕中,就像你本人在舞台上一樣,這種震撼和體驗。
想象輕易的穿越進各種各樣的視頻之中,想象可以輕松的拍攝各種場景照片 ……
Kinect 為我們打開了第一步,也僅僅只是第一步,要用它做些事情,只會Kinect SDK的話走不遠。
以Kinect試衣服為例子。
從上面這圖,可以看到它采用的只是單純貼圖技術,且貼的不緊。
為什么貼的不緊?
——沒准確找到人物的輪廓。
為什么沒有准確找到人物的輪廓?
——Kinect的景深圖不穩定。
怎么能找到准確的輪廓?
——這就復雜了。我預感需要三個一起用上才行:Kinect自帶的景深圖,自然摳圖技術和前景/背景建模。三個用上后估計能夠得到准確的人物輪廓。
找到准確的輪廓后可以做什么?
——可以換背景,換場景。
這是錦上添花。
——那么,或許可以結合計算機動畫和圖像變形技術,做關節動畫,這樣你做動作,服裝也會跟着你做動作,尤其是有袖子的服裝。
只會Kinect,上面這些都做不了。要用Kinect開發現實應用,重點在Kinect之外。