本發(fā)明屬于圖像處理領(lǐng)域,涉及視頻制作時的摳像方法,尤其涉及一種基于GPU的摳像方法。
背景技術(shù):
隨著視頻演播技術(shù)的發(fā)展,許多節(jié)目在制作時已經(jīng)不用忙于布置演播室,只需要一個純色的區(qū)域,主持人站在這個區(qū)域主持節(jié)目,而當(dāng)節(jié)目呈現(xiàn)給觀眾時,觀眾卻可看到主持人置身于一個特定的節(jié)目場景中,這種虛擬演播室的效果要歸功于視頻摳像技術(shù)。
但是,在制作高清節(jié)目的虛擬演播系統(tǒng)中,摳像設(shè)備多數(shù)采用價格較高的專用硬件設(shè)備,而價格較低的基于“普通PC+信號輸入板卡”的摳像機在面對高清信號處理要求時,處理能力不足。目前市面上基于普通PC的現(xiàn)有技術(shù)大部分是通過圖像像素掃描,RGB三原色的判斷,將目標顏色鎖定在一定的RGB值范圍內(nèi),通過CPU的運算能力,逐行掃描圖片像素,分析像素的色域范圍來進行摳像,其具有明顯的兩點缺陷:其一是摳像速度比較慢,由于CPU的主頻限制,目前現(xiàn)有技術(shù)對CPU的提升已經(jīng)越來越有局限,導(dǎo)致單純依靠CPU來運行的效率比較差;其二是摳像效果不理想,通過傳統(tǒng)RGB三原色摳像已經(jīng)很難滿足越來越多元化的現(xiàn)場光線要求。因此,亟需一種新的摳像方法,可以使用普通PC運行,在節(jié)省成本的基礎(chǔ)上,保證處理能力。
技術(shù)實現(xiàn)要素:
為了解決現(xiàn)有技術(shù)中的上述問題,本發(fā)明提出了一種基于GPU并行操作性能的摳像方法。
本發(fā)明采用的技術(shù)方案如下:
一種GPU摳像方法,其特征在于,該方法包括如下步驟:
1)CPU獲取摳像所需的圖像數(shù)據(jù),包括前景圖像和背景圖像,將所述前景圖像和背景圖像從RAM傳入GPU全局內(nèi)存;所述前景圖像和背景圖像的分辨率相同;
2)所述CPU向GPU的全局內(nèi)存申請空間,用于存放合成后的圖像數(shù)據(jù);
3)所述GPU的各個block開始執(zhí)行kernel函數(shù);
4)所述GPU從全局內(nèi)存分別聚合讀取前景圖像和背景圖像中的一塊數(shù)據(jù)到共享內(nèi)存。
5)所述GPU同步線程,重復(fù)步驟4,直至要處理的圖像數(shù)據(jù)全部讀入共享內(nèi)存;
6)所述GPU的每個線程從共享內(nèi)存中各讀取前景圖像和背景圖像中一個像素的數(shù)據(jù),并對讀取的像素進行摳像處理,將處理結(jié)果寫入存放合成圖像的共享內(nèi)存;
7)所述GPU同步線程,每個線程處理一個像素的數(shù)據(jù),處理結(jié)果都寫入共享內(nèi)存,最終形成合成圖像數(shù)據(jù);
8)所述GPU將共享內(nèi)存中的合成圖像數(shù)據(jù)寫入全局內(nèi)存;
9)所述GPU將全局內(nèi)存中的合成圖像數(shù)據(jù)回傳給所述CPU;
10)顯示合成圖像。
進一步地,所述聚合讀取為滿足以下兩個條件的全局內(nèi)存讀取操作:
(1)所述GPU中任意一個half-warp對全局內(nèi)存數(shù)據(jù)的存取都落在全局內(nèi)存的一個段內(nèi);
(2)所述half-warp中的第n個線程,或者不存取數(shù)據(jù),或者必須存取所述段中的第n個數(shù)據(jù)。
進一步地,在所述聚合讀取中,每個線程每次讀取的所述數(shù)據(jù)的長度為4字節(jié)、8字節(jié)或者16字節(jié)。
進一步地,所述GPU的每個block包括的線程數(shù)量在128以上,并且為64的倍數(shù)。
優(yōu)選的,所述GPU的每個block包括128個線程。
進一步地,所述GPU的每個線程處理摳像中的一個像素,設(shè)線程ID為threadIdx,其處理的像素坐標為(x,y),則有
x=blockIdx.x×blockDim.x+threadIdx.x;
y=blockIdx.y×blockDim.y+threadIdx.y;
其中,blockIdx是線程的block在grid中的索引值,blockIdx.x和blockIdx.y是該索引值的x分量和y分量;blockDim是該block的尺寸,blockDim.x和blockDim.y分別是x軸尺寸和y軸尺寸;threadIdx.x和threadIdx.y是線程ID的x分量和y分量。
進一步地,每個線程通過下述方法進行摳像處理:
6.1)設(shè)P為線程處理的像素的坐標點,前景圖像上P點對應(yīng)的像素在RGB色彩空間的顏色為Rcap、Gcap和Bcap,所述線程將其轉(zhuǎn)換到HSV色彩空間,得到前景圖像上P點對應(yīng)的像素在HSV色彩空間的顏色為Hcap、Scap和Vcap;
6.2)設(shè)背景圖像上P點對應(yīng)的像素在RGB色彩空間的顏色為Rbg、Gbg和Bbg;摳像后輸出的合成圖像在P點對應(yīng)的像素在RGB色彩空間的顏色為Rresult、Gresult和Bresult;則計算公式如下:
其中,色鍵Hkey、Skey、Vkey分別是摳像顏色的色相、飽和度和明度,scale是預(yù)先定義的摳像閾值。
本發(fā)明的有益效果包括:使用普通PC進行摳像,節(jié)約成本,通過GPU來完成摳像的操作,性能相對于CPU顯著提高,并且可以滿足高清信號要求。本發(fā)明可以降低CPU的要求,相對于配置一般的電腦,只要合理利用好CPU和GPU就能發(fā)揮出出色的摳像效果。
【附圖說明】
此處所說明的附圖是用來提供對本發(fā)明的進一步理解,構(gòu)成本申請的一部分,但并不構(gòu)成對本發(fā)明的不當(dāng)限定,在附圖中:
圖1是本發(fā)明基本的摳像流程。
圖2是本發(fā)明通過GPU進行摳像處理的基本方法。
圖3是本發(fā)明GPU線程配置方案表。
圖4是本發(fā)明GPU不同線程配置方案的統(tǒng)計數(shù)據(jù)表。
【具體實施方式】
下面將結(jié)合附圖以及具體實施例來詳細說明本發(fā)明,其中的示意性實施例以及說明僅用來解釋本發(fā)明,但并不作為對本發(fā)明的限定。
本發(fā)明的主要思想是:通過CPU和GPU的共同參與,完成整個摳像過程,并且為了進一步提高處理速度,利用了GPU操作的異步執(zhí)行功能,將CPU和GPU的操作執(zhí)行并行起來,最終使整個摳像處理達到高清立體節(jié)目的要求。
在實現(xiàn)虛擬演播應(yīng)用中,主持人需要在一個純色的背景前主持節(jié)目,之后通過摳像處理將主持人的圖像從整個畫面中提取出來,疊加到另一個背景上。但是,由于光照強度的影響,攝像機拍攝到的演播室背景亮度不均,強光照的區(qū)域呈現(xiàn)出亮調(diào),弱光照的區(qū)域呈現(xiàn)出暗調(diào),換言之,同樣的色相,色度(飽和度)和亮度不同。因此,為了更好地實現(xiàn)摳像,首先需要將圖像從RGB色彩空間轉(zhuǎn)換到HSV色彩空間,在HSV色彩空間中,選定一種色彩(色相H)后,可以通過改變色彩含量的多少(飽和度S)和色彩明暗程度(明度V)獲得不同顏色,而且這種變化在其色彩空間模型中是連續(xù)的,這也是HSV色彩空間與RGB色彩空間的不同之處。HSV色彩空間這種可將某種色彩的色度和亮度變化構(gòu)成的顏色集中在某個區(qū)域的特點,能夠更容易地將演播室背景顏色變化表示出來,所以在HSV的色彩空間下進行摳像比在RGB空間下更具操作性。
參見附圖1,其示出了本發(fā)明的一個基本的摳像流程:
步驟100:演播室中,主持人在一個純色的背景前主持節(jié)目,由攝像機拍下主持人的主持畫面的圖像;現(xiàn)有的攝像機所產(chǎn)生的圖像基本都是由RGB色彩空間表示。
步驟200:將拍攝的圖像由RGB色彩空間轉(zhuǎn)換到HSV色彩空間,具體的轉(zhuǎn)換方法在后面說明。
步驟300:對轉(zhuǎn)換后的圖像進行摳像,即剔除圖像中的純色背景。
步驟400:輸出摳像后的圖像。
步驟500:將摳像后的圖像疊加到預(yù)先設(shè)置的虛擬背景上,從而形成主持人在虛擬背景前主持節(jié)目的合成圖像。
步驟600:輸出所述合成圖像。
下面對RGB色彩空間到HSV色彩空間的具體轉(zhuǎn)換方法作出說明,設(shè)圖像上某個像素在RGB色彩空間的顏色為R(紅色分類)、G(綠色分量)、B(藍色分量),相對應(yīng)的HSV色彩空間的顏色為H(色相)、S(飽和度)、V(明度)。則通過以下公式計算HSV
V=max(R,G,B)
H=H×60;如果H<0,H=H+360。
其中,亮度V取RGB三個值中的最大值。在該最大值不為零時,S通過其第一個公式計算,否則S等于0。計算H的過程稍微復(fù)雜,如果S=0,則H值未定義,否則根據(jù)RGB三個值哪個最大,采用對應(yīng)的三個公式之一計算一個初值,然后將該初值乘以60得到H的結(jié)果,如果該結(jié)果還小于0,則再加上360。
在將圖像從RGB色彩空間轉(zhuǎn)換到HSV色彩空間后,具體的摳像方法如下:
步驟301:輸入兩幅分辨率相同的圖像,一幅為演播室拍攝并轉(zhuǎn)換到HSV色彩空間的前景圖像(CAP),一幅為需要疊加的虛擬背景圖像(BG)。
步驟302:掃描前景圖像上的每個像素點,對每一個像素點進行處理,具體處理方法如下:
設(shè)P為圖像上某個像素的位置,前景圖像上P點對應(yīng)的像素在HSV色彩空間的顏色為Hcap、Scap和Vcap(即該像素的色相、飽和度和明度),前景圖像上P點對應(yīng)的像素在RGB色彩空間的顏色為Rcap、Gcap和Bcap(即該像素的紅色分量、綠色分量和藍色分量)。背景圖像上P點對應(yīng)的像素在RGB色彩空間的顏色為Rbg、Gbg和Bbg(即該像素的紅色分量、綠色分量和藍色分量)。摳像后輸出的合成圖像在P點對應(yīng)的像素在RGB色彩空間的顏色為Rresult、Gresult和Bresult(即該像素的紅色分量、綠色分量和藍色分量)。計算公式為:
其中,色鍵Hkey、Skey、Vkey分別是摳像顏色的色相、飽和度和明度,scale是預(yù)先定義的摳像閾值。上述公式說明,在前景圖像像素的三個HSV分量與色鍵的三個分量的差都小于閾值時,摳像結(jié)果取背景圖像像素的RGB值,否則取前景圖像像素的RGB值。
在對兩幅圖像進行摳像處理的過程中,無論是色彩空間的轉(zhuǎn)換還是與閾值的比較,都是以像素為單位進行處理,而且像素之間的數(shù)據(jù)獨立,整個過程是一種高度密集型的計算。對于這樣的計算,普通CPU的處理能力不足,因此本發(fā)明采用GPU進行計算。根據(jù)本發(fā)明的實施例,采用普通的支持CUDA1.1計算能力的GeForce 9800GT作為GPU計算工具和CPU進行合作計算。GeForce 9800GT具有14個多處理器,每個多處理器又有8個核,總共有14×8=112個核心,由于其時鐘頻率為1.37GHz,那么總的并行處理的時鐘頻率為1.37GHz×112=153.44GHz,與CPU相比,GPU具有非常高的數(shù)據(jù)并行運算能力。
參見附圖2,其示出了本發(fā)明通過GPU進行摳像處理的基本方法:
1)CPU獲取圖像數(shù)據(jù),將RGB24格式的前景圖像數(shù)據(jù)和背景圖像數(shù)據(jù)從RAM傳入GPU全局內(nèi)存。
2)CPU向GPU的全局內(nèi)存申請空間,用于存放合成后的圖像數(shù)據(jù)。
3)GPU的各個block開始執(zhí)行kernel函數(shù)。
4)GPU從全局內(nèi)存中各讀取前景圖像和背景圖像中一個像素的數(shù)據(jù)。
5)GPU對步驟4中讀取的像素進行摳像處理,將處理結(jié)果寫入存放合成圖像的全局內(nèi)存。具體的摳像處理過程類似于上述步驟301-302,即首先將該像素從RGB色彩空間轉(zhuǎn)換到HSV色彩空間,然后采用上述步驟302的公式,計算出摳像的處理結(jié)果。
6)GPU重復(fù)步驟4-5,直到生成最終的合成圖像,將合成圖像回傳給CPU。
7)顯示合成圖像。
在GPU進行摳像處理時,是多線程進行的,每個線程處理一個像素。需要處理多少個像素,就為GPU分配至少多少個線程,由于線程間處理的像素各不相同,所以各自沒有數(shù)據(jù)相關(guān)性。
由于處理的數(shù)據(jù)是平面圖像,可以用二維坐標系來表示圖像中像素的坐標。所以GPU在計算時,配置grid的維數(shù)為二維,block的維數(shù)也為二維,各個線程處理的像素的坐標計算如下:
x=blockIdx.x×blockDim.x+threadIdx.x;
y=blockIdx.y×blockDim.y+threadIdx.y;
其中blockIdx是線程的線程塊(block)在線程格(grid)中的索引值,blockIdx.x和blockIdx.y是該索引值的x分量和y分量;blockDim是該線程塊的尺寸,blockDim.x和blockDim.y分別是x軸尺寸和y軸尺寸;threadIdx是線程ID,threadIdx.x和threadIdx.y是線程ID的x分量和y分量。計算出來的(x,y)就是線程threadIdx處理的像素的坐標。
每個線程占用GPU中的10個寄存器,每個block占用60字節(jié)的共享內(nèi)存和20字節(jié)的常量內(nèi)存。根據(jù)CUDA 1.1能力標準,計算出一個GPU對基本算法的資源限制為:
寄存器:8192/10=819個線程;
共享內(nèi)存:16K/60=266個block
常量內(nèi)存:64K>20,未受限
但是,在在CUDA 1.1能力標準中,每個GPU最多可處理768個線程。CUDA中線程塊線程數(shù)量的配置會影響CUDA的處理效率。主要如下:
1、多處理器中活動的warp數(shù)量會影響延遲隱藏效果和GPU的使用率。
延遲是指使用多少個時鐘周期去使一個warp完成執(zhí)行下一個指令的準備工作。延遲隱藏是指多處理器在每個時鐘周期中總可以執(zhí)行某個warp中的指令,從而隱藏了其它warp的延遲。如果warp下一個指令中的輸入操作數(shù)未準備好時,warp就無法繼續(xù)執(zhí)行。當(dāng)輸入操作數(shù)是寄存器,延遲將取決于寄存器的延遲。例如寄存器的寫后讀延遲,當(dāng)此時輸入的寄存器操作數(shù)是由前一個指令寫入時,GPU無法立即將寄存器數(shù)值讀取出來,因此產(chǎn)生了延遲,在這個延遲期間,warp調(diào)度器調(diào)用其它準備就緒的warp給多處理器第執(zhí)行。平均的寄存器延遲大概是22個時鐘周期,對于計算能力的設(shè)備,CUDA建議多處理器必須有6個warp(192個線程)才能隱藏該類延遲。當(dāng)輸入操作數(shù)不是位于片上內(nèi)存,即訪問DRAM顯存,延遲為400到600個時鐘周期。消除該類延遲需要的warp數(shù)量取決于GPU代碼。一般來說,GPU代碼中,讀取片上存儲器的指令與非片上存儲器的指令的比值越小,需要的warp越多。如果比值為1:15,CUDA 1.1計算能力的設(shè)備的每個多處理器需要10個活動的warp才能將延遲隱藏。
2、多處理器中活動的block數(shù)量會影響GPU的使用率。
當(dāng)多處理器只有一個活動的block時,如果執(zhí)行到線程同步或者非片上存儲器的讀取操作時,多處理器就會產(chǎn)生空閑。所以多處理器中應(yīng)包含有多個活動的block,當(dāng)某個block在等待時,多處理器調(diào)入其它block執(zhí)行,盡量使GPU忙碌。另外,一個GPU有多個多處理器,GPU將block平均分配給各個多處理器,最佳的block數(shù)量是多處理器數(shù)量的整數(shù)倍,每個多處理器的負荷均勻,block的并行化程度最高。
3、block中線程數(shù)量也會影響GPU計算效率。
多處理器每次處理一個block,block中的線程又以warp為單位進行調(diào)度,如果block中線程的數(shù)量是warp的整數(shù)倍,不會在不足32個線程的warp上浪費計算資源,同時也可以促成block對全局內(nèi)存的完全的聚合訪問。block中的數(shù)量也不能太少,以產(chǎn)生足夠的warp,實現(xiàn)延遲隱藏。CUDA建議block中線程的數(shù)量不少于64,最好在128到256之間。另外,寄存器內(nèi)存也存在bank沖突,當(dāng)block中線程的數(shù)量為64的整數(shù)倍時,編譯器和線程調(diào)度器可以取得最佳的沖突避免效果。
如果多處理器的活動線程達到其處理上限,多處理的占用率達到100%。是否能滿負荷運行,取決于block中線程數(shù)量的配置和每個線程使用的寄存器資源及其他資源的數(shù)量,其中最重要的還是資源的使用。多處理器的資源必須能夠預(yù)留給所有活動線程,如果多處理器無法為一個block預(yù)留資源,kernel的調(diào)用將失敗。在多處理器上的各種資源,寄存器資源是最少的,CUDA提供了一個編譯參數(shù),可以限制每個線程使用寄存器的個數(shù),編譯器使用本地內(nèi)存替代寄存器。由于本地內(nèi)存無緩存和聚合存取機制,本地內(nèi)存的存取效率是所有存取DRAM方式中最低的,所以即使多處理的占用率達到100%,GPU算法的執(zhí)行時間不一定是最短。
根據(jù)以上因素,本發(fā)明在GPU的每個block中包含的線程為128以上,并且為64的倍數(shù),由于block線程上限為512,線程配置組合如附圖3所示。
對附圖3中多處理器占有率100%的配置方案進行比較,通過CUDA Visual Profiler得到統(tǒng)計數(shù)據(jù),如附圖4所示。從附圖4可以看出,當(dāng)每個block的線程數(shù)量為128時,性能最優(yōu),并且與其它多處理器占有率100%的配置方案相比,每個多處理器的活動block數(shù)量最多。
聚合存取的優(yōu)化
在CUDA中,一個時鐘周期可以執(zhí)行8次內(nèi)存操作。但是,對local memory或global memory的存取有400-600個時鐘周期延遲,每個線程都需要從global memory中讀取數(shù)據(jù),往global memory寫入數(shù)據(jù),內(nèi)存操作與處理的像素成比例增長。由于存取的延遲,非聚合操作將影響到整個CUDA摳像的效率。為了提高處理效率,必須對數(shù)據(jù)存取進行聚合優(yōu)化。如果數(shù)據(jù)能夠?qū)崿F(xiàn)聚合存取,那么多個線程對數(shù)據(jù)多個存取操作將合并為一個操作,延遲也將僅有一次存取操作的延遲,否則每次存取操作分開獨立進行,延遲成倍增長。
在CUDA1.1計算能力的硬件中,global memory被劃分成段,有兩種劃分方法,一種是每一塊global memory從起點開始,連續(xù)的128byte的數(shù)據(jù)就被劃分成一個段,另一種是從起點開始,連續(xù)的64byte的數(shù)據(jù)被劃分成一個段。由于CUDA對線程的調(diào)度是以half-warp為單位,所以如果一個half-warp對數(shù)據(jù)的存取能夠落在某個段內(nèi),就滿足了聚合讀取的一個條件。
聚合讀取的另一個條件是,half-warp中第n個線程,要么不存取數(shù)據(jù),要么必須存取段中的第n個數(shù)據(jù),數(shù)據(jù)的長度可以是4byte,8byte或者16byte。
64byte的聚合讀?。?6個線程,每個線程讀取4個byte,總共64個byte,總的開銷為一次讀取的時間。
128byte的聚合讀?。?6個線程,每個線程讀取8個byte,總共128個byte,總的開銷為一次讀取的時間;16個線程,每個線程讀取16個byte,總共256個byte,分兩次讀取,每次讀取128byte,總的開銷為兩次讀取時間。
每個線程8個byte的聚合存取的帶寬略低于4個byte的,每個線程16byte的聚合存取的帶寬低于4個byte的很多。而非聚合存取的帶寬大大低于4個byte的聚合讀取,但是與8個byte的聚合讀取比起來卻只低大約4倍,與16個byte的相比只低于大約2倍。所以4個byte的聚合讀取帶寬最高。
在前述的基本摳像算法中,每個線程處理一個像素,每個像素是RGB24格式,占3個byte,開始時每個線程并行地從存放前景圖像的全局內(nèi)存中存取3個byte,再從存放背景圖像的全局內(nèi)存中存取3個byte,最后往存放最終結(jié)果的全局內(nèi)存中寫入3個byte,對全局內(nèi)存的存取都不符合聚合存取4個byte,8個byte或16個byte的條件,由于對全局內(nèi)存的大量非聚合存取操作,導(dǎo)致存取帶寬非常低,大量的時間消耗在全局內(nèi)存操作上?;诖耍景l(fā)明對基本方法進行聚合讀寫優(yōu)化。
聚合讀寫優(yōu)化的基本思想是:在CUDA中,每個多處理器擁有16KB的share memory,share memory位于片上(on-chip),類似于CPU中的L1緩存,讀取和寫入速度快,每個時鐘周期可以進行8次share memory操作,且沒有非聚合存取問題,也沒有g(shù)lobal memory存取操作額外的內(nèi)存延遲。share memory的生命周期為block,使用share memory解決global memory非聚合存取的高延遲問題時得以block為單位,block中的線程首先將數(shù)據(jù)讀入share memory,再讀取出來進行摳像處理。優(yōu)化后的方法如下:
1)CPU獲取圖像數(shù)據(jù),將RGB24格式的前景圖像數(shù)據(jù)和背景圖像數(shù)據(jù)從RAM傳入GPU全局內(nèi)存。
2)CPU向GPU的全局內(nèi)存申請空間,用于存放合成后的圖像數(shù)據(jù)。
3)GPU的各個block開始執(zhí)行kernel函數(shù)。
4)GPU從全局內(nèi)存分別聚合讀取前景圖像和背景圖像中的一塊數(shù)據(jù)到共享內(nèi)存。
5)GPU同步線程,重復(fù)步驟4,以保證要處理的數(shù)據(jù)全部讀入共享內(nèi)存。
6)GPU的一個線程從共享內(nèi)存中各讀取前景圖像和背景圖像中一個像素的數(shù)據(jù),并對讀取的像素進行摳像處理,將處理結(jié)果寫入存放合成圖像的共享內(nèi)存。具體的摳像處理過程與基本方法中說明的相同。
7)GPU同步線程,每個線程處理一個像素的數(shù)據(jù),保證處理結(jié)果都寫入到共享內(nèi)存,最終形成了合成圖像數(shù)據(jù)。
8)GPU將共享內(nèi)存中的合成圖像數(shù)據(jù)寫入全局內(nèi)存。
9)GPU將全局內(nèi)存中的合成圖像數(shù)據(jù)回傳給CPU。
10)顯示合成圖像。由于合成圖像數(shù)據(jù)實際上已經(jīng)在顯卡中,因此可以由顯卡直接顯示合成后的圖像,從而在不降低處理效率的前提下在顯卡上同時實現(xiàn)GPU摳像和結(jié)果顯示,無需將數(shù)據(jù)回傳到內(nèi)存再顯示。
以上所述僅是本發(fā)明的較佳實施方式,故凡依本發(fā)明專利申請范圍所述的構(gòu)造、特征及原理所做的等效變化或修飾,均包括于本發(fā)明專利申請范圍內(nèi)。