曾憲陽, 楊紅莉, 郁漢琪
(南京工程學院 a. 工業(yè)中心;b. 數(shù)理部;c. 數(shù)學系,南京 210093)
一種高效的圖像數(shù)據(jù)采集處理方案
曾憲陽a,c, 楊紅莉b,c, 郁漢琪a
(南京工程學院 a. 工業(yè)中心;b. 數(shù)理部;c. 數(shù)學系,南京 210093)

分析了攝像頭工作原理,設計了單片機系統(tǒng)硬件電路原理圖,編寫了精簡的C語言程序代碼。提出在行中斷信號到來后,按序采集存儲該行各像素點圖像數(shù)據(jù),去除冗余的循環(huán)判斷語句,節(jié)約了采集時間,提高了圖像采集效率。為滿足特殊場合需要,還設計了由多場圖像拼接成一幅圖像的數(shù)據(jù)采集方案程序,以提高圖像分辨率。實驗結(jié)果表明:該程序不僅可以驅(qū)動低速51單片機采集攝像頭圖像數(shù)據(jù),也可以在高速STM32等單片機上運行,以進一步提高現(xiàn)有圖像采集速度與效率。
攝像頭; 單片機; 圖像采集; C語言
機器人小車在使用攝像頭進行路面循跡時,為了采集到正確的圖像信息[1-3],往往需要單片機與高速PCLK信號同步。然而,由于攝像頭工作原理復雜,且51單片機運行速度低而無法滿足要求。為解決這一問題,大多數(shù)學者采用的方法是通過降低攝像頭輸出分辨率來減少數(shù)據(jù)量,或者換用成本更高的高檔單片機,這不僅降低了圖像成像質(zhì)量,也提高了系統(tǒng)成本,同時給多數(shù)不熟悉高檔單片機的學者帶來了困難[4-5]。本文分析了攝像頭的工作原理,在不改變攝像頭默認輸出分辨率的前提下,提出一種高效的圖像數(shù)據(jù)采集方案。該方案不僅能滿足低速單片機驅(qū)動攝像頭需要,而且還可移植到高速單片機如STM32上,以進一步提高現(xiàn)有圖像采集速度及效率。
圖1為通過SIGLENT示波器顯示的OV6620攝像頭行場中斷時序波形圖,其中第1行黃色波形是作者設置的圖像采集標志信號,第2行粉紅色波形是攝像頭發(fā)出的行中斷請求信號,第3行青綠色波形是攝像頭發(fā)出的場中斷請求信號。結(jié)合攝像頭原理,OV6620攝像頭在NAL制式下,每秒將會輸出25幀共50幅圖像,每幅圖像分辨率為356×292[6-8],共292行,356列。攝像頭引腳包括一個場中斷信號VSYNC以及一個行中斷信號HREF,場中斷信號VSYNC表示一副圖像的輸出起始信號,行中斷信號HREF表示每行數(shù)據(jù)輸出的起始信號。行中斷信號到來后,其高電平期間為數(shù)據(jù)輸出的有效期間,此時該行356個像素點數(shù)據(jù)將在PCLK的同步下,按序通過攝像頭數(shù)據(jù)輸出口Y0~Y7引腳依次輸出,每個像素點數(shù)據(jù)為8位。HREF低電平期間為無效時間區(qū),此時數(shù)據(jù)讀取無效。為減小圖像失真,用戶往往需根據(jù)PCLK同步信號來讀取各像素點數(shù)據(jù)[9-13]。

圖1 通過示波器觀察的OV6620攝像頭行場中斷輸出時序圖
2.1 系統(tǒng)整體方案
PCLK同步信號主要是防止圖像失真。低速單片機由于速度低無法同步PCLK信號,就無法讀取該行所有的356個像素點。然而圖像不失真的本質(zhì)要求是“保證每行數(shù)據(jù)坐標完全對齊”,其實只須要求單片機在行中斷請求信號到來后,時間間隔均勻的讀取Y0~Y7信號,并且在此過程中不被其他中斷請求信號中斷即可[14]。
根據(jù)以上方案,為提高效率,應減少行數(shù)并減少每行像素點采集數(shù)量,更重要的是必須將行中斷設置為高優(yōu)先級以防止被其他中斷請求信號干擾,這樣就可得到一個等比例縮放圖。
2.2 硬件電路原理圖設計
圖2為系統(tǒng)硬件電路原理圖。為提高單片機數(shù)據(jù)存儲器容量、提高單片機運行速度,選用增強型51單片機STC15F2K60S2[15]作為主控制芯片,其內(nèi)部包含2.048 KB擴展數(shù)據(jù)存儲器,可用來存放臨時圖像數(shù)據(jù)。其程序存儲器有60 KB左右,可用來存放較大程序代碼,并且內(nèi)部自帶復位電路。并且外部中斷可配置為上升或下降沿觸發(fā)方式,便于與OV6620攝像頭中斷請求信號匹配。Y0~Y7端口數(shù)據(jù)用以獲取圖像灰度數(shù)據(jù),場中斷請求信號HREF接至單片機外部中斷1引腳,并在單片機中設置為下跳沿觸發(fā)。行中斷請求信號VSYNC接至單片機外部中斷0引腳,在單片機中斷初始化程序中將觸發(fā)方式設置為上升沿觸發(fā)方式即可。

