符多鐸,譚秋林,王紅亮,王道勝
(中北大學儀器科學與動態測試教育部重點實驗室電子測試技術國家重點實驗室,山西 太原 030051)
隨著科學技術的發展,圖像采集與處理技術的應用越來越廣泛。設計能夠實現圖像采集與圖像處理一體化、結構緊湊并能有效降低成本的專用圖像處理系統,將具有很大的市場應用前景。如果采用計算機作為主處理器,用PCI或其他總線接口來實現圖像采集,雖然圖像數據采集的實時性能得到保證,但系統的體積大,整體結構復雜,不便于應用到便攜式環境中[1]。但如果采用單片機或FPGA這類微處理器來代替計算機,這時圖像數據采集的實時性又難以實現,從而導致系統的整體性能降低。近年來,隨著嵌入式技術的發展,ARM處理器運算的能力不斷地增強以及處理圖像的技術不斷地提高,基于ARM的圖像采集廣泛地被用于各個領域[2-5]。本系統采用S3C6410作為處理器,實現了基于ARM11實時對攝像頭圖像進行采集,并增強了圖像采集的性能。
本系統硬件平臺主要是ARM11開發板加上一些輔助性的外圍設備,用到的外圍設備主要有網絡端口、CMOS攝像頭等。開發板采用的是韓國三星公司的S3C6410處理器,該處理器功能強大,采用ARM1176JZF-S的核,包含16 kbyte的指令數據Cache和16 kbyte的指令數據TCM。使用的攝像頭是OV9650攝像頭,這款攝像頭采用 CMOS 圖像傳感器,支持 YUV,RGB565,RGB555,GRB,RAW RGB等多種輸出格式,全部可以通過寄存器來設置。本方案主要用到RGB輸出模式,OV9650主要通過PCLK時鐘與HREF來控制8 bit并行數據的傳輸。
平臺的軟件系統采用嵌入式Linux系統,它是源碼開放的嵌入式操作系統,支持多任務,具有完備的TCP/IP協議棧并支持多種文件系統[6]。另外Linux系統能夠方便地進行移植和內核定制,也使得本系統實現起來較為方便和簡單,如Video4Linux2內核應用編程接口函數,能實現對OV9650攝像頭單幀圖像的采集,并保存成文件供進一步處理。
系統組成如圖1所示。

圖1 系統組成框圖
往開發板中燒寫嵌入式Linux操作系統的具體的操作流程如下:
1)打開軟件SD-Flasher.exe燒寫軟件,將FAT32格式的SD卡連入計算機,將要燒寫的u-boot燒寫到SD卡中。利用串口調試軟件dnw來訪問開發板,并將u-boot文件拷貝到開發板的nandflash中。點擊serial port/transmit,如圖2 所示。

圖2 dnw軟件菜單選項(截圖)
2) 選擇文件“u-boot_nand_ram256.bin”,打開后將Linux內核燒寫到NandFlash里面。
3)接下來將UBIF文件系統拷貝到開發板中,選擇文件 rootfs_qtopia_qt4-mlc2.ubi,打開,這樣就完成了將文件系統燒寫到NandFlash中,如圖3所示。

圖3 dnw軟件選擇文件系統相關文件(截圖)
4)重新啟動開發板,這樣就可以進入Linux系統了。
下位機服務器端程序流程如圖4所示。

圖4 下位機服務器端程序流程圖
首先,打開OV9650攝像頭設備,在/dev下會有設備/dev/video0,打開設備/dev/video0,通過ioctl函數即可以對攝像頭設備進行操作,將采集到的圖像傳遞給socket網絡服務器端口,socket套接字將數據發送到網絡端口上,本設計網絡端口號設為8888。
本設計中圖像采集主要是靠Linux中視頻設備內核驅動Video4Linux2來實現的。在Linux中,訪問視頻設備可以像訪問普通文件一樣進行讀寫,攝像頭在/dev/video0下。
Video4Linux2在本設計中用到的結構體及其說明如下:

本設計用到命令標識符及其功能說明如下:

