《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計應(yīng)用 > 基于背景融合的機(jī)載字符生成
基于背景融合的機(jī)載字符生成
2015年電子技術(shù)應(yīng)用第4期
沈夢杰,周建江,韋小杰,葉 明
南京航空航天大學(xué) 電子信息工程學(xué)院,江蘇 南京210016
摘要: 分析了在VxWorks操作系統(tǒng)下,如何利用FreeType字體引擎提取高質(zhì)量字符并不失真地進(jìn)行字形變換。另外,為了讓飛行員能在復(fù)雜的視頻背景中識別出字符,提出了一種字符描邊方法和一種視頻背景融合算法。實(shí)驗(yàn)證明,新的解決方案既保證了顯示效果,又符合實(shí)時系統(tǒng)對傳輸速度的要求。
關(guān)鍵詞: 背景融合 描邊 FreeType Vxworks
中圖分類號: TP391
文獻(xiàn)標(biāo)識碼: A
文章編號: 0258-7998(2015)04-0025-04
Airborne character generation based on background fusion
Shen Mengjie,Zhou Jianjiang,Wei Xiaojie,Ye Ming
College of Electronics and Information Engineering,Nanjing University of Aeronautics and Astronautics,Nanjing 210016,China
Abstract: This paper analyzes how to use the FreeType font engine to extract high-quality characters as well as glyph transformation without any distortion based on the VxWorks operating system. Besides, in order to allow the pilot to identify characters in the complex video background, this paper proposes a method of character stroke and an algorithm of video background fusion. Experiments show that new solutions not only ensure the display effect, but also meet the real-time system requirements on the transmission speed.
Key words : background fusion;stroke;FreeType;VxWorks

 

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核的核心解決方案。

001.jpg

  圖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 嵌入式矢量字符顯示


002.jpg

  圖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)方法得到的效果圖。

003.jpg

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)所示。

004.jpg

  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è)置筆觸為描邊;

005.jpg

  (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)的融合處理。

006.jpg

  圖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個分量值。

007.jpg

  圖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所示。

008.jpg

  (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.


此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。