王 坤,丁紅勝
(1.北京科技大學數理學院,北京100083;2.北京科技大學北京市弱磁檢測及應用工程技術研究中心,北京 100083)
隨著機器視覺、模式識別等技術領域的發展,圖像處理技術與人們的生活息息相關,在安防、醫療等各個領域都有著極其重要的作用。作為圖像處理的第一個重要環節便是圖像的顯示、編碼與采集工作。目前圖像采集的方案多種多樣,都有自己的適用領域。例如:采用ARM9+WinCE的圖像采集方案[1],但是WinCE嵌入式系統近幾年使用率逐漸下降;基于FPGA的高速圖像采集系統[2-5],FPGA圖像的采集速度快,效果好,但是FPGA開發難度相對大,硬件成本相對較高,對于一些消費電子類不合適。相比于ARM9與FPGA,STM32的成本降低,開發難度小。文獻[6-7]基于2.4寸的顯示屏設計了圖像顯示系統,對于清晰度要求較高的場合還存在一定的不足。文獻[6]采用的攝像頭是200萬像素的OV2640攝像頭,這對于攝像頭模塊的利用率存在較大的浪費。文中主要利用STM32F407單片機、OV2640攝像頭模塊和TFTLCD液晶作為主要硬件設備,設計了一款圖像的編碼、顯示與采集系統,分析了整個系統硬件軟件設計。
系統的硬件結構作為整個系統最重要,最核心的部分,決定了整個系統的圖像處理能力與穩定運行及成本。
作為最核心的部件,芯片的選取非常關鍵。綜合考慮處理能力、開發難度、芯片成本問題,我們選用STM32F407ZGT6作為整個系統的主控芯片,該芯片在STM32系列中綜合性能較強。某些功能相對STM32F1來說進行了重大改進,比如FSMC的速度,F4刷屏速度可達3 300 W像素/秒,而F1的速度則只有500 W左右[8]。對于提高視頻流的顯示質量極為有利。
OV2640是OV(OmniVision)公司生產的一顆1/4寸的CMOS UXGA(1632*1232)圖像傳感器。該傳感器體積小、工作電壓低,提供單片UXGA攝像頭和影像處理器的所有功能。通過SCCB總線控制,可以輸出整幀、子采樣、縮放和取窗口等方式的各種分辨率8/10位影像數據[9]。OV2640的圖像數據格式,一般用兩種輸出方式:RGB565和JPEG。OV2640自帶壓縮引擎,可以將原始數據流壓縮成JPEG格式輸出,避免了編寫JPEG編碼算法。使用過程中通過軟件編程控制輸出格式,具有較好的操作性。
STM32F4自帶了一個數字攝像頭(DCMI)接口,該接口是一個同步并行接口,能夠接收外部8位、10位、12位或14位CMOS攝像頭模塊發出的高速數據流。可支持不同的數據格式:YCbCr4:2:2/RGB565逐行視頻和壓縮數據(JPEG)。
本系統使用STM32F407ZGT6的DCMI接口連接OV2640攝像頭模塊,該模塊采用8位數據輸出接口,自帶24M有源晶振,無需外部提供時鐘,采用百萬高清鏡頭,單獨3.3 V供電即可正常使用。
STM32F407ZGT6自帶192K字節的SRAM,對一般應用來說已經足夠,但是對于圖像編碼采集等對內存要求高的場合明顯不夠用。因此選擇了一顆1M字節的SRAM芯片:IS62WV51216用來存儲處理圖像。所使用的是TSOP44封裝的IS62WV51216芯片,可以直接與STM32F4的FSMC相連接。
此系統需要大容量的外部存儲設備,來存儲圖像數據。目前常用的外部存儲設備有U盤,FLASH存儲器,以及SD卡等。綜合比較最終選擇適合此套系統的SD卡。將此套系統設計上標準的SD卡接口,使用STM32F4自帶的SDIO接口驅動。SDIO模式允許4線的高速傳輸,傳輸速率快[10],最高通信速度可達48 MHz(分頻器旁路時),最高每秒可傳輸數據24M字節,能夠滿足系統的圖像數據的傳輸速度。SDIO與DCMI接口有一部分是公用引腳,使用時要注意分時復用。
隨著電子產品的不斷更新,各種顯示界面的開發越來越多,由于TFT彩屏的性價比高,因而被廣泛用在各種電子設備上作為顯示屏[11]。綜合考慮性能和成本,本系統選用的液晶模塊為4.3寸TFTLCD。最大分辨率為800*480。TFTLCD模塊采用16位的并方式與外部連接,不采用8位的方式,是因為彩屏的數據量比較大,尤其是在顯示圖片的時候,如果用8位數據線,就會比16位方式慢一倍以上。液晶驅動芯片為NT35510,驅動芯片自帶顯存GRAM。當軟件配置好驅動芯片各個寄存器后,可以直接向GRAM里面發送數據,便可以在液晶屏幕上顯示相應的圖像信息。
STM32F4系列芯片都帶FSMC接口,STM32F4的FSMC將外部設備分為兩類:NOR/PSRAM設備、NAND/PC卡設備。它們共用地址數據總線等信號,具有不同的CS以區分不同的設備。TFTLCD就是用的FSMC_NE4做片選,其實就是將TFTLCD當成SRAM來控制。其操作時序和SRAM的控制完全類似,唯一不同就是TFTLCD有RS信號,但是沒有地址信號。
該系統除包含上述的幾個重要硬件模塊之外,還包括按鍵、LED、USB轉串口、STlink接口線路等硬件模塊。整體的硬件框圖如圖1所示。

