文獻(xiàn)標(biāo)識碼: A
文章編號: 0258-7998(2015)04-0025-04
0 引言
目前機(jī)載字符顯示主要分為點(diǎn)陣字符顯示與矢量字符顯示。兩種顯示方式各有優(yōu)缺點(diǎn),點(diǎn)陣字符大小固定,輸出簡單;矢量字符大小可調(diào),輸出靈活,但依賴于反走樣直線與反走樣圓弧的實(shí)現(xiàn)效果,實(shí)現(xiàn)較為復(fù)雜。另外,通常字符的旋轉(zhuǎn)、縮放等變換是對字符像素點(diǎn)進(jìn)行復(fù)數(shù)乘法運(yùn)算,計算坐標(biāo)時存在小數(shù)的四舍五入,因此會出現(xiàn)明顯的走樣現(xiàn)象。
本文綜合考慮點(diǎn)陣字符與矢量字符的優(yōu)缺點(diǎn),首先在VxWorks[1]操作系統(tǒng)下利用FreeType字體引擎實(shí)時提取矢量字形并利用其自帶的API函數(shù)完成旋轉(zhuǎn)、描邊等字形變換,接著再渲染成高質(zhì)量、抗鋸齒的256級灰度值位圖,然后通過PCI-E總線將灰度值點(diǎn)陣傳輸至底層FPGA,最后由FPGA根據(jù)優(yōu)化后的融合算法完成字符與外部視頻的疊加并顯示。
上述字符生成流程既能靈活實(shí)時提取各種尺寸的字符,又可以簡單地輸出,不失真地旋轉(zhuǎn),同時還具有優(yōu)良的描邊效果。通過反復(fù)驗(yàn)證提出一種背景融合算法,成功解決了字符與視頻背景疊加時出現(xiàn)的邊緣灰度值突變問題,實(shí)現(xiàn)了字符與視頻背景的高質(zhì)量疊加。
1 機(jī)載平顯系統(tǒng)組成
本文所研究的內(nèi)容為“新一代機(jī)載綜合平視顯示系統(tǒng)”的重要組成部分,旨在研制擁有自主知識產(chǎn)權(quán)、靈活可重構(gòu)的機(jī)載視頻處理與圖形字符生成系統(tǒng),形成包括底層硬件平臺、系統(tǒng)軟件平臺、圖形字符繪制接口以及底層圖形繪制IP核的核心解決方案。
圖1為機(jī)載平視顯示系統(tǒng)的組成框圖,它由三大部分組成,其中核心部分機(jī)載字符顯示系統(tǒng)由4個模塊組成,圖中各組成部分與模塊的功能如下:
(1)字符繪制接口:運(yùn)行在VxWorks操作系統(tǒng)上[2],根據(jù)上層應(yīng)用程序中有關(guān)繪制字符指令中的參數(shù),實(shí)時提取出相應(yīng)字符信息,以特定的指令格式交由PCI-E設(shè)備,實(shí)現(xiàn)頂層應(yīng)用程序與底層硬件的無障礙通信。
(2)FIFO(First In First Out,先入先出隊(duì)列):用于暫存PCI-E設(shè)備發(fā)送的繪制指令,供底層IP核讀取。
(3)繪制IP核取指令:作為底層硬件平臺的核心,IP核從FIFO中讀取字符繪制的指令,包括字符繪制參數(shù)及字符灰度值信息。
(4)視頻背景融合:IP核同時讀取視頻背景的RGB值與加黑邊字符的灰度值,按特定算法進(jìn)行融合處理。
2 字符生成及字形變換
2.1 TrueType字庫及FreeType字體引擎
TrueType[3]是蘋果公司和微軟公司合作開發(fā)的一種新型數(shù)字化矢量字體格式,采用幾何學(xué)中的二次B樣條曲線及直線來描述字體外形輪廓。本系統(tǒng)暫定需要95個字符,包括26個英文字符的大小寫、10個阿拉伯?dāng)?shù)字和33個標(biāo)點(diǎn)符號。所以選用Arial.ttf存儲在非易失存儲器中,上電再調(diào)入內(nèi)存,供字體引擎提取。
FreeType是使用ANSI C開發(fā)的開源字體引擎,利用它可以不用關(guān)心TrueType字庫文件格式,僅需調(diào)用FreeType的應(yīng)用程序接口(Application Programming Interface,API)函數(shù)完成大部分的工作,而且FreeType可以在包括VxWorks的多種操作系統(tǒng)平臺下編譯運(yùn)行。
針對嵌入式系統(tǒng)存儲容量相對較小以及機(jī)載平臺對代碼運(yùn)行速度的要求,需要對FreeType這個高度可定制的字體引擎進(jìn)行定制和裁剪[4]。通過對字體引擎的定制和裁剪,有效減小了庫文件的體積,加快了代碼的運(yùn)行速度。
2.2 嵌入式矢量字符顯示
圖2為嵌入式矢量字符顯示流程,圖中各個模塊的功能具體如下:
(1)初始化庫并裝載字體文件
調(diào)用FT_Init_FreeType初始化庫,先創(chuàng)建一個FreeType庫的新實(shí)例,并且設(shè)置句柄library為它,然后裝載庫中的每一個模塊。調(diào)用FT_New_Face裝載字體文件,創(chuàng)建一個新的face對象用來描述一個特定的字樣和風(fēng)格,本系統(tǒng)裝載的是Arial.ttf。
(2)設(shè)置當(dāng)前像素尺寸
調(diào)用FT_Set_Pixel_Size設(shè)置像素尺寸,設(shè)置的大小以像素為單位。按照本項(xiàng)目的相關(guān)技術(shù)協(xié)議,字符的尺寸為16×16~32×32范圍內(nèi)的任意值。
(3)裝載字形圖像
調(diào)用FT_Cet_Char_Index得到字符索引,進(jìn)行相應(yīng)的字形變換后,再調(diào)用FT_Load_Glyph將字符輪廓信息讀取到字形槽中。
(4)設(shè)置渲染模式獲取字符位圖
調(diào)用FT_Render_Glyph將字符槽中的字形圖像轉(zhuǎn)換成一個256級灰度的抗鋸齒位圖。
2.3 字形變換
調(diào)用FT_Set_Transform對其進(jìn)行仿射變換,完成字形的旋轉(zhuǎn)、傾斜、縮放等操作。本系統(tǒng)要求完成字符的0°~360°順時針旋轉(zhuǎn),且是否旋轉(zhuǎn)由上層控制。根據(jù)上層給出旋轉(zhuǎn)的角度,對2×2的仿射矩陣賦值。
上一代平顯系統(tǒng)中的旋轉(zhuǎn)由底層FPGA實(shí)現(xiàn),但FPGA在計算字符像素點(diǎn)坐標(biāo)時存在四舍五入,且旋轉(zhuǎn)可能導(dǎo)致的維數(shù)變化會造成像素空洞,直接影響顯示的效果。利用FreeType字體引擎完成旋轉(zhuǎn)屬于對字形圖像的變換,基于字符的描述信息而不是字模數(shù)據(jù),通過這種方式進(jìn)行旋轉(zhuǎn)后再提取位圖并顯示,效果得到明顯的改善。圖3為兩種不同旋轉(zhuǎn)方法得到的效果圖。
3 強(qiáng)背景識別技術(shù)
在顯示機(jī)載畫面時,由于字符疊加在視頻背景上,當(dāng)字符與背景的顏色相近或視頻背景亮度較大時,往往會出現(xiàn)字符看不清楚的情況,給飛行員的駕駛帶來潛在的隱患。所以為了在強(qiáng)背景環(huán)境下有效識別出字符信息,需要對字符進(jìn)行描邊處理。
3.1 傳統(tǒng)字符描邊方法
3.1.1 一位二進(jìn)制字符加一位二進(jìn)制描邊
在上一代平顯系統(tǒng)中,字符部分與描邊部分每個像素點(diǎn)都使用一位二進(jìn)制數(shù)來表示。當(dāng)代表像素點(diǎn)的數(shù)為1時,表示字符經(jīng)過此位置,則將該位置的像素設(shè)置為字符顏色;當(dāng)代表像素點(diǎn)的數(shù)為0時,表示字符不經(jīng)過此位置,則將此位置的像素設(shè)置為背景顏色。因?yàn)槊總€像素點(diǎn)僅用一個二進(jìn)制位表示,所以顯示在屏幕上時字符鋸齒化明顯,邊緣不夠圓潤,且旋轉(zhuǎn)后整體較為模糊。
上述二值點(diǎn)陣字符描邊方法較為簡單,直接在點(diǎn)陣字符的邊緣加上黑色邊框即可,但是顯示效果極為粗糙,如圖4(a)所示。
3.1.2 灰度值(256級)字符加一位二進(jìn)制描邊
256級灰度值字符由FreeType提取,并采用傳統(tǒng)描邊的方法:通過掃描字符點(diǎn)陣的每一個像素點(diǎn),對每個灰度值不為零的像素點(diǎn)進(jìn)行判斷,若判斷為邊界點(diǎn)則將該像素點(diǎn)周圍四個鄰域或八個鄰域內(nèi)灰度值非零的像素點(diǎn)置為描邊點(diǎn)。
雖然這種描邊方法簡單易行,但是實(shí)際顯示效果并不理想。在初始大小下,可以看到原始字符部分由于使用FreeType提取,效果較一位二進(jìn)制字符有明顯改善,描邊部分雖清晰可見,但較為生硬。放大若干倍后,可以發(fā)現(xiàn)描邊毛刺棱角較多,走樣明顯,不適于飛行員長期觀察,如圖4(b)所示。
3.2 FreeType描邊
鑒于使用鄰域掃描描邊方法的顯示效果不佳,所以需要尋找另一種顯示效果好的描邊方法。研究發(fā)現(xiàn)調(diào)用FreeType自帶的API函數(shù)對字符進(jìn)行描邊處理效果較好,如圖4(c)所示,具體步驟如下:
(1)在進(jìn)行完字形變化并將字形讀取到字符槽后,調(diào)用FT_Get_Glyph把字形槽中的字形圖像復(fù)制到新的glyph1對象中,然后調(diào)用FT_Stroker_New創(chuàng)建一個筆觸,并調(diào)用FT_Stroker_Set設(shè)置筆觸為描邊;
(2)對glyph1的字形調(diào)用FT_Glyph_StrokeBorder設(shè)置為描邊渲染,設(shè)置渲染參數(shù),調(diào)用FT_Outline_Render渲染這個描邊的字形圖像glyph1,如圖5(a);
(3)調(diào)用FT_Glyph_Get_Cbox檢索glyph字形圖像,獲取該描邊字形的寬度、高度等信息;
(4)再次調(diào)用FT_Get_Glyph把字形槽中的字形圖像復(fù)制到新的glyph2對象中,重新設(shè)置渲染參數(shù),調(diào)用FT_
Outline_Render渲染這個字符本身的glyph2,如圖5(b);
(5)開辟一個緩存,存放glyph1與glyph2疊加后的像素信息。
4 背景融合技術(shù)
與傳統(tǒng)加一位二進(jìn)制描邊不同,使用FreeType為字符加上的描邊同樣具有256級灰度,所以描邊顯得光滑圓潤,但同時也帶來了新的問題。由于FreeType中生成的描邊信息的邊緣基于純白背景,灰度值會有向255漸變的趨勢,所以在黑色背景下邊緣灰度值與背景灰度值相差過大,嚴(yán)重影響顯示效果,因此需要對描邊與周圍視頻背景作相應(yīng)的融合處理。
圖6為未進(jìn)行背景融合的數(shù)字3在不同灰度值背景下顯示的效果。
除在純白背景下,黑邊外都會有與背景不協(xié)調(diào)的白邊,特別在純黑背景下描邊效果最差。圖6(a)、(b)、(c)、(d)中背景灰度值分別為:0、127、255、隨機(jī)灰度值。
將描邊的灰度值與背景以一定比例進(jìn)行融合,使得黑色描邊與背景線性相關(guān),可以有效減少描邊外圍白色邊框的產(chǎn)生。目前項(xiàng)目僅要求顯示黑白灰度值字符,所以字符RGB 3個分量都等于其灰度值。但是考慮到背景的RGB分量并不一定相等,所以在融合時需要將底層IP核分開計算。
(1)如果為描邊:
R[x+r][y+c]=(255-gray[r][c])*bg_R[x+r][y+c]/255;
G[x+r][y+c]=(255-gray[r][c])*bg_G[x+r][y+c]/255;
B[x+r][y+c]=(255-gray[r][c])*bg_B[x+r][y+c]/255;
(2)如果不是描邊:
R[x+r][y+c]=gray[r][c];
G[x+r][y+c]=gray[r][c];
B[x+r][y+c]= gray[r][c];
其中x、y為字符在屏幕上的繪制坐標(biāo),r、c為當(dāng)前灰度值點(diǎn)在提取字符中的行號與列號,gray[][]為當(dāng)前像素點(diǎn)的灰度值,bg_R[][]、bg_G[][]、bg_B[][]依次為背景的RGB 3個分量值。
圖7為進(jìn)行了背景融合后的字符顯示效果,其中(a)~(d)背景灰度值為127,(e)為隨機(jī)彩色背景。
5 繪制指令傳輸
5.1 上位機(jī)繪制接口
為方便上層用戶調(diào)用繪制字符指令,系統(tǒng)自定義字符繪制接口函數(shù)如下:
void WriteChar(int CharSize, int CharCode, int Angle, int X, int Y);
其中X、Y為字符輪廓左上角的橫縱坐標(biāo);Angle為字符旋轉(zhuǎn)弧度值,范圍是0~2π;CharCode為字符ASCII碼,范圍是33~127;CharSize為字符大小。
5.2 寫入FIFO的指令格式
繪制字符指令格式如表1所示。
(1)命令字:五位二進(jìn)制數(shù),用以確定繪制指令的類型。
(2)字符X坐標(biāo)、Y坐標(biāo):同5.1中X、Y坐標(biāo)。
(3)總行數(shù)、總列數(shù): 發(fā)送字符數(shù)組的行列數(shù)。由底層FPGA根據(jù)總行數(shù)、總列數(shù)計算出總點(diǎn)數(shù),用來判斷傳輸某個字符的最后一個32位數(shù)是否寫滿(當(dāng)總點(diǎn)數(shù)不是3的整數(shù)倍時)。
(4)灰度值1、2、3: 3個連續(xù)點(diǎn)的灰度值信息,灰度值為0~255,需要8位二進(jìn)制數(shù)表示。
(5)描邊點(diǎn)標(biāo)志1、2、3: 用來判斷相應(yīng)點(diǎn)是否為描邊點(diǎn),如果為描邊點(diǎn)則進(jìn)行背景融合。
5.3 實(shí)時性分析
在給定的標(biāo)準(zhǔn)測試畫面中,除字符外還有點(diǎn)、線、圓等基本圖元。經(jīng)統(tǒng)計,標(biāo)準(zhǔn)測試畫面中3種大小字符平均所需命令數(shù)分別為88、196、347。3種大小字符的個數(shù)分別為7、89、32。
一幀需要傳輸?shù)?2位長整形數(shù)(包括字符和圖形指令)約為29 669個,其中字符29 164個,約占98%。
以每秒24幀計,計算后得到的指令吞吐量約為6.79 MB/s。若考慮字符旋轉(zhuǎn)后像素點(diǎn)增加20%,則吞吐量最大約為8.12 MB/s,遠(yuǎn)小于PCI-E總線的單向數(shù)據(jù)傳輸速率2.5 Gb/s,所以字符的傳輸滿足系統(tǒng)的實(shí)時性要求。
6 結(jié)論
上述在VxWorks中字符的顯示方案已經(jīng)成功應(yīng)用于機(jī)載座艙信息顯示系統(tǒng)中,不僅滿足機(jī)載設(shè)備的實(shí)時性要求,而且字符生成靈活、顯示效果優(yōu)良,具有相當(dāng)廣闊的應(yīng)用前景。
參考文獻(xiàn)
[1] VxWorks programmer′s guide 5.5 edition 1[Z].Wind River Systems Inc.,2000.
[2] 孔祥營,柏桂枝.嵌入式實(shí)時操作系統(tǒng)VxWorks及其開發(fā)環(huán)境[M].北京:中國電力出版社,2002.
[3] 孫楓,陳業(yè)夫,郭勇鵬.在VxWorks系統(tǒng)中使用TrueType字庫[J].應(yīng)用科技,2003,30(11):53-55.
[4] 陳文文,奚宏生.嵌入式系統(tǒng)中的TrueType字體驅(qū)動[J].計算機(jī)工程,2010,36(7):257-259.