本發(fā)明涉及通信設(shè)備技術(shù)領(lǐng)域,尤其涉及一種攝像頭實(shí)時(shí)快速字幕疊加的方法。
背景技術(shù):
在視頻會(huì)議中,通常都是全國(guó)各地不同地方的人參加同一個(gè)視頻會(huì)議,各個(gè)視頻參與方并不是相互熟悉,當(dāng)各個(gè)地方的視頻畫(huà)面合并成一個(gè)大的視頻畫(huà)面并呈現(xiàn)給所有參與方的時(shí)候,由于視頻畫(huà)面中缺少字幕,我們無(wú)法通過(guò)字幕的方式,將一些需要呈現(xiàn)給所有會(huì)議參與方的信息(如:會(huì)議參與方名字、所在公司、所在地方等)實(shí)時(shí)疊加到視頻圖像里面去,從而無(wú)法讓各個(gè)參與方可以實(shí)時(shí)了解同本次視頻會(huì)議相關(guān)的一些其他信息,如:會(huì)議日期、會(huì)議時(shí)間等。
在視頻會(huì)議中,由于攝像頭捕捉到的視頻數(shù)據(jù)格式主要有yuv、mjpg、h264等,而mjpg、h264解碼后的格式也主要是yuv格式,因此,一些開(kāi)源的視頻圖像處理軟件對(duì)字幕的處理方法為:為了進(jìn)行不同顏色和透明度的字幕疊加,先將yuv視頻圖像轉(zhuǎn)化為rgb格式,然后將彩色字幕圖像轉(zhuǎn)化為rgb格式,再將轉(zhuǎn)化后的彩色字幕圖像和攝像頭捕捉到的視頻圖像進(jìn)行疊加,合并成一張圖像,并進(jìn)行透明度等相關(guān)處理,然后再將rgb轉(zhuǎn)化回編碼器需要的yuv圖像格式,最后編碼并傳送出去。
上述處理方式是對(duì)每一幀視頻數(shù)據(jù)都進(jìn)行了:“yuv轉(zhuǎn)化為rgb,再將rgb轉(zhuǎn)回yuv”的過(guò)程,兩次圖像轉(zhuǎn)換對(duì)系統(tǒng)的消耗極大,僅僅每秒幾十兆的內(nèi)存拷貝就令一般的cpu無(wú)法承擔(dān),再加上圖像處理,直接導(dǎo)致cpu無(wú)法滿足高清圖像的處理,并導(dǎo)致每秒能夠處理的幀率大大下降,嚴(yán)重影響系統(tǒng)性能,降低視頻質(zhì)量。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明要解決的技術(shù)問(wèn)題,在于提供一種攝像頭實(shí)時(shí)快速字幕疊加的方法,避開(kāi)了復(fù)雜的圖像處理和海量的內(nèi)存拷貝,提高系統(tǒng)性能。
本發(fā)明是這樣實(shí)現(xiàn)的:
一種攝像頭實(shí)時(shí)快速字幕疊加的方法,包括如下步驟:
步驟1、根據(jù)字幕內(nèi)容和字幕的字號(hào)大小,生成對(duì)應(yīng)的點(diǎn)陣圖像,再將點(diǎn)陣圖像轉(zhuǎn)化為點(diǎn)陣數(shù)據(jù);
步驟2、根據(jù)字幕顏色和字幕透明度將點(diǎn)陣數(shù)據(jù)轉(zhuǎn)化為yuv數(shù)據(jù);
步驟3、根據(jù)攝像頭捕捉到的視頻圖像的分辨率、字幕占用的視頻圖像范圍和用戶配置的顯示位置,確定字幕疊加到攝像頭捕捉到的視頻圖像中具體的疊加位置;
步驟4、根據(jù)yuv數(shù)據(jù)及疊加位置進(jìn)行字幕的疊加,從而獲得帶有字幕的視頻圖像。
進(jìn)一步地,所述步驟1具體為:
步驟11、用戶自行設(shè)定字幕的字形風(fēng)格,加載相應(yīng)的中文字庫(kù)和英文字庫(kù),并選定unicode編碼格式;
步驟12、用戶從中文字庫(kù)和英文字庫(kù)中獲取相應(yīng)的字幕內(nèi)容,將用戶輸入的字幕內(nèi)容進(jìn)行編碼轉(zhuǎn)化,統(tǒng)一轉(zhuǎn)化為unicode編碼格式;
步驟13、根據(jù)字幕需要顯示的字號(hào)大小,結(jié)合攝像頭捕捉到的視頻圖像的分辨率,計(jì)算出視頻圖像中每個(gè)字符的點(diǎn)陣大??;
步驟14、根據(jù)計(jì)算出的點(diǎn)陣大小,將unicode編碼格式的字幕內(nèi)容轉(zhuǎn)化為點(diǎn)陣圖像,再將點(diǎn)陣圖像數(shù)字化,得到點(diǎn)陣數(shù)據(jù);
步驟15、根據(jù)點(diǎn)陣數(shù)據(jù),確定出需要疊加的像素和不需要疊加的像素,并將需要疊加的像素標(biāo)記為1,不需要疊加的像素標(biāo)記為0。
進(jìn)一步地,所述步驟2具體為:
步驟21、獲取字幕需要顯示的字幕顏色;
步驟22、將字幕顏色對(duì)應(yīng)的rgb值轉(zhuǎn)化為對(duì)應(yīng)的需要疊加的像素的yuv值,并將yuv值簡(jiǎn)化為y1u1v1值;
步驟23、獲取字幕需要顯示的字幕透明度和攝像頭采集的視頻圖像的y0u0v0值;
步驟24、根據(jù)字幕透明度、y0u0v0值和y1u1v1值進(jìn)行修正,得到修正后的y2u2v2值;
步驟25、根據(jù)計(jì)算出來(lái)的y2u2v2值,將點(diǎn)陣數(shù)據(jù)轉(zhuǎn)化為yuv數(shù)據(jù)。
進(jìn)一步地,所述步驟3具體為:
步驟31、根據(jù)獲取的字幕所要顯示的區(qū)域、字幕的橫向偏移量和字幕的縱向偏移量,確定出用戶配置的字幕顯示位置;
步驟32、根據(jù)每個(gè)字符的點(diǎn)陣大小和字幕內(nèi)容里的字符個(gè)數(shù),確定出字幕占用的視頻圖像范圍;
步驟33、根據(jù)攝像頭捕捉到的視頻圖像的分辨率、字幕占用的視頻圖像范圍和用戶配置的字幕顯示位置,確定字幕疊加到攝像頭捕捉到的視頻圖像中具體的疊加位置。
本發(fā)明具有如下優(yōu)點(diǎn):
本發(fā)明在疊加字幕時(shí)不再進(jìn)行視頻格式的轉(zhuǎn)換,而是直接根據(jù)字幕的顏色得到這種顏色對(duì)應(yīng)的yuv值,確定出字幕對(duì)應(yīng)的yuv數(shù)據(jù),然后找出字幕需要疊加到視頻圖像的疊加位置,根據(jù)yuv數(shù)據(jù)及疊加位置進(jìn)行字幕的疊加,從而獲得帶有字幕的視頻圖像;這樣直接避開(kāi)了復(fù)雜的圖像處理和海量的內(nèi)存拷貝,直接減少cpu的消耗,提高系統(tǒng)性能,使相同性能的cpu可以處理更高分辨率和更大幀率的視頻圖像,從而可以得到更高清的視頻質(zhì)量。
附圖說(shuō)明
下面參照附圖結(jié)合實(shí)施例對(duì)本發(fā)明作進(jìn)一步的說(shuō)明。
圖1為本發(fā)明一種攝像頭實(shí)時(shí)快速字幕疊加的方法執(zhí)行流程圖。
圖2為本發(fā)明一種攝像頭實(shí)時(shí)快速字幕疊加的方法中生成對(duì)應(yīng)的點(diǎn)陣圖像并轉(zhuǎn)化為點(diǎn)陣數(shù)據(jù)的具體流程圖。
圖3為本發(fā)明一種攝像頭實(shí)時(shí)快速字幕疊加的方法中將點(diǎn)陣數(shù)據(jù)轉(zhuǎn)化為yuv數(shù)據(jù)的具體流程圖。
圖4為本發(fā)明一種攝像頭實(shí)時(shí)快速字幕疊加的方法中確定疊加位置的具體流程圖。
圖5為本發(fā)明一種攝像頭實(shí)時(shí)快速字幕疊加的方法中數(shù)字0的點(diǎn)陣圖像的示意圖。
具體實(shí)施方式
為使得本發(fā)明更明顯易懂,現(xiàn)以一優(yōu)選實(shí)施例,并配合附圖作詳細(xì)說(shuō)明如下。
如圖1所示,本發(fā)明的一種攝像頭實(shí)時(shí)快速字幕疊加的方法,包括如下步驟:
步驟1、根據(jù)字幕內(nèi)容和字幕的字號(hào)大小,生成對(duì)應(yīng)的點(diǎn)陣圖像,再將點(diǎn)陣圖像轉(zhuǎn)化為點(diǎn)陣數(shù)據(jù);
步驟2、根據(jù)字幕顏色和字幕透明度將點(diǎn)陣數(shù)據(jù)轉(zhuǎn)化為yuv數(shù)據(jù);
步驟3、根據(jù)攝像頭捕捉到的視頻圖像的分辨率、字幕占用的視頻圖像范圍和用戶配置的顯示位置,確定字幕疊加到攝像頭捕捉到的視頻圖像中具體的疊加位置;
步驟4、根據(jù)yuv數(shù)據(jù)及疊加位置進(jìn)行字幕的疊加,從而獲得帶有字幕的視頻圖像。
如圖2所示,所述步驟1具體為:
步驟11、用戶自行設(shè)定字幕的字形風(fēng)格,加載相應(yīng)的中文字庫(kù)和英文字庫(kù),并選定unicode編碼格式;
步驟12、用戶從中文字庫(kù)和英文字庫(kù)中獲取相應(yīng)的字幕內(nèi)容,將用戶輸入的字幕內(nèi)容進(jìn)行編碼轉(zhuǎn)化,統(tǒng)一轉(zhuǎn)化為unicode編碼格式;
步驟13、根據(jù)字幕需要顯示的字號(hào)大小,結(jié)合攝像頭捕捉到的視頻圖像的分辨率,計(jì)算出視頻圖像中每個(gè)字符(包括中文字符和英文字符)的點(diǎn)陣大??;其中,計(jì)算每個(gè)字符的點(diǎn)陣大小的計(jì)算方式為:
每次攝像頭采集出來(lái)的視頻圖像的分辨率可能是1280×720,也可能是1920×1080,也有可能是800*600等等。但是,無(wú)論攝像頭采集出來(lái)的視頻圖像的分辨率如何改變,用戶都希望字幕的每個(gè)漢字使用的大小是一個(gè)固定的物理尺寸。比如:一號(hào)字體的物理尺寸為9.17mm,如果我們的顯示屏寬是27cm,那么每一行可以顯示約30個(gè)字符。當(dāng)視頻圖像的分辨率為1280*720時(shí),每一個(gè)字符的點(diǎn)陣大小則為42x42(1280÷30≈42.67,這里直接取42);當(dāng)視頻圖像的分辨率為1920*1080時(shí),每一個(gè)字符的點(diǎn)陣大小為64x64(1920÷30=64);
步驟14、根據(jù)計(jì)算出的點(diǎn)陣大小,將unicode編碼格式的字幕內(nèi)容轉(zhuǎn)化為點(diǎn)陣圖像,再將點(diǎn)陣圖像數(shù)字化,得到點(diǎn)陣數(shù)據(jù);其中,點(diǎn)陣圖像轉(zhuǎn)化為點(diǎn)陣數(shù)據(jù)的轉(zhuǎn)化方式為:
假設(shè)每個(gè)字符的點(diǎn)陣大小是8×8,我們使用數(shù)據(jù)0來(lái)說(shuō)明點(diǎn)陣圖像同點(diǎn)陣數(shù)據(jù)之間的關(guān)系。
圖5是數(shù)字0的點(diǎn)陣圖像,與該數(shù)字0的點(diǎn)陣圖像轉(zhuǎn)化成相對(duì)應(yīng)的點(diǎn)陣數(shù)據(jù),轉(zhuǎn)化后的點(diǎn)陣數(shù)據(jù)為:
0x00
0x3c
0x42
0x42
0x42
0x42
0x42
0x3c
說(shuō)明:上面是8×8的點(diǎn)陣圖像(點(diǎn)陣圖像上的一個(gè)點(diǎn)就對(duì)應(yīng)顯示屏上的一個(gè)像素),即有8行,每行有8個(gè)表格,每個(gè)表格代表的值我們使用一個(gè)二進(jìn)制位來(lái)表示。表格里面有黑點(diǎn)的表示二進(jìn)制1,沒(méi)有黑點(diǎn)的表示二進(jìn)制0;所以,第一行表示二進(jìn)制“00000000”=0x00,第二行表示二進(jìn)制“00111100”=0x3c,以次類推,就可以將點(diǎn)陣圖像轉(zhuǎn)化為點(diǎn)陣數(shù)據(jù)。
步驟15、根據(jù)點(diǎn)陣數(shù)據(jù),確定出需要疊加的像素和不需要疊加的像素,并將需要疊加的像素標(biāo)記為1,不需要疊加的像素標(biāo)記為0。
如圖3所示,所述步驟2具體為:
步驟21、獲取字幕需要顯示的字幕顏色(顏色是由rgb值(紅綠藍(lán))來(lái)表示);
步驟22、將字幕顏色對(duì)應(yīng)的rgb值轉(zhuǎn)化為對(duì)應(yīng)的需要疊加的像素的yuv值,并將yuv值簡(jiǎn)化為y1u1v1值;其中,轉(zhuǎn)化的計(jì)算方法具體如下:
a、算法模型(rgb→yuv的變換):
b、算法公式:
y=0.299r+0.587g+0.114b;
u=-0.1678r-0.3313g+0.5b;
v=0.5r-0.4187g-0.0813b;
c、簡(jiǎn)化后的算法公式(yuv→y1u1v1):
由于cpu的浮點(diǎn)運(yùn)算都很差,所以,都需要將浮點(diǎn)運(yùn)算簡(jiǎn)化為定點(diǎn)運(yùn)算;
y1=((0.299r+0.587g+0.114b)*256)>>8;
u1=((-0.1678r-0.3313g+0.5b)*256)>>8;
v1=((0.5r-0.4187g-0.0813b)*256)>>8;
即:
y1=((77*r+150*g+29*b)>>8);
u1=((-43*r-85*g+128*b)>>8);
v1=((128*r-107*g-21*b)>>8);
步驟23、獲取字幕需要顯示的字幕透明度和攝像頭采集的視頻圖像的y0u0v0值;
步驟24、根據(jù)字幕透明度、y0u0v0值和y1u1v1值進(jìn)行修正,得到修正后的y2u2v2值;
一幅彩色圖像的每個(gè)像素用r,g,b三個(gè)分量表示,若每個(gè)分量用8位,那么一個(gè)像素共用3x8=24位表示。在用32位表示一個(gè)像素時(shí),若r,g,b分別用8位表示,剩下的8位常稱為alpha位,即通常我們說(shuō)的透明度。alpha的取值一般為0到255。當(dāng)alpha的取值為0時(shí),表示是全透明的,即字幕內(nèi)容是看不見(jiàn)的;當(dāng)alpha的取值為255時(shí),表示顯示字幕內(nèi)容是完全看的見(jiàn)的;當(dāng)alpha的取值為中間值時(shí),表示顯示字幕內(nèi)容為半透明狀態(tài)。
計(jì)算alpha時(shí),通常的方法是將源像素(字幕內(nèi)容中需要疊加的像素)的y1u1v1值,分別與目標(biāo)像素(即攝像頭采集的視頻圖像)的y0u0v0值按比例混合,最后得到一個(gè)混合后的y2u2v2值。
修正計(jì)算公式為:
y2=(y1*alpha+y0*(256-alpha))/256;
u2=(u1*alpha+u0*(256-alpha))/256;
v2=(v1*alpha+v0*(256-alpha))/256;
所以,只考慮透明度后字幕內(nèi)容的修正值如下:
y2=(y1*alpha)/256;
u2=(u1*alpha)/256;
v2=(v1*alpha)/256;
步驟25、根據(jù)計(jì)算出來(lái)的y2u2v2值,將點(diǎn)陣數(shù)據(jù)轉(zhuǎn)化為yuv數(shù)據(jù)。
如圖4所示,所述步驟3具體為:
步驟31、根據(jù)獲取的字幕所要顯示的區(qū)域(即字幕要顯示在顯示屏上的大體位置)、字幕的橫向偏移量和字幕的縱向偏移量,確定出用戶配置的字幕顯示位置;
a、字幕在顯示屏頂部居中顯示(即字幕所要顯示的區(qū)域(大體位置)),并距離顯示屏頂部p厘米(即字幕縱向偏移量),距離顯示屏左邊m厘米(即字幕的橫向偏移量)和距離顯示屏右邊n厘米(即字幕的橫向偏移量)相等;
b、字幕在顯示屏左下方顯示(即字幕所要顯示的區(qū)域(大體位置)),并距離顯示屏底部q厘米(即字幕縱向偏移量),距離顯示屏左邊m厘米(即字幕的橫向偏移量);
c、字幕在顯示屏右下方顯示(即字幕所要顯示的區(qū)域(大體位置)),并距離顯示屏底部q厘米(即字幕縱向偏移量),距離顯示屏右邊n厘米(即字幕的橫向偏移量);
步驟32、根據(jù)每個(gè)字符的點(diǎn)陣大小和字幕內(nèi)容里的字符個(gè)數(shù),確定出字幕占用的視頻圖像范圍;即有:
根據(jù)每個(gè)字符的點(diǎn)陣大小(如m×n)和字幕內(nèi)容里面的字符個(gè)數(shù)y,確定字幕占用的視頻圖像范圍為:(my)×n;
例:如果每個(gè)字符的點(diǎn)陣大小是8×8,如果字幕內(nèi)容有10個(gè)字符,則字幕占用的視頻圖像范圍為:80×8;
步驟33、根據(jù)攝像頭捕捉到的視頻圖像的分辨率、字幕占用的視頻圖像范圍和用戶配置的字幕顯示位置,確定字幕疊加到攝像頭捕捉到的視頻圖像中具體的疊加位置。
本發(fā)明的優(yōu)點(diǎn)如下:
本發(fā)明在疊加字幕時(shí)不再進(jìn)行視頻格式的轉(zhuǎn)換,而是直接根據(jù)字幕的顏色得到這種顏色對(duì)應(yīng)的yuv值,確定出字幕對(duì)應(yīng)的yuv數(shù)據(jù),然后找出字幕需要疊加到視頻圖像的疊加位置,根據(jù)yuv數(shù)據(jù)及疊加位置進(jìn)行字幕的疊加,從而獲得帶有字幕的視頻圖像;這樣直接避開(kāi)了復(fù)雜的圖像處理和海量的內(nèi)存拷貝,直接減少cpu的消耗,提高系統(tǒng)性能,使相同性能的cpu可以處理更高分辨率和更大幀率的視頻圖像,從而可以得到更高清的視頻質(zhì)量。
雖然以上描述了本發(fā)明的具體實(shí)施方式,但是熟悉本技術(shù)領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,我們所描述的具體的實(shí)施例只是說(shuō)明性的,而不是用于對(duì)本發(fā)明的范圍的限定,熟悉本領(lǐng)域的技術(shù)人員在依照本發(fā)明的精神所作的等效的修飾以及變化,都應(yīng)當(dāng)涵蓋在本發(fā)明的權(quán)利要求所保護(hù)的范圍內(nèi)。