圖1 硬件結構圖
應用SD卡必須要使用文件系統管理,本系統選擇FATFS文件系統來管理SD卡。FATFS是一個完全免費開源的FAT文件系統模塊,專門為小型的嵌入式系統而設計[12]。它完全用標準C語言編寫,所以具有良好的硬件平臺獨立性。FATFS模塊的層次結構分為應用層、FATFS模塊、底層存儲媒介接口及RTC。最頂層是應用層,使用者無需理會FATFS的內部結構和復雜的FAT協議,只需要調用FATFS模塊提供給用戶的一系列應用接口函數,如f_open,f_read,f_write和f_close等,就可以像在PC上讀/寫文件那樣簡單[13]。在此系統中按FATFS的移植方法移植了FATFS文件系統。
JPEG是 Joint Photographic Experts Group(聯合圖像專家小組)的縮寫,是第一個國際圖像壓縮標準。JPEG圖像壓縮算法能夠在提供良好的壓縮性能的同時,具有比較好的重建質量,被廣泛應用于圖像、視頻處理領域。
OV2640可以直接壓縮數據為JPEG格式,當輸出數據是JPEG數據的時候,輸出的JPEG數據以:0XFF,0XD8開頭,以0XFF,0XD9 結尾,且在0XFF,0XD8之前,或者0XFF,0XD9之后,會有不定數量的其他數據存在(一般是0),編寫程序時直接忽略這些數據,將得到的0XFF,0XD8-0XFF,0XD9之間的數據,存儲在SD卡中,保存為.jpg/.jpeg文件,然后可以直接在電腦上采集到的JPEG圖像。
BMP文件格式,又稱為Bitmap(位圖)或是DIB(Device-Independent Device,設備無關位圖),是Windows系統中廣泛使用的圖像文件格式[14]。它可以不作任何變換地保存圖像像素域的數據。BMP文件是由文件頭、位圖信息頭、顏色信息和圖形數據等四部分組成。本系統采用16位深度的數據格式,因為OV2640模塊可直接輸出RGB565格式數據,而且液晶模塊也可以直接顯示RGB565格式的像素點,避免對不同深度的位圖進行轉換,減少芯片的運算復雜度。
將LCD的顯存保存為BMP格式的圖片文件的步驟設計如下:
1)創建BMP位圖信息,并初始化各個相關信息。設置BMP圖片的分辨率為LCD分辨率(800*480)、BMP圖片的大小(整個BMP文件大小)、BMP的像素位數(16位)和掩碼等信息。
2)將BMP位圖信息保存到一個BMP文件中。創建新BMP文件,寫入BMP位圖信息,之后才開始BMP數據的寫入。
3)保存位圖數據。將位圖數據保存到上一步所創建的BMP文件里,只需要從LCD的GRAM里面讀取各點的顏色值,依次寫入第二步創建的BMP文件即可。注意:保存順序(即讀GRAM順序)是從左到右,從下到上。
4)關閉文件。使用FATFS,在文件創建之后,必須調用f_close,文件才會真正體現在文件系統里面,否則是不會寫入。這個要特別注意,寫完之后,一定要調用f_close函數將文件關閉。
數據的合理流向是圖像采集的關鍵部分。對于大量圖像數據的傳輸,若數據的流向與各個設備的存儲傳送速度處理不好經常會造成數據丟失的現象,此處應該設定好圖像的緩存。本系統通過按鍵判斷是存儲JPEG圖像還是BMP圖像。
針對JPEG圖像數據的傳輸傳輸,用到了STM32的外設DMA控制器。DMA,全稱為:Direct Memory Access,即直接存儲器訪問。DMA是一種快速傳送數據的機制,由 DMA控制器(DMA controller,DMAC)實現。DMA的應用能夠有效減輕處理器的負擔,可以大大提高數據傳輸的效率,從而提高系統性能[15]。STM32系列單片機將DMA以外設的方式集成到 Cortex之內[16]。
本系統要用到內存管理,存儲圖像數據要用到大數組,其他地方也要用到一些數組,所以,因此內部RAM無法再定義這么大的數組了。并且這個數組不能使用外部SRAM(實測:DCMI接口使用DMA直接傳輸JPEG數據到外部SRAM會出現數據丟失,所以DMA接收JPEG數據只能用內部SRAM),解決方法是使用DMA的雙緩沖機制來讀取,DMA雙緩沖讀取JPEG數據的原理框圖如圖2所示。

