許嘉琳 朱耀麟 武桐
摘 要:針對虛擬場景中實時視頻顯示過程中設(shè)計流程復雜,代碼多,畫面不暢等問題,提出了基于Kinect攝像頭的實時視頻添加方法。該方法以Billboard技術(shù)為基礎(chǔ),利用Kinect對現(xiàn)實場景進行彩色數(shù)據(jù)和深度數(shù)據(jù)捕捉,并在虛擬場景中進行實時渲染和顯示,最終實現(xiàn)實時視頻子窗口的添加工作。整個程序設(shè)計流程簡單,渲染效果畫面流暢。
關(guān)鍵詞:虛擬場景;實時視頻顯示;Kinect;摳圖
中圖分類號:TP391.41 文獻標識碼:A
Abstract:For the problems of complex design process,more codes, not smooth screen.The method that used Kinect camera to add the child window of real-time video is proposed.This method based on billboard,used Kinect to capture color datas and depth datas,then displayed and rendered datas in virtual scene,and achieved the work of live video sub-window finally.The whole process designed simple.The entire virtual scene was smooth and more realistic.It makes the foundation of the application about the natural matting in virtual scene.
Keywords:virtual scene;real-time video displayed;Kinect;matting
1 引言(Introduction)
虛擬場景漫游技術(shù)的產(chǎn)生和發(fā)展,通過其對古遺址和古文物的展示,既滿足了人們對古遺址和古文物了解的需求,也解決了古遺址和已破損的文物難以展示的難題,并對已有遺址文物起到了保護作用。目前,有很多人對虛擬場景漫游技術(shù)進行了研究[1-3]。文獻[1]介紹了虛擬現(xiàn)實技術(shù)在古建筑復原和數(shù)字化博物館等建筑中的應(yīng)用,文獻[2,3]介紹了基于OpenGL的虛擬場景漫游系統(tǒng)的一些創(chuàng)建方法。然而,以上系統(tǒng)以計算機屏幕作為觀察虛擬場景的窗口,沉浸感較弱。本文以Kinect攝像頭為硬件基礎(chǔ)進行彩色數(shù)據(jù)捕捉,在實現(xiàn)大型復雜虛擬場景的創(chuàng)建和顯示過程中,添加實時視頻子窗口,將包含人物的現(xiàn)實場景在虛擬場景中流暢的顯示出來,使人們在虛擬場景中有身臨其境的感覺,增加了系統(tǒng)的沉浸感。另外,利用Kinect攝像頭進行包含人物的深度數(shù)據(jù)采集,實現(xiàn)自然摳圖,為自然摳圖在基于OpenGL的虛擬場景中的應(yīng)用提供了基礎(chǔ)。
本文第一部分主要介紹了Kinect進行數(shù)據(jù)捕捉及對捕捉到的數(shù)據(jù)進行相關(guān)處理的過程,第二部分主要介紹了基于Kinect的虛擬場景中的實時視頻顯示原理及編程流程和主要調(diào)用函數(shù)源代碼,最后對本文內(nèi)容進行了總結(jié)。
2 基于Kinect的數(shù)據(jù)流捕捉(Data stream capture
based on Kinect)
隨著Kinect for Windows的推出,與其相關(guān)的開發(fā)和研究越來越多,應(yīng)用逐漸廣泛。Kinect主要包括彩色攝像頭,紅外發(fā)射攝像頭和紅外接收攝像頭。如圖1所示為Kinect進行捕捉的主框架。Kinect進行數(shù)據(jù)流捕捉后傳入電腦,由配置了Kinect SDK和OpenNI的VS2010平臺對數(shù)據(jù)流進行相關(guān)處理操作,最終得到做需要的信息并進行信息的處理應(yīng)用。
其中,彩色數(shù)據(jù)流系統(tǒng)提供兩種格式,包括32位RGB格式和16位YUV格式,本文主要采用16為YUV格式,即分辨率為640×480。當Kinect連接到計算機,為保證30FPS的數(shù)據(jù)幀率,將捕捉得到1280×1024分辨率的彩色數(shù)據(jù)流壓縮轉(zhuǎn)換成RGB格式后通過數(shù)據(jù)線傳遞,并在應(yīng)用前解壓數(shù)據(jù)得到所需要的格式的數(shù)據(jù)。
本文采用Kinect for Windows SDK開發(fā)包中的NuiInitialize(DWORD dwFlags)函數(shù)對Kinect進行初始化。在初始化過程中,首先處理彩色數(shù)據(jù)流和深度數(shù)據(jù)流,然后處理用戶索引信息并根據(jù)用戶索引值將顏色信息追加到深度數(shù)據(jù)圖中,最后處理骨骼數(shù)據(jù)流,得到骨骼跟蹤信息。NuiImageStreamOpen()函數(shù)用于打開對NUI設(shè)備的訪問通道,使Kinect可以接受彩色數(shù)據(jù)流,深度數(shù)據(jù)流和骨骼數(shù)據(jù)流,并設(shè)置圖像分辨率。然后調(diào)用NuiImageStreamGetNextFrame()函數(shù)讀取彩色數(shù)據(jù)信息和深度數(shù)據(jù)信息。采用LockRect函數(shù)對Kinect捕捉到的紋理里進行鎖定,進而對紋理表面的任意像素點進行讀寫操作,即可以繪制出任意一個像素。Kinect捕捉到的數(shù)據(jù)流組成一個一個幀,幀序列形成視頻影像,為不斷得到新的視頻信息,我們通過NuiImageStreamGetNextFrame函數(shù)進行幀提取操作,最終得到相關(guān)數(shù)據(jù)流信息。如圖2和圖3分別為Kinect的彩色數(shù)據(jù)效果圖和深度數(shù)據(jù)效果圖。
3 基于Kinect的實時視頻顯示(Real-time video display based on Kinect)
本文采用Billboard技術(shù)實現(xiàn)實時視頻顯示,即實現(xiàn)實時視頻子窗口的創(chuàng)建。主要方法是將Kinect捕捉到的實時視頻作為紋理貼圖貼在OpenGL繪制的多邊形上,該多邊形的法向量始終與漫游時的視線方向平行,是視頻貼圖隨視角的變化而變化,進而得到視頻子窗口,節(jié)省了內(nèi)存空間,提高了場景渲染的效率。在整個過程中,以glTexSubImage2D()函數(shù)不斷刷新貼圖使貼圖動態(tài)化,以GL_QUADS模式進行多邊形的繪制工作,具體實現(xiàn)流程圖如圖4所示。
實時視頻子窗口渲染過程中針對因窗口尺寸參數(shù)問題而出現(xiàn)的馬賽克現(xiàn)象(圖5),本文定義窗口初始尺寸代碼為:#define width 640 #define height 480。針對窗口尺寸變化操作,采用倍數(shù)的方法實現(xiàn)。最終添加視頻效果圖如圖6所示。
4 結(jié)論(Conclusion)
本文通過Kinect攝像頭對現(xiàn)實場景進行彩色數(shù)據(jù)捕捉,并將捕捉到的實時視頻添加到場景漫游系統(tǒng)中,最終實現(xiàn)了實時視頻子窗口的添加工作,大大提高了虛擬場景的沉浸感。
參考文獻(References)
[1] 周巍.談虛擬現(xiàn)實技術(shù)在建筑設(shè)計中的應(yīng)用[J].科技向?qū)В?013(23):367.
[2] 龐中磊.基于OpenGL的三維場景可視化研究及實現(xiàn)[D].天津師范大學:2011.
[3] 廖毅.3DS MAX建模技術(shù)在虛擬現(xiàn)實場景中的應(yīng)用[J].中國科教創(chuàng)新導刊,2011(18):113.
[4] Andreas Kolb,Erhardt Barth,Reinhard Koch,Rasmus Lar-sen.Time-of-Flight Cameras in Computer Graphic[J].Computer Graphics Forum,2010,29(01):141-159.
作者簡介:
許嘉琳(1988-),女,碩士生.研究領(lǐng)域:虛擬現(xiàn)實.
朱耀麟(1977-),男,博士,副教授.研究領(lǐng)域:數(shù)字媒體及三維可視化技術(shù).
武 桐(1982-),女,碩士,講師.研究領(lǐng)域:虛擬場景建模與實現(xiàn).