圖2 系統(tǒng)硬件電路原理圖
2.3 系統(tǒng)程序編寫
系統(tǒng)程序執(zhí)行速度對于本系統(tǒng)數(shù)據(jù)采集效率將起到至關重要的作用,因此程序代碼必須高效率。通常匯編語言程序效率較高,但不便于移植。本文將設計一種特殊結(jié)構(gòu)的C語言程序,并且精簡代碼,以達到與匯編語言相同的執(zhí)行效率。首先在程序存儲器RAM中開啟一個二維數(shù)組,用來臨時存放采集的圖像數(shù)據(jù)。設置行中斷為高優(yōu)先級中斷,場中斷為低優(yōu)先級別中斷,并且關閉其他中斷源。當場中斷信號到來后,開始接收一副新的圖像數(shù)據(jù)。設置系統(tǒng)每隔10行采集1行數(shù)據(jù),當行中斷滿足條件時開始采集該行數(shù)據(jù)。由于采集每行數(shù)據(jù)執(zhí)行的指令相同,工程師們通常采用循環(huán)判斷語句來完成采集任務,但每行數(shù)據(jù)有效采集時間只有40 μs,循環(huán)判斷語句將浪費寶貴的時間。為保證采集的高效性,應去除循環(huán)判斷語句,每個像素點的采集均占用一條獨立的語句,按照“讀—存儲—讀—存儲”的模式順序向下執(zhí)行,讀取的數(shù)據(jù)直接存入到二維數(shù)組中。這種程序結(jié)構(gòu)使得程序代碼長度增加,但避開了冗余的循環(huán)判斷,因此程序執(zhí)行的效率得到大大提高,采集速度也將達到最大值。同時注意到本文所選用的單片機程序存儲器容量是足夠滿足要求的。根據(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) //判斷一副圖像開始標志
{ RowCount++; //指向下一行
if((RowCount>20)&&(RowCount%10)==0)
{ ReceData_EN=1; }
if(RowCount>=226)//圖像接收完畢判斷
{ RowCount = 0; //復位各計數(shù)器
ReceData_EN = 0;
HREF_Flag = 0;
ArrayRow = 0;
EX0=0; //關閉行中斷
ArrayBinary(); //二值化處理
SendSeriPort();//發(fā)送給顯示終端
EX0=1;//使能中斷準備接收下一副圖像
} }}
其中,行中斷子程序流程圖如圖3所示。

圖3 行中斷子程序流程圖
3.1 實驗驗證
以機器人小車循跡黑線為例,小車通過攝像頭實時采集地面信息發(fā)送給51單片機,在keil C51編譯環(huán)境下編譯以上程序后下載到單片機。單片機通過采集數(shù)據(jù)、二值化處理,再通過串口將數(shù)據(jù)傳遞給PC上位機觀察,得到的圖像如圖4所示。

(a) 上位機PC顯示的圖像