Video4Linux2下視頻編程的流程如下:
1)打開視頻設備;
2)通過ioctl函數查詢驅動功能;
3)通過ioctl函數獲取設備的輸入;
4)通過ioctl函數查看當前設備是否有輸入輸出數據;
5)通過ioctl函數獲取并設置幀參數;
6)通過ioctl函數開始采集數據。
關于socket服務器端TCP協議編程如下:
下面幾個函數是本程序中用到的socket API,這些函數都在 sys/socket.h 中。
1)int socket(int family,int type,int protocol);//打開網絡通訊端口
2)int bind(int sockfd,const struct sockaddr*myaddr,socklen_t addrlen);//將參數sockfd和myaddr綁定在一起,使sockfd這個用于網絡通訊的文件描述符監聽myaddr所描述的地址和端口號
3)int listen(int sockfd,int backlog);//listen()聲明sockfd處于監聽狀態
4)int accept(int sockfd,struct sockaddr*cliaddr,socklen_t*addrlen);//三次握手完成后,服務器調用accept()接受連接
服務器程序結構為:


整個服務器程序是一個while死循環,每次循環處理一個客戶端連接,通過connfd進行通信,然后關閉connfd斷開連接,而不關閉listenfd。accept()成功返回一個文件描述符,出錯返回-1。
上位機客戶端程序流程如圖5所示。

圖5 上位機客戶端程序流程圖
打開系統本身自帶的framebuffer,并進行初始化,利用內存映射將framebuffer映射到內存上以便以后對采集到的圖像進行操作。framebuffer是Linux內核當中的一種驅動程序接口。framebuffer機制模仿顯卡的功能。用戶可以將framebuffer看成是顯示內存的一個映像,將其映射到進程地址空間之后,就可以直接進行讀寫操作,而寫操作可以立即反應在屏幕上。這種操作是抽象的,統一的。主要利用open函數來打開文件,ioctl函數來找出framebuffer顯示的邊界以及framebuffer顯示像素的位數等,mmap函數來進行內存映射。
打開CMOS攝像頭設備并且進行初始化,確定采集到數據的格式,本設計將采集到的數據自動轉換為RGB565格式,這樣傳輸時對于數據進行處理也會比較簡單。
通過socket網絡編程接收采集到的數據給上位機,是RGB565格式的,通過函數RGB565to32將16 bit格式的數據轉換成在計算機上可顯示的32 bit格式,之后在計算機上將圖像通過內存映射的方法將圖像顯示出來。
硬件實物如圖6所示。

圖6 實物圖示
啟動開發板,將程序拷貝到開發板里,通過計算機控制開發板,執行服務器端的程序。然后在PC機上轉換到命令行模式,按“s”保存圖片。保存的圖片如圖7所示。

圖7 采集的圖像
在圖像采集領域,利用ARM微處理器來控制圖像傳感器進行圖像采集,有其他微處理芯片所不能達到的優勢。加之,可以很方便地在ARM開發板上搭建代碼全公開的嵌入式Linux操作系統,這樣使得基于ARM的圖像采集系統在今后的圖像采集領域會有更大的發展。
[1]胡志海,王德君,趙巧云,等.基于SOPC的便攜式智能圖像采集系統設計[J].儀器儀表學報,2010,31(2):371-376.
[2]劉攀,王紅亮,孟令軍.基于FPGA的數字圖像采集存儲系統的設計[J].電視技術,2010,34(6):32-34.
[3]劉珂含,何培宇,關勝平,等.基于TMS320VC5509A的圖像采集與識別系統[J].四川大學學報:自然科學版,2008,45(1):48-52.
[4]嚴新忠,陳雨.基于嵌入式ARM的圖像采集與傳輸設計[J].研究與開發,2009,28(11):57-59.
[5]劉紅喜,李長江,孫俊喜.基于DSP的圖像采集及處理系統的設計與實現[J].電子技術與應用,2009(2):22-26.
[6]王剛,毛劍飛,田青,等.基于ARM11的無線視頻監控系統[J].計算機系統應用,2011,20(8):18-22.