天天看點

Kinect 開發小記:穿越艾澤拉斯,調戲紅龍女王

怎麼玩穿越?從樓梯上摔下?被車撞?被雷電劈?太危險鳥!最新穿越方式:一台 Kinect 即可。

去年上半年開發了一個Kinect項目,這是一個類似于虛拟演播室的項目,它使用 Kinect 實時捕捉圖像,将人物摳出來,然後與圖像、其它視訊或其它程式裡的内容實時合成。

過完年了,與對方約定的保密期也過去了,且撰文總結一下,談談開發這個項目過程中的體會。

先上圖,去年夏天拍的。

Kinect 開發小記:穿越艾澤拉斯,調戲紅龍女王

在這張圖的電腦螢幕上有一個睿智的中年大叔,哦……這不是我,這是魔獸世界裡大名鼎鼎的青銅龍王諾茲多姆。走在最前方那個讓諾茲多姆仰望、讓戰五渣側目、讓綠龍女王害羞、讓紅龍女王情不自禁、把薩爾氣得跳了大漩渦的英俊潇灑的人類大帥哥才是我。

好一副穿越的場景。這個場景怎麼來的呢?

主角就是Kinect。具體步驟為:

(1)人物站在房間中做動作;

(2)Kinect 找到人物的景深圖和彩圖,配準後,将人物摳出來;

(3)對摳出來的圖進行處理,讓它變得穩定平滑;

(4)背景解碼待合成的視訊,将摳圖與視訊進行圖像融合,然後一幀、一幀的在螢幕上顯示;

(5)這個照片是手中拿的IPad實時拍下來的。

來段新錄制的視訊(由于是一邊跑程式一邊錄制的,看起來比較卡。實際情況比這流暢,大概能到每秒10幀。我的顯示卡比較爛,換好顯示卡更流暢):

(薩爾你這麼苦大仇深的看着我幹啥?)

項目總結:

(1)Kinect 的景深圖非常的不穩定。如何讓它穩定的貼合人體的邊緣是個非常困難的事情。雖然做了一定的工作,效果隻能說是可接受,而并不完美。

(2)摳出來的圖不能直接貼上去,而要使用圖像融合技術讓邊緣過度盡量自然。常見的圖像融合方法有拉普拉斯融合和泊松融合。這裡借 XXX Tech​ 部落格裡的的一張圖來說明,直接貼圖、泊松融合和拉普拉斯融合的對比。

Kinect 開發小記:穿越艾澤拉斯,調戲紅龍女王

為性能起見,我采用的是拉普拉斯融合。泊松融合太複雜了,直接放棄。後來又發現了更好的高性能算法,鑒于當時效果對方已經滿意了,就沒具體實作。

(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開發現實應用,重點在Kinect之外。