楊云龍,孟利民(.浙江工業(yè)大學(xué) 信息工程學(xué)院,浙江 杭州 3003;.浙江省通信網(wǎng)技術(shù)應(yīng)用研究重點實驗室,浙江 杭州 3003)
移動監(jiān)控系統(tǒng)中設(shè)備端視頻軟件的設(shè)計與實現(xiàn)
楊云龍1,孟利民2
(1.浙江工業(yè)大學(xué) 信息工程學(xué)院,浙江 杭州 310023;2.浙江省通信網(wǎng)技術(shù)應(yīng)用研究重點實驗室,浙江 杭州 310023)
提出了一種移動視頻監(jiān)控系統(tǒng)中視頻數(shù)據(jù)處理軟件的設(shè)計方案。移動監(jiān)控系統(tǒng)主要由前端移動監(jiān)控設(shè)備、3G網(wǎng)絡(luò)、服務(wù)器、手機客戶端組成。給出了系統(tǒng)總體原理圖,主要分析了移動監(jiān)控系統(tǒng)中視頻數(shù)據(jù)的采集、去抖動處理、壓縮以及備份等設(shè)備端軟件設(shè)計部分。在去抖動的過程中使用了改進的灰度投影法,解決了傳統(tǒng)投影法中易受到移動前景干擾的問題。通過實際測試驗證了方案的可行性。
移動監(jiān)控系統(tǒng);3G網(wǎng)絡(luò);視頻處理;去抖動處理;灰度投影法
隨著計算機網(wǎng)絡(luò)技術(shù)的發(fā)展和應(yīng)用,安全防范產(chǎn)品的逐漸豐富,“安防大眾化”已是大勢所趨,安全是一種需求,安全對于人們來說已是必不可少的商品[1]。視頻監(jiān)控系統(tǒng)在安防行業(yè)中具有重要地位。視頻監(jiān)控系統(tǒng)的發(fā)展經(jīng)歷了由模擬到數(shù)字、由錄像人工檢查到狀態(tài)智能分析、由實地操作到遠程遙控的過程[2]。移動通信系統(tǒng)已經(jīng)開始更新?lián)Q代,中國3家不同運營商旗下基于不同標(biāo)準(zhǔn)的3G網(wǎng)絡(luò)也全面步入商用時代,同時隨著LTE(Long Term Evolution)技術(shù)的發(fā)展和4G標(biāo)準(zhǔn)化的來臨,基于新型系統(tǒng)的基礎(chǔ)網(wǎng)絡(luò)建設(shè)必將保持高速發(fā)展[3]。無線網(wǎng)絡(luò)的發(fā)展極大地促進了移動監(jiān)控系統(tǒng)的發(fā)展。移動監(jiān)控系統(tǒng)不僅能夠擴大監(jiān)控范圍,也能節(jié)約成本,甚至還能減少許多不必要的損失[4]。
移動監(jiān)控系統(tǒng)的前端設(shè)備在采集視頻數(shù)據(jù)的過程中難免會產(chǎn)生抖動,所以電子穩(wěn)像技術(shù)對移動監(jiān)控系統(tǒng)至關(guān)重要。目前的電子穩(wěn)像技術(shù)是利用電子設(shè)備和數(shù)字圖像處理技術(shù)相結(jié)合的方法,直接從像面上通過檢測被比較圖像與參考幀圖像的運動矢量,并對被比較圖像進行運動補償,從而獲得清晰穩(wěn)定的視頻圖像序列[5]。視頻穩(wěn)像中最重要的一步是運動估計,灰度投影法是一種比較常見的運動估計方法,它是利用圖像的整體信息進行運動估計,主要是利用相鄰兩幀圖像重合區(qū)域內(nèi)圖像信息分布相同的原理[6]。但是灰度投影法容易受到前景運動物體的影響。本文對灰度投影法進行了改進,有效地減緩了前景運動物體對運動估計的影響。
移動監(jiān)控系統(tǒng)主要由前端移動監(jiān)控設(shè)備、3G無線網(wǎng)絡(luò)、服務(wù)器以及手機客戶端組成。系統(tǒng)總體結(jié)構(gòu)圖如圖1所示。
圖1 移動監(jiān)控系統(tǒng)結(jié)構(gòu)圖
前端移動監(jiān)控設(shè)備采集視頻數(shù)據(jù)并經(jīng)過壓縮后發(fā)送給服務(wù)器,供服務(wù)器管理人員分析。服務(wù)器按客戶端的要求將視頻壓縮數(shù)據(jù)發(fā)送給客戶端查看。
前端設(shè)備視頻軟件主要負責(zé)對視頻數(shù)據(jù)的采集、去抖動、編碼以及存儲等工作。這些工作主要是由encode進程完成。encode進程包含了 Capture線程、Video線程和Write線程3個線程。
主線程首先創(chuàng)建4個同步對象,分別為hRendezvousCap、hRendezvousWriter、hRendezvousInit和hRendezvous Cleanup,然后創(chuàng)建Capture線程,Capture線程一旦創(chuàng)建完成,主線程就會馬上調(diào)用等待函數(shù)Rendezvous_meet(hRendezvousCap)函數(shù)進入等待狀態(tài)。Capture線程的流程如圖2所示。
圖2 Capture線程流程圖
Capture線程首先通過調(diào)用Capture_detectVideoStd()函數(shù)獲得視頻數(shù)據(jù)類型。然后再通過調(diào)用VideoStd_getResolution()函數(shù)得到將要采集的視頻數(shù)據(jù)的分辨率,并將該分辨率傳給主線程。再調(diào)用等待函數(shù)Rendezvous_meet(hRendezvousCap),這次調(diào)用等待函數(shù)時Capture線程并不會進入等待狀態(tài)而是將等待中的主線程喚醒。然后Capture線程會繼續(xù)調(diào)用Capture_create()函數(shù)創(chuàng)建視頻數(shù)據(jù)的采集對象。調(diào)用Resize_create()函數(shù)創(chuàng)建視頻數(shù)據(jù)的放縮對象。調(diào)用Framecopy_create()函數(shù)創(chuàng)建視頻數(shù)據(jù)的裁剪對象。Capture線程在完成了這些準(zhǔn)備工作后就會再次調(diào)用等待函數(shù)Rendezvous_meet(hRendezvousInit)等待其他線程到達預(yù)定的等待點。
主線程被Capture線程喚醒后會接著創(chuàng)建Video線程,并將視頻數(shù)據(jù)的分辨率參數(shù)傳給Video線程,然后調(diào)用Rendezvous_meet(hRendezvousWriter)等待函數(shù)進入等待狀態(tài)。Video線程的流程圖如圖3所示。
圖3 Video線程流程圖
Video線程首先通過調(diào)用Engine_open()函數(shù)開啟編碼引擎。然后將視頻分辨率參數(shù)傳給Venc1_create()函數(shù)來創(chuàng)建兩個編碼對象hVe1、hVe2。hVe1與hVe2分別用來將352×288YUV420SP與720×576YUV420SP兩種格式的視頻數(shù)據(jù)編碼成H.264格式。然后Video線程會調(diào)用Venc1_getOutBufSize()函數(shù)獲得編碼器輸出數(shù)據(jù)參數(shù),并傳給主線程。再調(diào)用等待函數(shù)Rendezvous_meet(hRendezvousWriter)喚醒主線程。當(dāng)Video線程完成上述準(zhǔn)備工作后就會調(diào)用等待函數(shù)Rendezvous_meet(hRendezvousInit)等待其他線程到達預(yù)定的等待點。
被喚醒的主線程還會繼續(xù)創(chuàng)建Write線程,并將Video線程的兩個編碼器的輸出參數(shù)outBufSize1、outBufSize2傳給Write線程。Write線程的流程圖如圖4所示。
圖4 Write線程流程圖
Write線程首先將參數(shù)outBufSize1與outBufSize2傳給BufTab_create()函數(shù)申請兩組緩存區(qū)。這兩組緩存區(qū)用于接收Video線程傳來的兩路H.264數(shù)據(jù)。然后Write線程會調(diào)用函數(shù)createShm()創(chuàng)建一塊共享內(nèi)存。這塊共享內(nèi)存用于存儲由352x288YUV420SP格式數(shù)據(jù)編碼而來的H.264數(shù)據(jù),供數(shù)據(jù)發(fā)送程序讀取。在完成了上述準(zhǔn)備工作后,Write線程會調(diào)用等待函數(shù)Rendezvous_meet(hRendezvousInit)進入等待狀態(tài)。
當(dāng)?shù)却瘮?shù)Rendezvous_meet(hRendezvousInit)被第三次調(diào)用時,第三次調(diào)用等待函數(shù)的線程并不會進入等待狀態(tài),而是喚醒前兩個正在等待的線程。
當(dāng)所有線程都被喚醒后就會同步進入主循環(huán)。Capture線程負責(zé)采集視頻數(shù)據(jù)和視頻穩(wěn)像,Video線程負責(zé)視頻數(shù)據(jù)編碼,Write線程負責(zé)數(shù)據(jù)存盤和將數(shù)據(jù)寫入共享內(nèi)存。
Capture線程首先采集一幀736x576UYVY格式的數(shù)據(jù),然后對視頻數(shù)據(jù)進行電子穩(wěn)像處理。得到穩(wěn)定的視頻數(shù)據(jù)后,通過調(diào)用Resize()函數(shù)改變穩(wěn)像后的視頻數(shù)據(jù)的分辨率和數(shù)據(jù)格式,并輸出兩路數(shù)據(jù),一路數(shù)據(jù)為352×288 YUV420SP格式,另一路數(shù)據(jù)為736×576YUV420SP格式。然后將352×288YUV420SP格式的視頻數(shù)直接傳給Video線程。將736×576YUV420SP格式的視頻先裁剪成720×576YUV420SP格式后再傳給Video線程。接著Capture線程判斷是否繼續(xù)采集下一幀視頻數(shù)據(jù),若是,則重復(fù)主循環(huán)中的內(nèi)容;若不是,則向其他線程發(fā)送結(jié)束信號并調(diào)用等待函數(shù)Rendezvous_meet(hRendezvousCleanup),等待其他線程一起進行清理工作。
Video線程在進入主循環(huán)后首先會將自己創(chuàng)建的兩組空buffer傳給Capture線程,用于Capture線程向Video線程傳輸數(shù)據(jù)。然后接收Capture線程傳來的兩路視頻數(shù)據(jù),并分別用編碼對象hVe1與hVe2將這兩路視頻數(shù)據(jù)編碼成H.264格式。然后接收Write線程傳過來的兩塊buffer,并將兩路H.264格式數(shù)據(jù)分別存儲于這兩塊buffer中,再通過FIFO_put()函數(shù)傳給Write線程。然后Video線程判斷是否繼續(xù)編碼工作,若是,則對下一幀數(shù)據(jù)重復(fù)主循環(huán)中的編碼工作;若不是,則向其他線程發(fā)送結(jié)束信號并調(diào)用等待函數(shù)Rendezvous_meet(hRendezvousCleanup),等待其他線程一起進行清理工作。
Write線程進入主循環(huán)后首先將兩塊空buffer傳給Video線程,用于Video線程向Write線程傳輸數(shù)據(jù)。然后接收Video線程傳來的兩路H.264數(shù)據(jù),第一路數(shù)據(jù)由352×288YUV420SP格式編碼而來,將該H.264數(shù)據(jù)寫到共享內(nèi)存中供發(fā)送程序發(fā)送給服務(wù)器;第二路數(shù)據(jù)由720×576YUV420SP格式編碼而來,將該數(shù)據(jù)寫到SD卡中用于備份,當(dāng)前幀處理結(jié)束。然后Write線程判斷是否繼續(xù)處理下幀數(shù)據(jù),若是,則重復(fù)主循環(huán)中的內(nèi)容;若不是,則向其他線程發(fā)送結(jié)束信號并調(diào)用等待函數(shù)Rendezvous_meet(hRendezvousCleanup),等待其他線程一起進行清理工作。
當(dāng)?shù)却瘮?shù)Rendezvous_meet(hRendezvousCleanup)被第三次調(diào)用時,調(diào)用它的線程并不會進入等待狀態(tài),而是喚醒其他兩條正在等待的線程。然后三條線程同時進行各自的清理工作,釋放各自申請的資源,然后結(jié)束各自的線程,程序結(jié)束。
Capture線程采集的視頻數(shù)據(jù)為736×576UYVY格式,由于移動監(jiān)控設(shè)備在采集視頻數(shù)據(jù)時難免會產(chǎn)生抖動,因此必須對采集的視頻數(shù)據(jù)進行電子穩(wěn)像處理。首先對當(dāng)前幀視頻圖像進行直方圖均衡化處理,以提高圖像的對比度。然后對圖像進行多分塊灰度投影。將一幀736×576UYVY的視頻數(shù)據(jù)按圖5所示的方式劃分成24個100×110的宏塊,宏塊與視頻數(shù)據(jù)邊緣的最近距離為68個像素點。
圖5 多分塊的視頻數(shù)據(jù)
將每個宏塊在水平方向和垂直方向上分別進行灰度投影,并通過互相關(guān)運算求出其運動參數(shù)。下式為進行行、列互相關(guān)運算的計算公式:其中,Colkn(j)為第k幀圖像第n號宏塊第j列的灰度投影值,NC是宏塊列的長度。設(shè)Wmin為C(w)最小值時w的值,則第k幀圖像的第n號宏塊相對于參考幀圖像的第n號宏塊在垂直方向的位移矢量為:
得到所有宏塊的運動參數(shù)后求出其平均運動參數(shù)。
然后去除與平均運動參數(shù)相差最大的前30%的宏塊的運動參數(shù),取剩下70%宏塊的運動參數(shù)的平均值為當(dāng)前幀的運動參數(shù)。然后用均值濾波器去掉運動參數(shù)中的高頻抖動部分,得到低頻的攝像機正常掃描運動參數(shù)。然后通過總運動參數(shù)和正常掃描的運動參數(shù)得到視頻數(shù)據(jù)的抖動參數(shù)。最后進行運動補償處理,本文通過對穩(wěn)定的前一幀補償?shù)玫较乱环€(wěn)定幀,為了避免錯誤向后續(xù)幀的傳播,選取每15幀利用一次原始幀做補償。運動補償以后就得到了穩(wěn)定的視頻數(shù)據(jù)。
服務(wù)器端通過3G網(wǎng)絡(luò)接收前端移動設(shè)備發(fā)送的視頻壓縮數(shù)據(jù),并將其解碼和顯示。視頻圖像如圖6所示。
Design and implementation of device-based video software in mobile monitoring system
Yang Yunlong1,Meng Limin2
(1.College of Information Engineering,Zhejiang University of Technology,Hangzhou 310023,China;
2.Zhejiang Provincial Key Laboratory of Communication Networks and Applications,Hangzhou 310023,China)
This paper proposes a video data processing software design scheme of mobile video surveillance system.Mobile monitoring system is mainly composed of front-end mobile monitoring devices,3G network,server,and mobile phone client.The article described the system schematic diagram,and mainly analyzed video data collection,video jitter removing,video data compression and video data backup.We used an improved gray projection method to remove the video jitter.This method solved the problem of the moving foreground interference.This method is validated to be correct through actual test.
mobile monitoring system;3G network;video processing;removing the video jitter;gray projection method
TP37
A
1674-7720(2015)18-0020-03
楊云龍,孟利民.移動監(jiān)控系統(tǒng)中設(shè)備端視頻軟件的設(shè)計與實現(xiàn)[J].微型機與應(yīng)用,2015,34(18):20-22,25.