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