馮 可,周 軍
(上海交通大學上海市數(shù)字媒體處理與傳輸重點實驗室,上海200240)
責任編輯:任健男
自2010年3D電影《阿凡達》上市以來,3D技術得到了極大的關注,對于3D技術相關的研究日益深入,3D節(jié)目的受眾群體也日益廣泛。隨著3D技術的研究深入,觀測的舒適度成為了一個非常重要的問題,它不僅影響著人們觀看3D節(jié)目時的感受,更影響著觀測者的身體健康。研究表明,有很多因素影響著3D視頻的觀測舒適度,其中雙路視頻中的垂直視差是極其重要的一項指標。
在實際的拍攝過程中,由于雙視點相機擺放位置的不精確,拍攝得到的雙路視頻中存在垂直視差這類幾何失真是無法避免的。為了消除立體視頻中的幾何失真導致的垂直視差,人們提出了各種攝像機標定和圖像極線校正算法,不過這些算法多用于圖像或者視頻的后期處理,難以做到在拍攝的同時得到較好的結果。如果能夠在拍攝的同時對所得到的視頻序列進行處理,消除其垂直視差,不僅可以大大降低后期處理的難度和工作量,也將因校正后3D視頻的舒適性質量提高而有效降低3D節(jié)目的制作門檻,從而促進3D產(chǎn)業(yè)的發(fā)展。
但隨著1 080高清視頻甚至4K視頻的應用范圍越來越廣,圖像極線校正算法的運算量越來越大,具體來講,對于雙路高清1 080 50i格式的輸入,系統(tǒng)的處理速度要達到50 f/s(幀/秒),相應的吞吐量要達到3 Gbit/s,對于每一幀圖像的極線校正時間需要控制在20 ms以內。另外在實時進行極線校正處理的同時,還應當能夠實時地使拍攝人員觀測到處理的結果,以進行及時的調整,包括更改校正的參數(shù)甚至直接調整相機的位置,這樣才能提供更大的可操作性。
針對以上的研究需求和難點,使用傳統(tǒng)的CPU架構尚無法完成實時校正處理。本文使用GPU并行架構完成了極線校正的過程,每幀的處理時間達到10 ms,實現(xiàn)了處理速度上的實時性;另外為了能夠實時采集并輸出處理結果,使用了DirectShow技術開發(fā)了用于3D高清視頻極線校正的過濾器,從而達到了3D高清視頻的實時采集、極線校正和輸出。
根據(jù)引言所述,系統(tǒng)所需完成的三大需求為:實時獲取雙目視頻流,根據(jù)預先設定好的參數(shù)對雙目視頻流進行高速的極線校正,將校正結果送至屏幕或采取其他的輸出方式實時提供給用戶觀測。按照這三大需求,本文的高清視頻實時極線校正系統(tǒng)的設計框圖如圖1所示,最終使用這個框圖設計得到的系統(tǒng)將為這一整套流程提供一個完整的解決方案。
圖1 高清視頻實時極線校正系統(tǒng)框圖
在該系統(tǒng)中,數(shù)據(jù)的整體流向為從左至右。首先由輸入模塊根據(jù)輸入的設置,負責完成雙目視頻序列的實時采集獲得雙目序列,并將所得到的數(shù)據(jù)流向下游傳輸至校正模塊;接下來由校正模塊根據(jù)設置好的一對單應矩陣完成實時的極線校正功能,并將得到的結果數(shù)據(jù)流向下游傳輸至輸出模塊;輸出模塊根據(jù)輸出的設置,將最終的結果展示到計算機屏幕、儲存為相關文件或者通過SDI接口進行輸出。
本系統(tǒng)涉及到了高帶寬的多媒體流的采集、傳輸和處理,采用微軟公司提供的DirectX軟件開發(fā)包,可以大大降低開發(fā)難度,而且使程序在未來也可以得到兼容和支持。
DirectShow是DirectX家族的一個成員,是專門為在Windows平臺上處理各種格式媒體文件的回放、音視頻采集等高性能要求的多媒體應用的一種實現(xiàn)方案。Direct-Show系統(tǒng)的結構如圖2所示,圖中最大的一塊就是DirectShow系統(tǒng)。虛線以下是Ring 0特權級別的硬件設備,虛線以上是Ring 3特權級別的應用層。DirectShow系統(tǒng)位于應用層,使用過濾器圖表管理器來管理整個數(shù)據(jù)流的處理過程。參與數(shù)據(jù)處理的各個功能模塊叫作過濾器(filter),各個過濾器在圖表管理器中按一定的順序連接成“流水線”協(xié)同工作。
在DirectShow中,模塊將被實現(xiàn)為過濾器。每個過濾器都有自己的Pin,各個過濾器之間就是通過這些輸入/輸出Pin來連接。Pin的連接其實是雙方使用的媒體類型的一個協(xié)商過程,而真實的數(shù)據(jù)傳輸單元叫作Media Sample。它也是一個COM組件,管理一塊數(shù)據(jù)內存,由分配器來管理。
圖2 DirectShow系統(tǒng)結構圖[1]
數(shù)據(jù)傳送的模式有兩種,一種是推模式,另一種是拉模式。推模式常用于實時源的數(shù)據(jù)處理,每采集到一個Media Sample就將其向下游傳輸,而拉模式常用于文件源的數(shù)據(jù)處理,每當下游處理完一個Media Sample就從文件源獲取數(shù)據(jù)。
輸入模塊流程圖如圖3所示。在輸入流程開始時,首先遍歷所有的硬件輸入設備;接下來由用戶指定從哪個設備獲得,并將指定源過濾器加入圖表管理器;然后獲得其支持的視頻和音頻輸入格式,當用戶選擇了一個相應的視頻格式之后,將這個源過濾器與AVI Decompressor過濾器相連,并從其X Form Out PIN獲得向下游傳輸?shù)囊曨l數(shù)據(jù);當用戶選擇了一個相應的音頻格式之后,便可以直接從源過濾器的audio capture PIN獲得向下游傳輸?shù)囊纛l數(shù)據(jù)。
圖3 輸入模塊流程圖
輸出模塊流程圖如圖4所示,輸出模塊根據(jù)用戶所選擇的輸出位置,相應地向過濾器圖表中加入文件寫入過濾器、視頻渲染過濾器(一般默認為VMR9)和設備渲染過濾器。在過濾器添加好之后,將上游校正模塊處理過的視頻流和由輸入模塊直接傳出的音頻流接入即可將最終的數(shù)據(jù)傳送至用戶所期望的輸出位置。
圖4 輸出模塊流程圖
需要把設備輸入的YUV格式數(shù)據(jù)高速轉換為易于處理的RGB格式,DirectShow已經(jīng)提供了一個具有該功能的過濾器AVI Decompressor,該過濾器可以向下游的過濾器提供RGB格式的Sample數(shù)據(jù),利于進行處理。
在枚舉設備接口時調用的PopulateDeviceControl()函數(shù)中,可以得到計算機所提供的所有連接設備的接口,每一個接口都可以獲得其連接設備的名字,默認情況的名字是以16進制的代碼顯示,例如{Device-17CCA71BECD7-11D0-B908-00A0C9223196},這樣的名字對用戶并不友好,可以通過pPropBag->Read(L"FriendlyName",&varName,0)語句,來使顯示的名字為用戶友好的名字,例如顯示為WDM Capture Device。
除了按照流程編寫程序,還應加入組件初始化,注冊到活動對象表,以及相應的對象銷毀和內存釋放過程。注冊到活動對象表可通過AddGraphToRot(m_pGraph,&m_ROTRegister)語句來實現(xiàn),注冊之后才可以在微軟提供的Graphedit軟件中使用Connect to Remote Graph來觀測當前的鏈路狀況,方便進行調試。
既然涉及到了多媒體視頻的處理,就一定要解決同步問題,在本系統(tǒng)中涉及到兩種同步問題:一是單路序列的音視頻同步,二是雙目序列之間的視頻同步。如果雙路序列不同步,校正的結果也就失去了意義。
DirectShow系統(tǒng)已經(jīng)提供了解決方案,就是利用過濾器圖表的參考時鐘,可以直接把單路序列的音視頻同步,讓雙目序列所在的兩條鏈路使用同一個參考時鐘便可以解決雙目序列之間的視頻同步。
3D視頻極線校正的目的是消除左右視頻中的垂直視差,從而消除垂直視差引起的不舒適感,傳統(tǒng)的視頻極線校正過程可以分為有相機標定的方法和無相機標定的方法。
在無相機標定方法中使用文獻[2-3]中的誤匹配剔除算法,再利用LM優(yōu)化獲得左右視頻分別的單應矩陣,并利用這一對矩陣分別對左視頻和右視頻的每一幀進行投影變換,從而得到極線校正后的圖像。
校正的基本公式為
利用式(1)進行校正需要反向填充,首先求校正矩陣H的逆,然后利用公式
校正處理模塊接受上游傳送而來的視頻流,并對每一幀圖像進行校正處理,再將其向下游傳輸,其內部的算法流程圖如圖5所示。首先檢查輸入PIN傳入的數(shù)據(jù)格式是否符合要求,如果不符合將給出提示,否則解析幀頭信息獲得圖像的大小和色度信息,從而選擇適當?shù)男U瘮?shù)進行調用。
圖5 校正模塊流程圖
校正函數(shù)由GPU實現(xiàn),調用函數(shù)時將數(shù)據(jù)傳輸至GPU,進行并行處理,再將處理好的結果傳輸回主機端。最后加入相應的幀頭信息,向下游傳輸。
GPU有著良好的并行計算能力,已經(jīng)在很多領域有應用[4-5],例如全息影像、語音識別等。對于高清視頻的極線校正過程,GPU的架構尤其適用,因為每個坐標映射及插值計算過程完全相同且與其他過程無關,非常利于通過并行來獲得巨大的加速比。本文采用的是NVIDIA公司的CUDA架構,它利用多個流處理器分塊(block)執(zhí)行運算任務,每個塊中也可以同時開啟多個線程(thread)。通過Host主機端調用在Device上運行的Kernel函數(shù),程序會按照設置好的Grid,Block,Thread數(shù)目進行并行運算。
用GPU實現(xiàn)實時極線校正算法,其核心函數(shù)的實現(xiàn)形式和調用形式分別為:
__global__void warpKernel(uchar*src,uchar*dest,double*parameter)
dim3 blocks(60,34),threads(32,32);
warpKernel<<<blocks,threads>>>(dev_imgL,dev_resultL,dev_leftM);
在實現(xiàn)過程中,要注意以下幾個細節(jié):
1)為了使GPU的運算效率達到最高,在核函數(shù)內部盡量減少分支判斷的次數(shù)。
2)因為要處理的src和dest均是圖像,可以視為二維的數(shù)組,于是使用cudaMallocPitch()代替cudaMalloc()來執(zhí)行間距分配。由于硬件中的間距對齊限制,在顯存和內存之間復制這塊內存區(qū)域將會略微提高效率。
3)因為CUDA模型中每個流處理器可以同時處理8個線程,為了充分利用資源,創(chuàng)建32的倍數(shù)個線程。
要想在過濾器中使用GPU,需要先編寫好Kernel函數(shù)并編譯,并在過濾器的實現(xiàn)文件中用extern C聲明,之后便可以直接在Transform核心函數(shù)中,調用聲明好的cudaTest函數(shù):
extern"C"void cudaTest(uchar*src,uchar*dst,uchar*dev_imgL,int rows,int cols,uchar*dev_resultL,double*dev_leftM);
要想使用自己編寫的過濾器,可以通過將該過濾器導出成dll形式的方式來實現(xiàn)。但在實現(xiàn)中,沒有必要非要以COM組件的形式使用過濾器,可以直接實例化一個過濾器,并手工添加引用計數(shù),然后獲取IBaseFilter接口并通過該接口對編寫的過濾器進行操作,部分代碼如下:
CRectFilter*pFLeft=new CRectFilter();
pFLeft->AddRef();
pFLeft->SetParameters(RectHomoL,1080,1920,1);
hr=pFLeft->QueryInterface(IID_IBaseFilter,reinterpret_cast<void**>(&pRectLeft));
hr=m_pGraph->AddFilter(pRectLeft,L"My Rectification Left");
首先,利用GPU并行進行實時校正的結果如圖6所示,從上方牌匾處的“交通”二字以及石獅子的頭部可以看出,垂直視差得到了有效的消除。
圖6 校正前后的紅青立體圖對比
極線校正所需的時間數(shù)據(jù)如圖7所示,多核CPU的效率遠遠落后于GPU,NVIDIA Quadro K4000顯卡對于1 080視頻幀的處理時間(包括內存與顯存之間傳輸圖像數(shù)據(jù)的時間)為7 ms,處理幀的速度為140幀/秒(f/s),比CPU提速了20倍,達到了實時的速度要求。但在顯存和內存各緩存一幀的數(shù)據(jù),所以實際上的處理和播放延時為2幀。
最終利用編寫好的極線校正過濾器來實現(xiàn)高清視頻的實時校正和播放的過濾器圖表如圖8所示,其中視頻數(shù)據(jù)流由采集卡傳入,經(jīng)過AVI Decompressor后由YUV422格式轉變?yōu)镽GB24格式,再經(jīng)由實現(xiàn)的Rectification過濾器最終提供給屏幕進行輸出顯示,最終的播放丟幀數(shù)為0,達到了預期效果,開發(fā)用于3D高清視頻極線校正的過濾器,從而實現(xiàn)了3D高清視頻的實時采集、極線校正和輸出。
圖7 極線校正所需時間圖
圖8 利用實時極線校正過濾器播放視頻的過濾器圖表
[1]陸其明.DirectShow開發(fā)指南[M].北京:清華大學出版社,2003.
[2]YAO D,ZHOU J,XUE Z.Homography matrix genetic consensus estimation algorithm[C]//Proc.IEEE ICALIP.[S.l.]:IEEE Press,2011:1139-1143.
[3]姚達,周軍,薛質.計算機視覺中強魯棒性的遺傳一致性估計[J].計算機工程,2011,37(20):183-185.
[4]鄭專,安平,張秋聞,等.基于GPU加速的深度圖像繪制[J].電視技術,2012,36(11):11-14.
[5]仇德元.GPGPU編程技術——從GLSL、CUDA到OpenCL[M].北京:機械工藝出版社,2011.