摘 要: 為了快速,、實(shí)時(shí)地采集水下圖像,,提出了一種基于RVMDK開(kāi)發(fā)平臺(tái)的便攜式水下圖像實(shí)時(shí)采集系統(tǒng)軟件設(shè)計(jì)。首先給出了水下圖像采集系統(tǒng)的總體組成,,闡述了RVMDK開(kāi)發(fā)軟件環(huán)境,;其次,分別對(duì)OV7670程序,、LCD程序,、SCCB接口程序進(jìn)行了設(shè)計(jì);最后,,對(duì)提出的圖像采集軟件系統(tǒng)進(jìn)行了試驗(yàn),。試驗(yàn)結(jié)果表明,該程序設(shè)計(jì)能夠有效地實(shí)現(xiàn)水下圖像實(shí)時(shí)采集功能,。
關(guān)鍵詞: 水下圖像采集,;OV7670程序;SCCB接口程序,;LCD程序
0 引言
21世紀(jì)是海洋的世紀(jì),,水下探測(cè)技術(shù)是水下觀測(cè)、海洋防衛(wèi),、水下搜救打撈,、艦艇檢修等方面的關(guān)鍵技術(shù)之一。海警艦艇機(jī)艙集中了船上絕大多數(shù)設(shè)備裝置的儀表,,是艦艇航行的關(guān)鍵部分,。基于PC機(jī)的圖像采集系統(tǒng)具有功能豐富,、接口靈活多變,、數(shù)據(jù)處理能力強(qiáng)等優(yōu)點(diǎn)[1-2]。該類型圖像采集系統(tǒng)通過(guò)硬件傳輸路線連接到多媒體監(jiān)控終端,,然后基于通信網(wǎng)絡(luò),,將圖像信息傳到一個(gè)或者多個(gè)監(jiān)控中心[3-4]。系統(tǒng)不僅能夠?qū)崿F(xiàn)多媒體信息處理如壓縮,、存儲(chǔ)等基本功能,,還能夠?qū)崿F(xiàn)智能存儲(chǔ)和圖像自動(dòng)識(shí)別等高級(jí)功能,實(shí)現(xiàn)模擬監(jiān)控?zé)o法實(shí)現(xiàn)的“監(jiān)控”功能[5-6],。但是該類圖像采集系統(tǒng)在有限空間的機(jī)艙內(nèi)部所占體積大,,且成本較高,不利于便攜采集。因此,,本文設(shè)計(jì)了一種快速,、實(shí)時(shí)的水下圖像采集系統(tǒng)軟件,通過(guò)試驗(yàn)驗(yàn)證,,該軟件能夠有效地實(shí)現(xiàn)水下圖像便捷,、實(shí)時(shí)采集的功能。
1 水下圖像采集系統(tǒng)的總體設(shè)計(jì)
本系統(tǒng)的總體目標(biāo)是采用帶FIFO的OV7670攝像頭模塊,,由STM32F103ZET6單片機(jī)通過(guò)SCCB總線讀取數(shù)據(jù),,并在LCD液晶顯示屏上實(shí)時(shí)顯示圖像數(shù)據(jù)。如圖1所示為水下圖像采集系統(tǒng)的總體設(shè)計(jì)框圖,。由圖可知,,本系統(tǒng)結(jié)構(gòu)主要由ARM主處理器及其外圍電路、CMOS圖像傳感器,、LCD液晶顯示屏等幾部分組成,,系統(tǒng)硬件實(shí)現(xiàn)簡(jiǎn)單。
2 軟件環(huán)境
軟件以RVMDK為開(kāi)發(fā)平臺(tái),,實(shí)現(xiàn)水下圖像采集系統(tǒng)的主要算法,、控制流程等。RVMDK源自德國(guó)的KEIL公司,,是RealView MDK的簡(jiǎn)稱,。該軟件集成了最領(lǐng)先的技術(shù),支持Cortex-M3主處理器內(nèi)核,,本文將選擇RVMDK3.80A版本的編譯器進(jìn)行程序編譯,。由于單片機(jī)主處理器為STM32F103ZET6,F(xiàn)LASH容量為512 KB,,容量偏大,,因此選擇startup_stm32f10x_hd.s作為STM32芯片啟動(dòng)文件。如圖2所示為STM32芯片啟動(dòng)文件加載圖,。
3 水下圖像采集軟件設(shè)計(jì)
3.1 軟件方案設(shè)計(jì)
如圖3所示為水下圖像采集程序流程圖,。首先是系統(tǒng)初始化程序,主要包括TFT液晶顯示模塊的初始化,、SCCB接口,、OV7670攝像頭、FIFO緩存器AL422B模塊的初始化,。系統(tǒng)產(chǎn)生中斷指令,,使得FIFO_WEN置高電位,再次產(chǎn)生中斷指令,,使得FIFO_WEN置低電位,,從而完成一個(gè)FIFO_WEN周期,。讀取FIFO_WEN數(shù)據(jù),檢測(cè)是否完成一幀,,如果完成,,則檢測(cè)是否收到采集完畢指令,如此往復(fù)循環(huán),,直到采集完畢,。
3.2 OV7670程序設(shè)計(jì)
通過(guò)OV7670.c代碼先編程設(shè)計(jì)OV7670相關(guān)的I/O口和SCCB接口,完成OV7670的寄存器序列的初始化工作,。OV7670的寄存器特多,配置很麻煩,,本文用到的配置序列,,存放在ov7670_init_reg_tbl數(shù)組里面,通過(guò)這個(gè)二維數(shù)組來(lái)存儲(chǔ)初始化序列寄存器和寫(xiě)入寄存器的數(shù)值,,整個(gè)數(shù)組存放在ov7670cfg.h文件中,。ov7670cfg.h文件的代碼如下:
const u8 ov7670_init_reg_tbl[][2]=
{
/*以下為OV7670 QVGA RGB565參數(shù)*/
{0x3a,0x04},,
{0x40,,0x10},
{0x12,,0x14},,//QVGA,RGB 輸出
{0x6e,,0x11},, //100
{0x6f,0x9f},, //0x9e for advance AWB
{0x55,,0x00}, // 亮度
{0x56,,0x40},, // 對(duì)比度
{0x57,0x80},,
//0x40,,change according to Jim′s request
};
#end if
以上代碼中,,每個(gè)條目的第一個(gè)字節(jié)為寄存器地址,,第二個(gè)字節(jié)為設(shè)置的值,比如{0X3a,,0x04},,就表示在0X3a地址,,寫(xiě)入0X04這個(gè)值。
通過(guò)對(duì)寄存器的配置,,完成了OV7670攝像頭模塊的程序設(shè)計(jì),,使OV7670工作在QVGA模式,以RGB565格式輸出,。在完成初始化之后,,準(zhǔn)備讀取OV7670采集的圖像數(shù)據(jù)。
3.3 LCD初始化程序設(shè)計(jì)
TFT-LCD液晶顯示模塊程序設(shè)計(jì)的關(guān)鍵在于FSMC控制器的配置和寄存器地址的計(jì)算,。單片機(jī)的FSMC使用的是AHB3提供的時(shí)鐘信號(hào),,STM32微處理器的FSMC控制器對(duì)外設(shè)地址映射從0X60000000開(kāi)始到0X9FFFFFFF結(jié)束,一共由4個(gè)Bank組成,,在TFT-LCD程序設(shè)計(jì)過(guò)程中選擇了Bank1,。寄存器地址則由TFT-LCD的RS和CS端與FSMC接口的連接方式來(lái)計(jì)算。本文STM32與TFT模塊連接時(shí),,僅將2.8英寸的TFT屏看成一個(gè)SRAM來(lái)處理,。本程序函數(shù)用來(lái)驅(qū)動(dòng)ILI9320LCD芯片。程序函數(shù)如下:
void LCD_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure,;
FSMC_NORSRAMInitTypeDef
FSMC_NORSRAMInitStructure,;
FSMC_NORSRAMTimingInitTypeDefreadWriteTiming;
FSMC_NORSRAMTimingInitTypeDefwriteTiming,;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,,ENABLE); //使能FSMC時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOG|RCC_APB2Periph_AFIO,,ENABLE),;
//使能PORTB,D,,E,,G以及AFIO復(fù)用功能時(shí)鐘
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
//PB0推挽輸出背光
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP,; //推挽輸出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz,;
GPIO_Init(GPIOB,&GPIO_InitStructure),;
..........
readWriteTiming.FSMC_AddressSetupTime=0x01,;
//地址建立時(shí)間(ADDSET)為2個(gè)HCLK1/36 MHz=27 ns
readWriteTiming.FSMC_AddressHoldTime=0x00;
readWriteTiming.FSMC_DataSetupTime=0x0f,;
readWriteTiming.FSMC_BusTurnAroundDuration=0x00,;
readWriteTiming.FSMC_CLKDivision=0x00;
readWriteTiming.FSMC_DataLatency=0x00,;
readWriteTiming.FSMC_AccessMode=FSMC_AccessMode_A,; //模式A
writeTiming.FSMC_AddressSetupTime=0x00,;
//地址建立時(shí)間(ADDSET)為1個(gè)HCLK
writeTiming.FSMC_AddressHoldTime=0x00;
//地址保持時(shí)間(A)
writeTiming.FSMC_DataSetupTime=0x03,;
//數(shù)據(jù)保存時(shí)間為4個(gè)HCLK
writeTiming.FSMC_BusTurnAroundDuration=0x00,;
writeTiming.FSMC_CLKDivision=0x00;
writeTiming.FSMC_DataLatency=0x00,;
writeTiming.FSMC_AccessMode=FSMC_AccessMode_A,; //模式A
3.4 SCCB接口初始化程序設(shè)計(jì)
由于對(duì)攝像頭的工作參數(shù)的配置是通過(guò)SCCB來(lái)實(shí)現(xiàn)的,因此在軟件設(shè)計(jì)時(shí),,首先設(shè)計(jì)出SCCB程序從而控制攝像頭的相關(guān)參數(shù),。SCCB設(shè)計(jì)程序如下:
void SCCB_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG,, ENABLE),; //使能PB端口時(shí)鐘
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
//端口配置
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU,;//輸入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOG,, &GPIO_InitStructure),;
GPIO_SetBits(GPIOG,GPIO_Pin_13),; //輸出高電平
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3,; //端口配置
GPIO_Init(GPIOD, &GPIO_InitStructure),;
GPIO_SetBits(GPIOD,,GPIO_Pin_3); //輸出高電平
SCCB_SDA_OUT(),;
}
以上是模擬SCCB初始化函數(shù),、使能PB端口時(shí)鐘和相關(guān)引腳的配置。SCCB起始信號(hào)函數(shù)如下:
void SCCB_Start(void)
{
SCCB_SDA=1,; //數(shù)據(jù)線高電平
SCCB_SCL=1,; //在時(shí)鐘線高的時(shí)候數(shù)據(jù)線由高至低
delay_us(50);
SCCB_SDA=0,;
delay_us(50),;
SCCB_SCL=0;
//數(shù)據(jù)線上電位恢復(fù)低電平(對(duì)于單操作函數(shù)必要)
}
通過(guò)SCCB起始信號(hào)函數(shù)可以看出,,當(dāng)時(shí)鐘為高電平時(shí),,數(shù)據(jù)線由高到低為SCCB起始信號(hào),在激活狀態(tài)下,,SDA和SCL均為低電平,。SCCB的停止信號(hào)如下:
void SCCB_Stop(void)
{
SCCB_SDA=0,;
delay_us(50);
SCCB_SCL=1,;
delay_us(50),;
SCCB_SDA=1;
delay_us(50),;
}
通過(guò)SCCB停止信號(hào)函數(shù)可以看出,,當(dāng)時(shí)鐘為高電平的時(shí)候,數(shù)據(jù)線的由低到高為SCCB停止信號(hào),,在空閑狀況下SDA和SCL均為高電平,。
4 實(shí)驗(yàn)分析
為了方便操作,整個(gè)系統(tǒng)設(shè)計(jì)為外接電源供電,,同時(shí)打開(kāi)控制面板來(lái)控制供電,。控制面板帶總開(kāi)關(guān),、燈光旋轉(zhuǎn)開(kāi)關(guān),、攝像頭控制接口、燈光控制接口和電源輸入接口,,通過(guò)220 V交流電轉(zhuǎn)12 V直流電轉(zhuǎn)換器實(shí)現(xiàn)STM32,、攝像頭、LED燈光的供電一體化,。整個(gè)系統(tǒng)的供電由4根電源線控制,,包含18根攝像頭信號(hào)線和兩根LED燈光控制線。
由于攝像頭前設(shè)計(jì)了33顆專業(yè)級(jí)LED燈,,總光源面積為504π mm2,。實(shí)驗(yàn)前將LED燈光全部打開(kāi)且調(diào)節(jié)到最亮狀態(tài),用不同環(huán)徑(中間空出攝像頭的位置)的不透光的圓環(huán)形黑紙條成比例地遮住LED燈,,分別在明亮,、一般、較暗三種環(huán)境下進(jìn)行圖像采集實(shí)驗(yàn),。明亮,、一般、較暗環(huán)境的判斷標(biāo)準(zhǔn)如表1所示,。三種情況下圓柱體的圖像采集情況如圖4,、5、6所示,。
從以上在不同燈光環(huán)境下采集的同一物體圖像可以看出,,三種環(huán)境下石塊紋理清晰可見(jiàn),從而證實(shí)了本文設(shè)計(jì)的水下圖像采集軟件能夠有效地實(shí)現(xiàn)圖像采集功能,,并且在不同的燈光強(qiáng)度下,,圖像采集效果不同,,燈光強(qiáng)度越強(qiáng),采集效果越好,。
5 結(jié)論
結(jié)合論文的研究目標(biāo),,給出了包含OV7670攝像頭模塊、STM32F103ZET6單片機(jī)處理器模塊,、SCCB總線讀取數(shù)據(jù)模塊以及LCD液晶顯示屏模塊的水下圖像采集系統(tǒng),。分別對(duì)系統(tǒng)的OV7670程序、LCD程序,、SCCB接口程序進(jìn)行了設(shè)計(jì),。通過(guò)在不同燈光強(qiáng)度下的試驗(yàn),證實(shí)了本文設(shè)計(jì)的水下圖像采集軟件能夠有效地實(shí)現(xiàn)水下圖像采集功能,。
參考文獻(xiàn)
[1] 張磊.基于ARM的CMOS數(shù)字圖像傳感器圖像采集系統(tǒng)的研究與設(shè)計(jì)[D].哈爾濱:哈爾濱工程大學(xué),,2008.
[2] 劉甲玉.基于ARM的圖像采集與無(wú)線傳輸技術(shù)的研究[D].蕪湖:安徽工程大學(xué),2010.
[3] 詹青龍.網(wǎng)絡(luò)視頻技術(shù)及應(yīng)用[M].西安:西安電子科技大學(xué)出版社,,2004.
[4] OSTHEIMER D,, LEMAY S, GHAZAL M. A modular distributed video surveillance system over IP[C]. Canadian Conference on Electrical and Computer Engineering,, 2006: 518-521.
[5] 梁修如,,嚴(yán)國(guó)萍.嵌入式視頻監(jiān)控服務(wù)器系統(tǒng)典型方案及其性能分析[J].電視技術(shù),2005,,24(10):93-96.
[6] 耿艷明,王宏遠(yuǎn).一種基于IP的視頻監(jiān)控系統(tǒng)設(shè)計(jì)[J].電視技術(shù),,2004,,23(3):75-77.