圖2 雙緩沖原理圖
DMA接收來自OV2640的JPEG數據流,首先使用M0AR(內存1)來存儲,當M0AR滿了之后,自動切換到M1AR(內存2),同時程序讀取M0AR(內存1)的數據到外部SRAM;當M1AR滿了以后,又切回M0AR,同時程序讀取M1AR(內存2)的數據到外部SRAM;依次循環(此時的數據處理,是通過DMA傳輸完成中斷實現的,在中斷函數中處理),直到幀中斷,結束一幀數據的采集,讀取剩余數據到外部SRAM,完成一次JPEG數據的采集。
其中,M0AR,M1AR所指向的內存,必須是內部內存,由于采用雙緩沖機制,因此不必定義一個很大的數組,一次性接收所有JPEG數據了,而是可以分批次接收。
最后,將通過雙緩沖機制存儲在外部SRAM的JPEG數據,保存為.jpg/.jpeg存放在SD卡,就完成了一次JPEG圖片的存儲。
對于BMP圖片的存儲,相對來說要簡單一些,從LCD的GRAM里面讀取各點的顏色值,依次寫入創建的BMP文件即可(如2.2小節描述的步驟)
在每一個接口函數及硬件配置完成后,系統的整體邏輯結構并不復雜。整體執行順序為:開機的時候先檢測字庫,然后檢測SD卡根目錄是否存在PHOTO文件夾,如果不存在則創建,如果創建失敗,則報錯(提示功能不可用)。在找到SD卡的PHOTO文件夾后,開始初始化OV2640,在初始化成功之后,就一直在屏幕顯示OV2640拍攝的內容。按下KEY0,可以保存BMP格式的圖像文件,分辨率與LCD分辨率相同。按下KEY1可以保存JPEG格式的圖像文件(分辨率為UXGA,即1600*1200)。圖片保存成功之后,蜂鳴器“滴”聲提示存儲成功。同時設計了LED指示燈,DS0還是指示程序運行狀態,DS1用于指示DCMI幀中斷。
程序簡要流程圖如圖3所示。
程序設計的偽代碼如下:


圖3 程序流程圖

通過實驗驗證,將存儲有圖像的SD卡放到電腦,可以成功查看采集到的圖像信息。本套系統成功采集存儲1 600*1 200的JPEG圖片與800*480的BMP圖片,圖像質量較好。
本文基于STM32F4與OV2640及其他硬件設備設計完成了圖像編碼與顯示存儲系統。硬件方面成本低廉,功耗小,適合長時間穩定運行,而且充分發揮了STM32與OV2640的最大功能;軟件方面,各模塊驅動完善,開發簡單,應用方便,可以在本套系統基礎上進行裁剪,適應特定的應用。由于BMP圖像編碼過程沒有使用調色板,因此數據量較大,系統在BMP圖像的編碼存儲方面,速度還稍慢,但是對于一些特定的應用已經完全可以滿足。
參考文獻:
[1]蔡衛明.ARM9+WinCE嵌入式圖像采集系統開發技術研究與實現[D].重慶:重慶理工大學,2009.
[2]潘明,陳元枝,李強.基于FPGA的圖像采集系統的設計[J].研究與開發,2012,31(3):58-61.
[3]侯廣琦,魏平,白延柱.多通道嵌入式高速圖像采集存儲系統的研究[J].儀器儀表學報,2011,32(11):2543-2548.
[4]曹山.基于FPGA的實時圖像采集和處理系統[D].西安:西安工業大學,2015.
[5]楊林森.高速智能圖像采集系統的設計[D].哈爾濱:哈爾濱工業大學,2015.
[6]王建,梁振濤,鄭文斌等.STM32和OV2640的嵌入式圖像采集系統設計[J].單片機與嵌入式系統應用,2014(9):47-48.
[7]張勇強,陽泳,余建坤.基于STM32圖像采集與顯示系統的設計與實現[J].電子世界,2016(2):34-36.
[8]劉軍,張洋.精通STM32庫函數版本[M].北京:北京航空航天大學出版社,2015.
[9]黃健,羅國平,杜麗君.基于STM32F407平臺OV2640驅動程序設計[J].通訊世界,2015(10):246-247.
[10]徐建功,趙杰.基于STM32F103XX微處理器的Micro SD卡讀寫[J].嵌入式技術,2010(5):27-32.
[11]湯莉莉,黃偉.基于STM32的FSMC接口驅動TFT彩屏設計[J].現代電子技術,2013(20):139-144.
[12]崔鵬偉,閆學文.基于SD卡的FATFS文件系統的研究與應用[J].工業控制計算機,2013,26(11):141-142.
[13]張濤,左謹平,馬華玲.FatFs在32位控制器STM32上的移植[J].電子技術,2011:25-27.
[14]宋葉未,葉建芳.BMP格式位圖文件的分析及顯示方法[J].現代電子技術,2011,34(27):5-7.
[15]梁科,李國峰等.通用多通道高性能DMA控制器設計[J].天津大學學報,2008(5):621-626.
[16]張滔.基于STM32單片機DMA機制的多通道數據采集[J].科技論壇,2013(30):27.