曾憲陽, 楊紅莉, 郁漢琪
(南京工程學(xué)院 a. 工業(yè)中心;b. 數(shù)理部;c. 數(shù)學(xué)系,南京 210093)
一種高效的圖像數(shù)據(jù)采集處理方案
曾憲陽a,c, 楊紅莉b,c, 郁漢琪a
(南京工程學(xué)院 a. 工業(yè)中心;b. 數(shù)理部;c. 數(shù)學(xué)系,南京 210093)
分析了攝像頭工作原理,設(shè)計(jì)了單片機(jī)系統(tǒng)硬件電路原理圖,編寫了精簡的C語言程序代碼。提出在行中斷信號(hào)到來后,按序采集存儲(chǔ)該行各像素點(diǎn)圖像數(shù)據(jù),去除冗余的循環(huán)判斷語句,節(jié)約了采集時(shí)間,提高了圖像采集效率。為滿足特殊場合需要,還設(shè)計(jì)了由多場圖像拼接成一幅圖像的數(shù)據(jù)采集方案程序,以提高圖像分辨率。實(shí)驗(yàn)結(jié)果表明:該程序不僅可以驅(qū)動(dòng)低速51單片機(jī)采集攝像頭圖像數(shù)據(jù),也可以在高速STM32等單片機(jī)上運(yùn)行,以進(jìn)一步提高現(xiàn)有圖像采集速度與效率。
攝像頭; 單片機(jī); 圖像采集; C語言
機(jī)器人小車在使用攝像頭進(jìn)行路面循跡時(shí),為了采集到正確的圖像信息[1-3],往往需要單片機(jī)與高速PCLK信號(hào)同步。然而,由于攝像頭工作原理復(fù)雜,且51單片機(jī)運(yùn)行速度低而無法滿足要求。為解決這一問題,大多數(shù)學(xué)者采用的方法是通過降低攝像頭輸出分辨率來減少數(shù)據(jù)量,或者換用成本更高的高檔單片機(jī),這不僅降低了圖像成像質(zhì)量,也提高了系統(tǒng)成本,同時(shí)給多數(shù)不熟悉高檔單片機(jī)的學(xué)者帶來了困難[4-5]。本文分析了攝像頭的工作原理,在不改變攝像頭默認(rèn)輸出分辨率的前提下,提出一種高效的圖像數(shù)據(jù)采集方案。該方案不僅能滿足低速單片機(jī)驅(qū)動(dòng)攝像頭需要,而且還可移植到高速單片機(jī)如STM32上,以進(jìn)一步提高現(xiàn)有圖像采集速度及效率。
圖1為通過SIGLENT示波器顯示的OV6620攝像頭行場中斷時(shí)序波形圖,其中第1行黃色波形是作者設(shè)置的圖像采集標(biāo)志信號(hào),第2行粉紅色波形是攝像頭發(fā)出的行中斷請(qǐng)求信號(hào),第3行青綠色波形是攝像頭發(fā)出的場中斷請(qǐng)求信號(hào)。結(jié)合攝像頭原理,OV6620攝像頭在NAL制式下,每秒將會(huì)輸出25幀共50幅圖像,每幅圖像分辨率為356×292[6-8],共292行,356列。攝像頭引腳包括一個(gè)場中斷信號(hào)VSYNC以及一個(gè)行中斷信號(hào)HREF,場中斷信號(hào)VSYNC表示一副圖像的輸出起始信號(hào),行中斷信號(hào)HREF表示每行數(shù)據(jù)輸出的起始信號(hào)。行中斷信號(hào)到來后,其高電平期間為數(shù)據(jù)輸出的有效期間,此時(shí)該行356個(gè)像素點(diǎn)數(shù)據(jù)將在PCLK的同步下,按序通過攝像頭數(shù)據(jù)輸出口Y0~Y7引腳依次輸出,每個(gè)像素點(diǎn)數(shù)據(jù)為8位。HREF低電平期間為無效時(shí)間區(qū),此時(shí)數(shù)據(jù)讀取無效。為減小圖像失真,用戶往往需根據(jù)PCLK同步信號(hào)來讀取各像素點(diǎn)數(shù)據(jù)[9-13]。
圖1 通過示波器觀察的OV6620攝像頭行場中斷輸出時(shí)序圖
2.1 系統(tǒng)整體方案
PCLK同步信號(hào)主要是防止圖像失真。低速單片機(jī)由于速度低無法同步PCLK信號(hào),就無法讀取該行所有的356個(gè)像素點(diǎn)。然而圖像不失真的本質(zhì)要求是“保證每行數(shù)據(jù)坐標(biāo)完全對(duì)齊”,其實(shí)只須要求單片機(jī)在行中斷請(qǐng)求信號(hào)到來后,時(shí)間間隔均勻的讀取Y0~Y7信號(hào),并且在此過程中不被其他中斷請(qǐng)求信號(hào)中斷即可[14]。
根據(jù)以上方案,為提高效率,應(yīng)減少行數(shù)并減少每行像素點(diǎn)采集數(shù)量,更重要的是必須將行中斷設(shè)置為高優(yōu)先級(jí)以防止被其他中斷請(qǐng)求信號(hào)干擾,這樣就可得到一個(gè)等比例縮放圖。
2.2 硬件電路原理圖設(shè)計(jì)
圖2為系統(tǒng)硬件電路原理圖。為提高單片機(jī)數(shù)據(jù)存儲(chǔ)器容量、提高單片機(jī)運(yùn)行速度,選用增強(qiáng)型51單片機(jī)STC15F2K60S2[15]作為主控制芯片,其內(nèi)部包含2.048 KB擴(kuò)展數(shù)據(jù)存儲(chǔ)器,可用來存放臨時(shí)圖像數(shù)據(jù)。其程序存儲(chǔ)器有60 KB左右,可用來存放較大程序代碼,并且內(nèi)部自帶復(fù)位電路。并且外部中斷可配置為上升或下降沿觸發(fā)方式,便于與OV6620攝像頭中斷請(qǐng)求信號(hào)匹配。Y0~Y7端口數(shù)據(jù)用以獲取圖像灰度數(shù)據(jù),場中斷請(qǐng)求信號(hào)HREF接至單片機(jī)外部中斷1引腳,并在單片機(jī)中設(shè)置為下跳沿觸發(fā)。行中斷請(qǐng)求信號(hào)VSYNC接至單片機(jī)外部中斷0引腳,在單片機(jī)中斷初始化程序中將觸發(fā)方式設(shè)置為上升沿觸發(fā)方式即可。
圖2 系統(tǒng)硬件電路原理圖
2.3 系統(tǒng)程序編寫
系統(tǒng)程序執(zhí)行速度對(duì)于本系統(tǒng)數(shù)據(jù)采集效率將起到至關(guān)重要的作用,因此程序代碼必須高效率。通常匯編語言程序效率較高,但不便于移植。本文將設(shè)計(jì)一種特殊結(jié)構(gòu)的C語言程序,并且精簡代碼,以達(dá)到與匯編語言相同的執(zhí)行效率。首先在程序存儲(chǔ)器RAM中開啟一個(gè)二維數(shù)組,用來臨時(shí)存放采集的圖像數(shù)據(jù)。設(shè)置行中斷為高優(yōu)先級(jí)中斷,場中斷為低優(yōu)先級(jí)別中斷,并且關(guān)閉其他中斷源。當(dāng)場中斷信號(hào)到來后,開始接收一副新的圖像數(shù)據(jù)。設(shè)置系統(tǒng)每隔10行采集1行數(shù)據(jù),當(dāng)行中斷滿足條件時(shí)開始采集該行數(shù)據(jù)。由于采集每行數(shù)據(jù)執(zhí)行的指令相同,工程師們通常采用循環(huán)判斷語句來完成采集任務(wù),但每行數(shù)據(jù)有效采集時(shí)間只有40 μs,循環(huán)判斷語句將浪費(fèi)寶貴的時(shí)間。為保證采集的高效性,應(yīng)去除循環(huán)判斷語句,每個(gè)像素點(diǎn)的采集均占用一條獨(dú)立的語句,按照“讀—存儲(chǔ)—讀—存儲(chǔ)”的模式順序向下執(zhí)行,讀取的數(shù)據(jù)直接存入到二維數(shù)組中。這種程序結(jié)構(gòu)使得程序代碼長度增加,但避開了冗余的循環(huán)判斷,因此程序執(zhí)行的效率得到大大提高,采集速度也將達(dá)到最大值。同時(shí)注意到本文所選用的單片機(jī)程序存儲(chǔ)器容量是足夠滿足要求的。根據(jù)此思路數(shù)據(jù)采集部分的完整程序代碼(1)編寫如下:
void Write0() //讀第1行數(shù)據(jù)并保存
{ Array[0][0] = DATA_IO; Delay();
Array[0][1] = DATA_IO;Delay();
…
Array[0][27] = DATA_IO;}
…
void Write24() //讀第29行數(shù)據(jù)并保存
{ Array[24][0] = DATA_IO;Delay();
Array[24][1] = DATA_IO;Delay();
…
Array[24][27] = DATA_IO;}
void ReceData() //數(shù)據(jù)讀取、處理、發(fā)送
{ if(ReceData_EN == 1)
{ switch(ArrayRow)
{ case 0:Write0();break;
case 1:Write1();break;
…
case24:Write24();break;}
ReceData_EN = 0;
ArrayRow++; }
if(HREF_Flag==1) //判斷一副圖像開始標(biāo)志
{ RowCount++; //指向下一行
if((RowCount>20)&&(RowCount%10)==0)
{ ReceData_EN=1; }
if(RowCount>=226)//圖像接收完畢判斷
{ RowCount = 0; //復(fù)位各計(jì)數(shù)器
ReceData_EN = 0;
HREF_Flag = 0;
ArrayRow = 0;
EX0=0; //關(guān)閉行中斷
ArrayBinary(); //二值化處理
SendSeriPort();//發(fā)送給顯示終端
EX0=1;//使能中斷準(zhǔn)備接收下一副圖像
} }}
其中,行中斷子程序流程圖如圖3所示。
圖3 行中斷子程序流程圖
3.1 實(shí)驗(yàn)驗(yàn)證
以機(jī)器人小車循跡黑線為例,小車通過攝像頭實(shí)時(shí)采集地面信息發(fā)送給51單片機(jī),在keil C51編譯環(huán)境下編譯以上程序后下載到單片機(jī)。單片機(jī)通過采集數(shù)據(jù)、二值化處理,再通過串口將數(shù)據(jù)傳遞給PC上位機(jī)觀察,得到的圖像如圖4所示。
(a) 上位機(jī)PC顯示的圖像
(b) 51單片機(jī)采集到的二值化圖像
圖4 51單片機(jī)通過攝像頭采集到的路面圖像與電腦顯示的圖像對(duì)比
圖4展示了每行采集時(shí)間約為40 μs時(shí)的二值化圖像。圖4(a)為上位機(jī)視頻采集卡采集到的視頻圖像。圖4(b)顯示了采集圖像的二值化處理結(jié)果,0區(qū)域代表黑線部分,1區(qū)域代表白色地面,與圖4(a)對(duì)比沒有發(fā)現(xiàn)圖像出現(xiàn)變形情況,而且很好地再現(xiàn)了一場黑白圖像。該實(shí)驗(yàn)不僅證明了本文攝像頭算法的可行性,也解決了51單片機(jī)采集圖像數(shù)據(jù)的難題。
由于考慮到所選單片機(jī)運(yùn)行速度及內(nèi)部擴(kuò)展RAM大小限制,因此以上單片機(jī)程序是將圖像數(shù)據(jù)控制在25行,每行28個(gè)點(diǎn),使得圖像數(shù)據(jù)大小不超過內(nèi)部擴(kuò)展RAM容量。但是在一些特殊場合,如果對(duì)圖像分辨率要求較高,可將分辨率設(shè)置為80行,每行采集100個(gè)像素點(diǎn),此時(shí)單片機(jī)數(shù)據(jù)存儲(chǔ)器容量不足以存放整幅圖像,因此程序算法應(yīng)做改進(jìn)。將一副圖像拆分成相等的4幅小圖像,每幅圖像為20行×100個(gè)像素點(diǎn),場中斷到來后,首先采集0~19行第1幅小圖像,采集完后關(guān)閉行、場中斷,經(jīng)二值化處理后通過串口發(fā)送給上位機(jī)。然后再打開行、場中斷,開始采集20~39行第2幅小圖像,重復(fù)以上步驟,直到第4幅圖像采集發(fā)送完畢,通過串口發(fā)送給上位機(jī)圖像采集結(jié)束標(biāo)志信號(hào),此時(shí)一幅高分辨率的圖像采集發(fā)送完畢。該程序算法提高了圖像分辨率,但是適當(dāng)降低了數(shù)據(jù)采集速度,因?yàn)橐环鶊D像采集傳輸至少占用4場圖像的時(shí)間,可以滿足特殊場合下的用戶需求。其接收部分程序代碼(2)如下:
voidReceData()
{if(ReceData_EN == 1)
{switch(ArrayRow)
{case 0: Write0();break;
case 1: Write1();break;
…
case 79: Write79();break;}
ReceData_EN = 0;
ArrayRow++;}
if(HREF_Flag==1)
{ RowCount++;
if((RowCount>20)&&(RowCount%3)==0)
{ReceData_EN=1; } if((RowCount==77)||(RowCount==137)||(RowCount==197)||(RowCount==247))//判斷一小幅圖像是否接收完畢
{HREF_Flag = 0;
EX0=0;EX1=0;
ArrayBinary();
SendSeriPort();
EX0=1;EX1=1;}
if(RowCount>=247) //判斷一整幅圖像是否接收完畢
{RowCount = 0;
ReceData_EN = 0;
ArrayRow = 0;
EX0=1;EX1=1;} }}
3.2 程序算法在高速單片機(jī)上的運(yùn)行情況
圖5展示了程序代碼(2)在STM32高速單片機(jī)上運(yùn)行的情形,攝像頭采集路面循跡黑線,經(jīng)過二值化處理后通過串口傳遞給上位機(jī)。由于程序代碼(2)的高效性,使得STM32單片機(jī)可以采集到更多的像素點(diǎn)和行數(shù),也即采集到了更高分辨率的圖像,本實(shí)驗(yàn)驗(yàn)證了程序的可行性以及高效性。其實(shí)驗(yàn)現(xiàn)場如圖6所示。
圖5 程序運(yùn)行在STM32高速單片機(jī)上的情形
圖6 實(shí)驗(yàn)現(xiàn)場照片
本文根據(jù)低速單片機(jī)驅(qū)動(dòng)攝像頭存在的困難,對(duì)OV6620攝像頭工作原理進(jìn)行了剖析,設(shè)計(jì)了單片機(jī)采集攝像頭數(shù)據(jù)硬件電路,設(shè)計(jì)了順序讀取各像素點(diǎn)數(shù)據(jù)然后直接存儲(chǔ)的采集方案,去除了冗余的循環(huán)判斷,提高了數(shù)據(jù)采集效率。為了提高圖像分辨率,將圖像拆分成4幅小圖像分別采集傳輸,編寫了相應(yīng)了C語言程序,能很好的在51單片機(jī)及STM32單片機(jī)上運(yùn)行,驗(yàn)證了程序的可行性及高效性。
[1] 成 怡,金海林,樊冬雪.四軸飛行器視覺組合導(dǎo)航系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)測量與控制,2014,22(11):3705-3711.
[2] 張 璐,宋秋紅.自動(dòng)巡線小車的圖像采集系統(tǒng)開發(fā)與優(yōu)化[J].計(jì)算機(jī)工程與設(shè)計(jì),2010,31(17):3754-3756.
[3] 高正中,趙麗娜,李世光,等.基于攝像頭的智能車控制系統(tǒng)設(shè)計(jì)[J].自動(dòng)化與儀表,2015(6):1-4.
[4] 潘 磊,葛中芹,莊建軍,等.基于FPGA的HDMI視頻流圖像處理的系統(tǒng)設(shè)計(jì)[J].實(shí)驗(yàn)室研究與探索,2015,34(10):76-80.
[5] 范哲意,周治國,劉志文.基于FPGA和模型化設(shè)計(jì)的圖像處理實(shí)驗(yàn)平臺(tái)[J].實(shí)驗(yàn)室研究與探索,2013,32(4):63-66.
[6] 趙 偉,吳正博,曾志輝.基于Ov6620的圖像采集系統(tǒng)的設(shè)計(jì)[J].自動(dòng)化與儀器儀表,2012(6):82-83.
[7] OV6620datesheet[EB/OL].pdf.http://html.alldatasheet.com /html-pdf/ 103226/ETC/OV6620/53/1/OV6620.html.
[8] 田志宏,王 瑩,王 杰,等.多門控制及圖像實(shí)時(shí)采集系統(tǒng)的設(shè)計(jì)[J].實(shí)驗(yàn)室研究與探索,2014,33(8):37-40.
[9] 李興澤,王福平. 基于CCD攝像頭的小區(qū)自動(dòng)循跡停車系統(tǒng)[J].計(jì)算機(jī)應(yīng)用,2013,33(S1):321-323.
[10] 朱鳳武,于豐華,韓 雨,等.基于攝像頭循跡的智能汽車路徑識(shí)別研究[J].中國農(nóng)機(jī)化學(xué)報(bào),2013,34(5):256-259.
[11] 趙 偉,吳正博,曾志輝.基于Ov6620的圖像采集系統(tǒng)的設(shè)計(jì)[J].自動(dòng)化與儀器儀表,2012(6):82-83.
[12] 李旭東,廖中浩,孟 嬌,等.基于CMOS攝像頭的智能車控制系統(tǒng)設(shè)計(jì)及實(shí)現(xiàn)[J].吉林大學(xué)學(xué)報(bào),2013,31(4):414-418.
[13] 陳慶強(qiáng),湯龍梅,蔡文培.基于攝像頭的智能車路徑識(shí)別與方向控制算法[J].福建工程學(xué)院學(xué)報(bào),2015,13(3):229-234.
[14] 羅 旭,廉小親,王濤.一種多路視頻信號(hào)分時(shí)遠(yuǎn)距離傳輸方法的實(shí)現(xiàn)[J].電子技術(shù)應(yīng)用,2015,41(3):158-160.
[15] 宏晶科技.STC15F系列單片機(jī)手冊(cè)[DB/OL]. www.stcmcu.com.
An Efficient Scheme for the Image Data Acquisition and Processing
ZENGXianyanga,c,YANGHonglib,c,YUHanqia
(a. Industrial Center;b. Department of Mathematics and Physics,c. Department of Mathematics, Nanjing Institute of Technology, Nanjing 210093,China)
Due to the high speed of camera in outputting image data and the high frequency of PCLK pixel synchronizing signal, the single chip microcomputer has low efficiency in image data acquisition. This article studies the working principle of the camera, designs the hardware circuit diagram of the single chip microcomputer system, and writes simplified C language codes. After the arrival of the row interrupt signal, the collecting and storing of the pixels image data of the row will be done in order. In the processing, there is no loop statement which is redundant at all. This approach saves the time and improves the efficiency in the data acquisition. This paper also designs the acquisition program to improve the image resolution for the following special case, where the image is made from a number of images. The experimental results show that the program can not only drive at low speed camera image data 51 single-chip microcomputer and can also run on such as high-speed STM32 microcontroller, so it can further improve the existing image acquisition speed and efficiency.
camera; single chip microcomputer; image acqucsition; C language
2016-09-15
南京工程學(xué)院2014年校級(jí)教學(xué)改革項(xiàng)目(JG201440);南京工程學(xué)院青年基金重點(diǎn)項(xiàng)目(QKJA201404);南京工程學(xué)院創(chuàng)新基金重大項(xiàng)目(CKJA201410)
曾憲陽(1979-),男,湖北隨州人,博士,實(shí)驗(yàn)師,研究方向:電子與通信。Tel.:13951950718;E-mail:zxy@njit.edu.cn
TP 212.9
A
1006-7167(2017)06-0147-04