(b) 51單片機采集到的二值化圖像
圖4 51單片機通過攝像頭采集到的路面圖像與電腦顯示的圖像對比
圖4展示了每行采集時間約為40 μs時的二值化圖像。圖4(a)為上位機視頻采集卡采集到的視頻圖像。圖4(b)顯示了采集圖像的二值化處理結(jié)果,0區(qū)域代表黑線部分,1區(qū)域代表白色地面,與圖4(a)對比沒有發(fā)現(xiàn)圖像出現(xiàn)變形情況,而且很好地再現(xiàn)了一場黑白圖像。該實驗不僅證明了本文攝像頭算法的可行性,也解決了51單片機采集圖像數(shù)據(jù)的難題。
由于考慮到所選單片機運行速度及內(nèi)部擴展RAM大小限制,因此以上單片機程序是將圖像數(shù)據(jù)控制在25行,每行28個點,使得圖像數(shù)據(jù)大小不超過內(nèi)部擴展RAM容量。但是在一些特殊場合,如果對圖像分辨率要求較高,可將分辨率設置為80行,每行采集100個像素點,此時單片機數(shù)據(jù)存儲器容量不足以存放整幅圖像,因此程序算法應做改進。將一副圖像拆分成相等的4幅小圖像,每幅圖像為20行×100個像素點,場中斷到來后,首先采集0~19行第1幅小圖像,采集完后關閉行、場中斷,經(jīng)二值化處理后通過串口發(fā)送給上位機。然后再打開行、場中斷,開始采集20~39行第2幅小圖像,重復以上步驟,直到第4幅圖像采集發(fā)送完畢,通過串口發(fā)送給上位機圖像采集結(jié)束標志信號,此時一幅高分辨率的圖像采集發(fā)送完畢。該程序算法提高了圖像分辨率,但是適當降低了數(shù)據(jù)采集速度,因為一幅圖像采集傳輸至少占用4場圖像的時間,可以滿足特殊場合下的用戶需求。其接收部分程序代碼(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 程序算法在高速單片機上的運行情況
圖5展示了程序代碼(2)在STM32高速單片機上運行的情形,攝像頭采集路面循跡黑線,經(jīng)過二值化處理后通過串口傳遞給上位機。由于程序代碼(2)的高效性,使得STM32單片機可以采集到更多的像素點和行數(shù),也即采集到了更高分辨率的圖像,本實驗驗證了程序的可行性以及高效性。其實驗現(xiàn)場如圖6所示。

圖5 程序運行在STM32高速單片機上的情形

圖6 實驗現(xiàn)場照片
本文根據(jù)低速單片機驅(qū)動攝像頭存在的困難,對OV6620攝像頭工作原理進行了剖析,設計了單片機采集攝像頭數(shù)據(jù)硬件電路,設計了順序讀取各像素點數(shù)據(jù)然后直接存儲的采集方案,去除了冗余的循環(huán)判斷,提高了數(shù)據(jù)采集效率。為了提高圖像分辨率,將圖像拆分成4幅小圖像分別采集傳輸,編寫了相應了C語言程序,能很好的在51單片機及STM32單片機上運行,驗證了程序的可行性及高效性。
[1] 成 怡,金海林,樊冬雪.四軸飛行器視覺組合導航系統(tǒng)設計與實現(xiàn)[J].計算機測量與控制,2014,22(11):3705-3711.
[2] 張 璐,宋秋紅.自動巡線小車的圖像采集系統(tǒng)開發(fā)與優(yōu)化[J].計算機工程與設計,2010,31(17):3754-3756.
[3] 高正中,趙麗娜,李世光,等.基于攝像頭的智能車控制系統(tǒng)設計[J].自動化與儀表,2015(6):1-4.
[4] 潘 磊,葛中芹,莊建軍,等.基于FPGA的HDMI視頻流圖像處理的系統(tǒng)設計[J].實驗室研究與探索,2015,34(10):76-80.
[5] 范哲意,周治國,劉志文.基于FPGA和模型化設計的圖像處理實驗平臺[J].實驗室研究與探索,2013,32(4):63-66.
[6] 趙 偉,吳正博,曾志輝.基于Ov6620的圖像采集系統(tǒng)的設計[J].自動化與儀器儀表,2012(6):82-83.
[7] OV6620datesheet[EB/OL].pdf.http://html.alldatasheet.com /html-pdf/ 103226/ETC/OV6620/53/1/OV6620.html.
[8] 田志宏,王 瑩,王 杰,等.多門控制及圖像實時采集系統(tǒng)的設計[J].實驗室研究與探索,2014,33(8):37-40.
[9] 李興澤,王福平. 基于CCD攝像頭的小區(qū)自動循跡停車系統(tǒng)[J].計算機應用,2013,33(S1):321-323.
[10] 朱鳳武,于豐華,韓 雨,等.基于攝像頭循跡的智能汽車路徑識別研究[J].中國農(nóng)機化學報,2013,34(5):256-259.
[11] 趙 偉,吳正博,曾志輝.基于Ov6620的圖像采集系統(tǒng)的設計[J].自動化與儀器儀表,2012(6):82-83.
[12] 李旭東,廖中浩,孟 嬌,等.基于CMOS攝像頭的智能車控制系統(tǒng)設計及實現(xiàn)[J].吉林大學學報,2013,31(4):414-418.
[13] 陳慶強,湯龍梅,蔡文培.基于攝像頭的智能車路徑識別與方向控制算法[J].福建工程學院學報,2015,13(3):229-234.
[14] 羅 旭,廉小親,王濤.一種多路視頻信號分時遠距離傳輸方法的實現(xiàn)[J].電子技術應用,2015,41(3):158-160.
[15] 宏晶科技.STC15F系列單片機手冊[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
南京工程學院2014年校級教學改革項目(JG201440);南京工程學院青年基金重點項目(QKJA201404);南京工程學院創(chuàng)新基金重大項目(CKJA201410)
曾憲陽(1979-),男,湖北隨州人,博士,實驗師,研究方向:電子與通信。Tel.:13951950718;E-mail:zxy@njit.edu.cn
TP 212.9
A
1006-7167(2017)06-0147-04