0 引言
隨著信息科學技術發展速度的加快,對圖像處理精確度越發精確,對圖像處理速度的要求越發加快。傳統的 PC 圖像處理技術與嵌入式圖像處理技術相比,其最為顯著的優點是可以將圖像簡單地、快速地處理出來,但其缺點就是成本高、需要大量電子設備、結構復雜、設備的保養和運輸不方便; 雖然嵌入式系統微型化、小型化,但其不僅能滿足圖像處理系統的要求,還具有便于攜帶、使用方便、功耗小等優點?;谇度胧较到y的圖像處理系統的實現,體現出了其穩定性好、易于開發維護、通用性強、成本低等特點,具有傳統 pc 圖像處理系統不具備的特點。嵌入式系統的強大的兼容性,模塊化設計,使其開發的時間短,易于維護; 嵌入式系統圖像處理系統的小巧性,使其配置拆裝靈活,其實時性比桌面操作系統的圖像處理系統好,具有非常好的應用前景。
1 嵌入式硬件設備
嵌入式系統的硬件設備選擇:
SDRAM 內存: 時鐘頻率 100 MHz 以上 、32 bit 的數據總線。
FLASH 存儲: 已經安裝 BIOS 的 125 M Nand Flash.
LCD 顯示: 帶觸摸功能的 3. 5 寸 LCD,分別率 240 × 320.
接口: USB Host、JTAG 接口和串口等。
S3C6410 處理器支持 NAND FLASH 的啟動方式,通過配置引腳的不同通電狀態來確定 NAND FLASH 的啟動方式。
Flash 閃存可以為各種移動設備用作存儲設備,在嵌入式系統中作為存儲設備。
S3C6410 處理器攝像頭支持 ITU - BT 601 /656 8 位模式,支持 4 096 ×4 096 像素點。
開發上引出了攝像頭接口,可直接使用配套的攝像頭模塊,采用 10 × 20 插針接口方式。攝像頭接口有 CAMERA 信號、ⅡC 信號,這兩個信號用來配置 CMOS 攝像頭相關參數; 還有一個 GPIO 信號,主要應用于 CAMERA 的上電控制,協助系統實現電源管理。
圖像輸出模塊利用 LCD 觸摸屏實現,S3C6410 開發板的LCD 接口,屬于 40 pin 下接 FPC 座( 0. 5 mm 間距) ,包含了常見的控制信號,如行場掃描信號、時鐘信號和使能信號等、背光控制信號 LCD_PWR、RGB 數據信號、為 PWM 輸出信號和復位信號( NRESET) ,其中 LCD_PWR 是背光控制信號。
2 軟件編寫
嵌入式 Linux 操作系統的開發環境主要是由目標板和宿主機構成。在宿主機上完成應用程序的開發和操作系統內核的編譯,在目標板上運行系統程序和軟件系統。嵌入式平臺的開發,一般都是在宿主機上完成交叉編譯環境的調試,然后通過串口和目標板連接起來。把一臺 PC 機作為嵌入式開發的宿主機,并建立交叉編譯環境,在其環境中實現程序設計,并生產執行代碼,最后移植到開發板上,實現程序的開發。Boot-loader 導程序主要是嵌入式系統啟動,目標板打開,首先 Boot-loader 引導程序啟動嵌入式系統,Bootloader 引導程序在目標板板上先執行首段代碼的啟動。在 PC 機中,先制作 Bootloader引導程序,然后將其將引導 liunx 系統啟動,運行 liunx 內核和根文件系統,從而整個程序運行起來。BIOS 會將控制轉移給引導程序; 只要引導程序啟動,將執行系統的初始化工作。使Linux 結構建立起來,在圖形界面運行,如圖 1 所示。
嵌入式系統也可以看作是一個特殊的計算機系統,在計算機開機時需要 BIOS 作為引導程序啟動操作系統。嵌入式系統的 Bootloader 引導程序就同計算機的 BIOS 作用一樣,引導嵌入式操作系統的啟動,然后將控制全轉移選操作系統。
Bootloader 有 2 種模式,包括有啟動加載和下載模式。
Bootloader 的正常工作下運行的模式是啟動加載模式。Boot-loader 引導程序宿主機下載到目標板的存儲模塊中,然后引導程序啟動嵌入式操作系統。下載模式就是目標板上的 Boot-loader 通過串口連接下載方式在開發板上運行宿主機上編譯好的應用程序。Bootloader 引導程序的啟動過程兩個階段。代碼和 CPU 體系結構一樣,第一個階段放置設備的初始化程序,使用 ARM 匯編語言來完成。第二個階段是用 C 語言來完成,從而實現程序的功能。將壓縮包 uboot1. 1. 6_FORLINX_6410.
tgz 放到 Ubuntu / forlinx 目錄下,解壓縮并編譯,Ubuntu 下的操作過程如下所示:
#tar zxf uboot1. 1. 6_FORLINX_6410. tgz#cd uboot1. 1. 6#make smdk6410_config#make claen#make嵌入式系統 Linux 內核的配置和移植,在宿主機上下載linux - 2. 6. 28,在配置之前對 Makefile 文件交叉編譯環境進行修改。將壓縮包 Linux2. 6. 28_FOLINX_6410. tgz 放到工作目錄下,解壓縮: #tar zxf Linux2. 6. 28_FOLINX_6410. tgz配置內核:
1) 需要安裝 Libncurses5,方便使用 make menuconfig 命令,可以采用以下命令安裝:#sudo apt - get instell Libncurses5 - dev2) 恢復內核的默認配置:#cd linux2. 6. 28#cp FORLINUX6410_CFG . config3) 液晶屏類型的選擇:#make menuconfig選擇液晶屏類型,在\\linux - 2. 6. 28 \\demo 文件目錄下已包含了 3. 5 寸、4. 3 寸、5. 6 寸、7 寸、8 寸、vga 輸出的內核映像。4) 編譯內核:#make zImagezImage 就是編譯完成后產生的內核映像文件編。最后配置完文件系統就可繼續接下來的編程。
3 圖像采集與顯示
驅動程序使用的結構和符號,都在 include/linux/videodev. h文件中。Video4Linux 設備驅動模塊在內核中的 drivers/media/video / videodev. c 文件中,開發人員可以在模塊的基礎上通過對內核接口的開發作出自己需要的設備驅動程序。
在 Linux2. 6. 28 內核中,主要是對 fb_fix_screen_for 和 fb_var_screeninfor 進行 FrameBuffer 結構變量的控制。顯示程序:
struct fd_fix_screeninfor finfo;struct fd_var_screeninfor vinfo;ioctl( fb,FBIOGET_FSCREENINFO,&finfor) ;int fb = open( " / dev / fbo" ,O_RDWR) ;ioctl( fb,FBIOGET_VSCREENINFO,&vinfor) ;以上程序聲明了設備的固定和可變結構體,并獲得了顯存的地址、分辨率、顏色等。
creansize = vinfor. xres * vinfor. yres * vinfor. bits_per_pix-el /8;* fb = map( 0,screansize,PROT_READ | PROT_WRITE,MAP_SHARED,fb,0) ;設置了 screensize 的大小和起始地址,其內存起始位置為fb,然后圖像將會在 LCD 上顯示出來。
memset( fbp,0,screensize) ; 此條程序為清屏操作。主要的主程序為:打開設備( nb. fb =open( "/dav/video4linux/video",O_RDWR) ) <0){ qerror( "video4linux_open") ; exit( l) ; }獲得圖像的信息Printf"capability. name: s \\ n". vb. capability. nama) ;Ioctl( vb. fb,VIDIOCGPICT,&( vb. picture) ) ; 采集顯示圖像Ioctl( nb. nb,VIDIEOCMCAPTURER,&( nb. mmap) ) ;Ioctl( nb. nb,VIDIEOCSYNCY,&( vb. frame_current) ) ;Imageshow( vb. mmap + vb. buf. offsets[0]) ;保存圖像關閉設備Fwrite( mg,IMGSIZE,l,pf) ;Close( vb. fb) ;4 基于 Qt 圖像平臺設計。
實現后的用戶圖形界面通過 Qt 開發環境的 Qt Designer設計實現。Qt Designer 可以直觀地對用戶圖形界面進行布局,其文件格式為。 ui,并生成。 h 文件,為功能的具體實現提供方便。Qt 中采用 signals/slots 信號響應機制,使得各個元件之間的協同工作變得十分簡單,圖形顯示程序代碼:void ImageProcessing : : onScanBtn ( ){ QFileDialog: : getOpenFileName( this,tr( "Open Image File") ,"C: \\ \\ ",tr( "Setings Files ( * .jpg) ") ) ; }
信號和槽的關聯:QObject: : connect ( Button _11,SIGNAL ( clicked ( ) ) ,this,SLOT( onScanBtn( ) ) ) ;圖像流程程序部分代碼:圖像數據讀取char * pImageBytes = ( uchar * ) srcImage.bits( ) ;int depth = srcImage. depth( ) ;int lineBytes = srcImage. bytesPerLine( ) ;int w = srcImage. width( ) ;int h = srcImage. height( ) ;uchar * pByte;if( 8 = = depth){ pByte = pImageBytes + i* lineByte + j;data[i* w + j]= std: : complex < double > ( * pByte,0) ; }else if( 32 = = depth;{ pByte = pImageBytes + i* lineBytes + j* 4;Uchar pixelValue = ( uchar) ( 0. 299 * ( float) pByte[0] +0. 587* ( float) pByte + 0. 114* ( float) pByte[2]) ;data[i* w + j]= std: : complex < double > ( pixelValue,0) ;圖像數據的回寫for( int i = 0; i < h; i + + ){ for( int j =0; j < w; j ++ ){ double spectral =abs( data[i* w +j]) * coef; / /灰度值調整spectral = spectral > 255? 255: spectral;/ / 根據圖像格式寫數據if( 8 = = depth){ pByte = pImageBytes + i* lineBytes + j;* pByte = spectral; }else if( 32 = = depth){ pByte = pImageBytes + i* lineBytes + j* 4;pByte[0]= pByte[1]= pByte[2] =spectral; }處理進度函數QProgressDialog progress ( tr( "處 理 進 度 …") , tr( "取消") ,0,10 000,this) ;progress. setWindowModality( Qt: : WindowModal) ;progress. setWindowTitle( tr( "圖像處理中…") ) ;progress. setMaximumSize( 150,60) ;progress. setMinimumSize( 150,60) ;progress. show( ) ; / / readImage( data,sourceImage) ;for ( int i = 0; i < 10 000; i + + ){ progress. setValue( i) ;qApp - > processEvents( ) ;if ( progress. wasCanceled( ) )break; / / … 復制文件處理。qDebug( ) < < i; }progress. setValue( 10 000) ;最終實現圖形化界面。
5 結語
1) 在虛擬機上安裝 Linux 系統并完成交叉編譯環境的建立; kernel 的編譯和移植; 制作文件系統。從而為后續的項目開發創建出了軟件環境。
2) 對 Video4Linux 的驅動程序的開發和設計,完成了 Vide-o4Linux 開發圖像采集驅動程序,采集的圖像既可以直接用作圖像的處理,也可以保存在內存映像中,用 FrameBuffer 進行圖像的顯示。
3) 利用 QT 開發圖像處理系統的圖形界面。優化和改進圖像處理系統的算法,最終完成了圖像的平滑、圖像的銳化、圖像的邊緣檢測和浮雕顯示等圖像處理功能程序編寫。
4) 將宿主機上的成果移植到 ARM11 的硬件平臺上,實現圖像的采集和圖像的處理,在圖像處理方面,其處理速度更快、圖像更加精確。
參考文獻:
[1] 孫瓊。 嵌入式 Linux 應用程序開發詳解[M]. 北京: 人民郵電出版社,2006.
[2] 周立功,陳明計,陳渝。 ARM 嵌入式 Linux 系統構建與驅動開發范例[M]. 北京: 北京航空航天大學出版社,2006.
[3] RafaelC. Gonzalez,RichardE. Woods,StevenL. Eddins. 數字圖像處理[M]. 北京: 電子工業出版社,2005.
[4] 田澤。 嵌入式系統開發與應用[M]. 北京: 北京航空航天大學出版社,2005.