張 勇,郭 琳
(1.西南石油大學(xué),四川 成都 610000;2.四川職業(yè)技術(shù)學(xué)院,四川 遂寧 629000)
在遠(yuǎn)程視頻監(jiān)控中,視頻快速捕捉與傳輸技術(shù)是決定其性能關(guān)鍵點(diǎn)之一[1],而隨著計(jì)算機(jī)功能的不斷強(qiáng)大,多媒體技術(shù)特別是數(shù)字圖像技術(shù)的不斷發(fā)展,為只依靠軟件技術(shù)快速抓取計(jì)算機(jī)屏幕的監(jiān)控畫面,并將其轉(zhuǎn)化成可供傳輸與預(yù)覽的視頻流資源提供了可能。
目前在遠(yuǎn)程實(shí)時(shí)視頻監(jiān)控軟件系統(tǒng)中,獲取屏幕圖像的方法主要有兩種:創(chuàng)建屏幕設(shè)備描述表(Device Context,DC)方法[2]以及 DirectX 中的 DirectShow 方法[3],兩種方法各自具有優(yōu)缺點(diǎn)。屏幕DC方法技術(shù)實(shí)現(xiàn)比較直接,對(duì)應(yīng)用環(huán)境沒有特殊要求,但是截圖速率低,越來越難以滿足實(shí)時(shí)性視頻監(jiān)控的需求。DirectShow方法截圖速率高,但是需要DirectX庫支持,在實(shí)現(xiàn)上相對(duì)于直接Windows設(shè)備上下文編程顯得繁雜,為程序開發(fā)和應(yīng)用帶來不便。在遠(yuǎn)程視頻監(jiān)控系統(tǒng)的工程實(shí)踐中,為降低傳輸負(fù)載,在發(fā)送圖像文件時(shí),后端硬件會(huì)進(jìn)行取高位處理,例如實(shí)現(xiàn)24位色到16位色轉(zhuǎn)換時(shí),分別對(duì)R,G,B取高位,由 R8∶G8∶B8 轉(zhuǎn)變成 R5∶G6∶B5,其優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單,能保證系統(tǒng)傳輸?shù)膶?shí)時(shí)性需求,缺點(diǎn)是處理后的圖像會(huì)出現(xiàn)顏線、圖像輪廓模糊等問題,從而圖像效果出現(xiàn)嚴(yán)重失真。
筆者的研究主要是在屏幕DC截圖的基礎(chǔ)上,利用內(nèi)存映射文件技術(shù)MVF(Map View of File),將圖像文件映射到虛擬內(nèi)存的一塊地址空間,在訪問文件時(shí)像訪問內(nèi)存文件一樣,避免了不必要的I/O操作,加快采集速度,較好地解決了屏幕DC截圖速度慢的缺點(diǎn)。又根據(jù)降低網(wǎng)絡(luò)傳輸負(fù)載的需求,對(duì)所采集到的圖像在統(tǒng)一量化算法初步處理的基礎(chǔ)上建立簡(jiǎn)化的八叉樹,對(duì)像素點(diǎn)進(jìn)行裁剪,既降低圖像傳輸數(shù)據(jù)量,又保證圖像成像效果,有效提升遠(yuǎn)程實(shí)時(shí)視頻監(jiān)控軟件系統(tǒng)的工作性能。
WIN32 API提供了實(shí)施文件操作的便捷渠道,也就是內(nèi)存映射文件。在這里,其準(zhǔn)許能夠在WIN32進(jìn)程的虛擬空間里面留有一定的空間,同時(shí)能夠把物理存儲(chǔ)器里面的目標(biāo)文件向這一個(gè)空間進(jìn)行提交,從而能夠與該虛擬空間進(jìn)行映射。這樣就能夠通過存取內(nèi)存數(shù)據(jù)的手段對(duì)文件里面的數(shù)據(jù)進(jìn)行直接操作,就像將它們置于內(nèi)存里面,在很大程度上使得訪問文件得以簡(jiǎn)化,同時(shí)能夠使若干進(jìn)程共享數(shù)據(jù)得以實(shí)現(xiàn)。因此,引入內(nèi)存映射文件能夠在很大程度上使程序效率得以提升[4]。
對(duì)于遠(yuǎn)程視頻監(jiān)控軟件系統(tǒng)來說,其主要是在計(jì)算機(jī)上運(yùn)行的,是利用軟件手段把那些監(jiān)控圖像在播放的過程中進(jìn)行截取。由于所截取的為整個(gè)視頻信息,因此在這里要求抓取速率一定要保持在24幀/s(f/s)以上,這是由于人可以接受的連續(xù)畫面速度一般是24 f/s以上,要是比該速度小,人眼會(huì)觀察到一定的阻滯現(xiàn)象,這也是筆者優(yōu)化讀寫屏速率的其中一個(gè)關(guān)鍵需求。另一方面,考慮到系統(tǒng)實(shí)時(shí)處理模式下網(wǎng)絡(luò)負(fù)載水平,在對(duì)圖像進(jìn)行抓取的過程中,可以按照視頻的刷新率的具體情況,科學(xué)合理地對(duì)截圖速率進(jìn)行設(shè)置,從而能夠有效控制一定時(shí)間內(nèi)圖像抓取的數(shù)據(jù)量。該操作流程示意圖如圖1所示。
圖1 優(yōu)化后的屏幕DC讀寫屏工作流程原理圖
將CreateDIBSection()引入傳統(tǒng)的屏幕DC截圖法里面,利用該函數(shù)能夠構(gòu)建起存儲(chǔ)DIB位的內(nèi)存,能夠進(jìn)行GDI操作。在很大程度上降低了成本,縮短了讀屏消耗時(shí)間。對(duì)于CreateFileMapping()來說,其主要是負(fù)責(zé)在文件映射內(nèi)核對(duì)象構(gòu)建過程中進(jìn)行使用,所以在具體使用過程中一般將文件創(chuàng)建成內(nèi)存映射對(duì)象。
對(duì)于MapViewofFile()來說,其主要是負(fù)責(zé)將文件里面的數(shù)據(jù)信息向進(jìn)程的地址空間里面進(jìn)行映射,而對(duì)于UnmapViewOfFile()來說,其主要是負(fù)責(zé)將文件內(nèi)存映射解除,然后系統(tǒng)把內(nèi)存里面的數(shù)據(jù)向磁盤進(jìn)行回寫。完成上述的操作之后,接著利用CloseHandle()將映射文件關(guān)閉,從而將所使用到的內(nèi)存得到釋放[5]。
在監(jiān)控網(wǎng)絡(luò)通信能力一定的基礎(chǔ)上,各像素點(diǎn)的顏色數(shù)據(jù)量愈小,網(wǎng)絡(luò)負(fù)載壓力就愈低,從而能夠在很大程度上改善系統(tǒng)的有效性,例如,在顏色量化重建過程中,為使圖像最大限度的和原始圖像相接近,筆者在這里主要是通過八叉樹算法進(jìn)行[6],接下來將對(duì)基于八叉樹顏色量化改進(jìn)算法設(shè)計(jì)和實(shí)現(xiàn)進(jìn)行闡明。
在上面闡述的采集屏幕圖像過程中,主要得到的是RGB信號(hào),然而要是在基于LUV的色彩空間上進(jìn)行量化,就可以獲得非常不錯(cuò)的視覺體驗(yàn)。但鑒于要在LUV空間里面實(shí)施轉(zhuǎn)換,必須要以非線性運(yùn)算方式實(shí)現(xiàn),這個(gè)過程中需要相對(duì)較多的系統(tǒng)資源,因此,為充分保證算法具有較高的效率,可以通過RGB顏色空間實(shí)現(xiàn)顏色量化。
八叉樹構(gòu)建過程中,筆者通過升級(jí)的八叉樹的存儲(chǔ)結(jié)構(gòu)進(jìn)行[7],具體見圖2,各節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)里面。
圖2 簡(jiǎn)易八叉樹數(shù)據(jù)結(jié)構(gòu)(截圖)
主要涉及到兩個(gè)指針,它們分別指向父節(jié)點(diǎn)與8個(gè)子節(jié)點(diǎn)向量,同時(shí)涉及到這一個(gè)節(jié)點(diǎn)對(duì)應(yīng)的顏色、出現(xiàn)的次數(shù)等幾個(gè)方面的內(nèi)容。并且具備3個(gè)成員函數(shù),它們依次是在判斷這一個(gè)節(jié)點(diǎn)是不是葉子節(jié)點(diǎn)的過程中進(jìn)行使用;判斷這一個(gè)節(jié)點(diǎn)是不是倒數(shù)第二層的節(jié)點(diǎn)過程中進(jìn)行使用;將子節(jié)點(diǎn)的R,G,B的顏色值及其顏色出現(xiàn)次數(shù)向父節(jié)點(diǎn)進(jìn)行累加的過程中使用。該結(jié)構(gòu)能夠在很大程度上使空間與操作效率相互間的關(guān)系得到平衡,可以在內(nèi)存空間相對(duì)較小、實(shí)時(shí)性要求相對(duì)偏高的視頻監(jiān)控系統(tǒng)里使用。
在RGB顏色空間對(duì)八叉樹進(jìn)行構(gòu)建,該環(huán)節(jié)主要涉及到以下幾方面:
1)利用統(tǒng)一量化法進(jìn)行操作,也就是把R8∶G8∶B8直接取高位,使其成為12位的R4∶G4∶B4,所得到的12位顏色信息當(dāng)作八叉樹中節(jié)點(diǎn)的坐標(biāo)值,在這里RGB數(shù)據(jù)從大到小依次與八叉樹里面的淺層以及深層級(jí)節(jié)點(diǎn)相對(duì)應(yīng),這樣多次操作,就能夠充分保證獲得的4層八叉樹。
2)將八叉樹節(jié)點(diǎn)的坐標(biāo)信息確定下來之后,接著自根節(jié)點(diǎn)開始沿著縱向?qū)Π瞬鏄溥M(jìn)行遍歷。要是遍歷的坐標(biāo)里面沒有八叉樹的節(jié)點(diǎn),在這種情況下,就能夠?qū)⑦@一個(gè)八叉樹節(jié)點(diǎn)生成,否則接著將低于RGB 1位的組合當(dāng)作節(jié)點(diǎn)坐標(biāo),直至訪問到八叉樹的葉節(jié)點(diǎn)為止。需要對(duì)八叉樹里面具有的顏色數(shù)進(jìn)行統(tǒng)計(jì),并且還需要將這一個(gè)節(jié)點(diǎn)的顏色出現(xiàn)次數(shù)、RGB值向節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)的字段里面進(jìn)行累加。
圖像里面各像素都進(jìn)行上面的兩個(gè)流程,一直到其里面的各像素都和八叉樹里面的葉節(jié)點(diǎn)相互對(duì)應(yīng)為止,這樣就構(gòu)建起八叉樹(見圖3)。
圖3 構(gòu)建的4層八叉樹簡(jiǎn)易結(jié)構(gòu)圖
在裁減過程中,主要是通過下面的兩個(gè)條件取舍深度一樣的節(jié)點(diǎn),也就是最少或最多像素的節(jié)點(diǎn)。對(duì)于前者來說,其能夠最大限度地降低圖像的誤差,然而在對(duì)圖像細(xì)節(jié)方面的支持不足;對(duì)于后者來說,其能夠在相對(duì)較大的光滑范圍里面形成帶狀效應(yīng),然而能夠有效地保持圖像里面的細(xì)節(jié),從而實(shí)現(xiàn)反走樣的效果[8]。在遠(yuǎn)程監(jiān)控過程中,圖像的層次感與輪廓在很大程度上決定著圖像的視覺效果,應(yīng)該最大限度地降低圖像的誤差,所以,在對(duì)深度一樣的節(jié)點(diǎn)進(jìn)行裁減的過程中,筆者主要是通過將最小像素的節(jié)點(diǎn)刪去,以誤差擴(kuò)散的方式保證圖像細(xì)節(jié)。
八叉樹裁減主要是以其顏色數(shù)是不是比256色高當(dāng)作裁減結(jié)束的標(biāo)準(zhǔn)。當(dāng)比256色高的時(shí)候,就從最小像素點(diǎn)的節(jié)點(diǎn)位置進(jìn)行裁減,直至顏色數(shù)在249~256區(qū)域內(nèi)為止,這樣才可以與調(diào)色表的設(shè)計(jì)要求相符合。
裁減的時(shí)候應(yīng)該首先看第三層的節(jié)點(diǎn)數(shù)是不是比256高,要是比256高,就應(yīng)該將4層的全部葉節(jié)點(diǎn)向其父節(jié)點(diǎn)里面進(jìn)行合并,同時(shí)還應(yīng)該適當(dāng)?shù)牟脺p。接著開展從下到上的裁減操作。在這里主要是將顏色次數(shù)出現(xiàn)最小的最底層父節(jié)點(diǎn)的子節(jié)點(diǎn)刪除[9],一直至滿足上述條件為止。具體通過下面的操作流程進(jìn)行:
1)第一步,從根節(jié)點(diǎn)處對(duì)八叉樹進(jìn)行遍歷,得到最底層的父節(jié)點(diǎn);
2)第二步,將該種節(jié)點(diǎn)向一個(gè)鏈表里面進(jìn)行存儲(chǔ),同時(shí)根據(jù)節(jié)點(diǎn)的顏色數(shù)從高到低進(jìn)行邏輯排序;
3)第三步,將該種節(jié)點(diǎn)子節(jié)點(diǎn)的顏色數(shù)與RGB的對(duì)應(yīng)的值進(jìn)行累加;
4)第四步,這種情況下,鏈表尾部為顏色出現(xiàn)最少的最底層的父節(jié)點(diǎn),然后將該類父節(jié)點(diǎn)的全部子節(jié)點(diǎn)都刪除,這樣該類父節(jié)點(diǎn)就成為葉節(jié)點(diǎn),其父節(jié)點(diǎn)則變?yōu)榈讓拥母腹?jié)點(diǎn),多次進(jìn)行這幾個(gè)步驟,一直到八叉樹的顏色數(shù)比257小,才結(jié)束操作。
裁減之后會(huì)在一定程度上產(chǎn)生圖像層次感不足、輪廓明顯等諸多問題,為有效處理這些問題,筆者同時(shí)在顏色量化處理的前提條件下配置相應(yīng)的負(fù)反饋系統(tǒng),在這里主要是利用Floy-Steinberg誤差擴(kuò)散算法進(jìn)行,根據(jù)適當(dāng)?shù)谋壤龑⑾袼氐牧炕`差向鄰接像素進(jìn)行擴(kuò)散,從而使其有所補(bǔ)償。該算法具有諸多優(yōu)勢(shì),例如處理及時(shí)、運(yùn)算簡(jiǎn)單等,因此在實(shí)時(shí)性的遠(yuǎn)程實(shí)時(shí)監(jiān)控系統(tǒng)里面具有較高的適用性。
為了測(cè)試優(yōu)化后屏幕DC法的截圖效率,在同一軟硬環(huán)境下,利用設(shè)計(jì)的屏幕圖像采集。軟件工作基本流程如圖4所示。
截取正在播放的Flash文件的連續(xù)的監(jiān)控畫面,并通過軟件合成。用AVI格式的視頻流檢測(cè)所采集到的畫面的連續(xù)性。軟件做了4次捕捉實(shí)驗(yàn),每次捕捉的尺寸不同,每次連續(xù)捕捉1000幀,捕捉1幀所需要的平均時(shí)間見表1。
如表1所示,可以清晰地比較出屏幕DC和優(yōu)化屏幕DC二種截圖法的效率。在傳統(tǒng)DC屏幕截圖法中,即使是在尺寸比較小的時(shí)候(例如200×200),抓取每一幀的時(shí)間是0.0625 s,也就是說1 s抓取16幀,其效率仍沒有滿足24幀/s(f/s)。結(jié)合文件內(nèi)存映射技術(shù)后的屏幕DC法,截取尺寸在330×240以內(nèi)時(shí),基本上可以做到每秒鐘抓取24幀以上,所以在一定的條件下,用基于MVF改進(jìn)的屏幕DC截取法可以抓取監(jiān)控屏幕中連續(xù)播放的視頻圖像,這樣就完全可以滿足監(jiān)控畫面的實(shí)時(shí)連續(xù)播放的需求。
圖4 屏幕圖像采集軟件工作基本流程(截圖)
表1 實(shí)驗(yàn)測(cè)試視頻幀抓取時(shí)間表
同時(shí)為了檢驗(yàn)對(duì)所截取的監(jiān)控圖像的量化效果,特別是檢驗(yàn)圖像經(jīng)過顏色量化以后在層次感、顆粒感與輪廓變化上給人的視覺感受,筆者選擇如圖5a所示的原圖進(jìn)行靜態(tài)圖像實(shí)驗(yàn),分別對(duì)原圖做了統(tǒng)一量化處理、改進(jìn)后的八叉樹裁減處理、最后誤差擴(kuò)散處理,由圖5可知改進(jìn)的八叉樹算法在顏色的數(shù)據(jù)量減為原來的1/3的情況下,能夠有效減少在顏色漸變區(qū)域存在的帶狀現(xiàn)象,顏色更有層次感,在經(jīng)過Floyd-Steinberg誤差擴(kuò)散處理后,圖像增加了顆粒感,同時(shí)帶狀現(xiàn)象也進(jìn)一步弱化,從而進(jìn)一步提高視覺效果。
圖5 顏色量化算法效果實(shí)現(xiàn)對(duì)比圖
筆者針對(duì)傳統(tǒng)屏幕DC法在采集圖像上速率的不足,結(jié)合內(nèi)存映射文件法設(shè)計(jì)了在技術(shù)上實(shí)現(xiàn)較為直接,能夠適應(yīng)各種視頻源文件,應(yīng)用于遠(yuǎn)程視頻監(jiān)控屏幕資源采集的技術(shù)方案。同時(shí)通過對(duì)原始八叉樹算法時(shí)效性的改進(jìn),再配以改進(jìn)的Floyd-Steinberg誤差擴(kuò)散處理技術(shù)改善了對(duì)采集的屏幕圖像顏色量化降低顏色數(shù)據(jù)量時(shí)所產(chǎn)生的帶狀現(xiàn)象、顏色失真等問題。但是筆者設(shè)計(jì)的方案所對(duì)應(yīng)的軟件系統(tǒng)目前的工作平臺(tái)是Windows系統(tǒng),因其不是實(shí)時(shí)操作系統(tǒng),所以軟件在實(shí)時(shí)抓取連續(xù)播放視頻圖像時(shí),每秒鐘實(shí)際的截取幀數(shù)可能會(huì)小于設(shè)置的幀數(shù),所以可以考慮將本文所設(shè)計(jì)方法移植到實(shí)時(shí)的操作系統(tǒng)上(例如VxWorks),從根本上解決軟件系統(tǒng)運(yùn)行速度的可靠性瓶頸問題。另外筆者是通過對(duì)所采集的圖像進(jìn)行量化處理,降低圖像顏色的數(shù)據(jù)量來降低實(shí)時(shí)監(jiān)控系統(tǒng)的網(wǎng)絡(luò)負(fù)載,對(duì)通信網(wǎng)絡(luò)的數(shù)據(jù)吞吐量的提高沒有實(shí)際的幫助,所以也可以通過簡(jiǎn)化底層通信機(jī)制,盡可能避免為提高網(wǎng)絡(luò)可靠性所進(jìn)行的冗余處理,優(yōu)化網(wǎng)絡(luò)通信的協(xié)議棧等方式增大系統(tǒng)的負(fù)載規(guī)模。
[1]鄭世寶.智能視頻監(jiān)控技術(shù)與應(yīng)用[J].電視技術(shù),2009,33(1):94-96.
[2]胡春安,歐陽城添.Windows編程中的圖像輸出[J].浙江工業(yè)大學(xué)學(xué)報(bào),2006,34(5):546-549.
[3]張立榮,石峰.基于DirectShow的遠(yuǎn)程視頻監(jiān)控系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].電視技術(shù),2005,29(3):91-93.
[4]徐世波,郭愛菁.基于大型圖片的文件讀取方法的研究與探討[J].計(jì)算機(jī)應(yīng)用與軟件,2009,26(6):126-140.
[5]李小根,王宗敏,黃志全.基于內(nèi)存映射文件技術(shù)快速繪制大場(chǎng)景流域模型[J].計(jì)算機(jī)應(yīng)用與研究,2009,26(2):527-528.
[6]廖峨眉,胡建平.基于八叉樹顏色量化的OpenGL實(shí)現(xiàn)[J].信息技術(shù),2010(5):165-167.
[7]呂廣憲,潘懋,宋揚(yáng),等.基于多級(jí)線性結(jié)構(gòu)和規(guī)則分塊的虛擬八叉樹[J].計(jì)算機(jī)工程,2007,33(23):3-5.
[8]KANG H C,KAI T W,CHIN C C,et al.Exploiting hardware accelerated occlusion queries for visibility culling[J].IEICET Transactions on Fundamentals,2005(7):2007-2014.
[9]GUO Baolong,F(xiàn)U Xiang.A modified octree color quantization algorithm[EB/OL].[2013-02-25].http://www.researchgate.net/publication/224695366_A_Modified_Octree_Color_Quantization_Algorithm.