白 煜, 李香萍
(天津大學(xué)a.電氣自動(dòng)化與信息工程學(xué)院;b.天津市類腦智能技術(shù)重點(diǎn)實(shí)驗(yàn)室,天津300072)
教室照明控制系統(tǒng)對(duì)于節(jié)省辦學(xué)經(jīng)費(fèi)和保護(hù)學(xué)生視力有重要的意義。室內(nèi)照明控制系統(tǒng)分為手動(dòng)模式和自動(dòng)控制模式[1-4]?;趥鞲衅鞯淖詣?dòng)控制模式中,傳感器的數(shù)量和安放位置對(duì)照明控制效果的影響很大。室內(nèi)環(huán)境的限制因素多,傳感器布置困難?;跈C(jī)器視覺(jué)的教室照明控制系統(tǒng)[5-7],解決了傳感器布置的難題。機(jī)器視覺(jué)算法需要工控機(jī)來(lái)實(shí)現(xiàn),使得系統(tǒng)的成本和復(fù)雜度較高,缺乏靈活性,且不適合實(shí)踐教學(xué)使用。
本文基于嵌入式平臺(tái),設(shè)計(jì)了機(jī)器視覺(jué)算法,對(duì)教室監(jiān)控設(shè)備獲取的圖像進(jìn)行處理,得到室內(nèi)照明亮度和人員位置信息。在此基礎(chǔ)上,實(shí)現(xiàn)教室照明自動(dòng)控制。本系統(tǒng)的特點(diǎn)是:不需要傳感器,僅利用教室已有的監(jiān)控設(shè)備,獲得基本信息;單層結(jié)構(gòu),獨(dú)立運(yùn)行,無(wú)須上位機(jī)和組網(wǎng);基于嵌入式平臺(tái),成本低、使用靈活,適用于實(shí)踐教學(xué)。
如圖1所示,中型教室內(nèi)部分為6個(gè)區(qū)域,假定每個(gè)區(qū)域安裝一組燈。嵌入式平臺(tái)的主要任務(wù)是控制攝像機(jī)的工作狀態(tài),執(zhí)行機(jī)器視覺(jué)算法,控制繼電器。
圖1 基于機(jī)器視覺(jué)的嵌入式教室照明自動(dòng)控制系統(tǒng)框圖
本系統(tǒng)的機(jī)器視覺(jué)算法分為人員位置檢測(cè)和照明亮度測(cè)量?jī)刹糠?。設(shè)計(jì)難點(diǎn)為優(yōu)化算法,使之適應(yīng)嵌入式系統(tǒng)有限的存儲(chǔ)和計(jì)算能力。
1.2.1 人員位置檢測(cè)算法
(1)人員位置計(jì)算?;趫D像處理的人體檢測(cè)算法,大致可分為背景差分法[8]、幀間差分法[9]、光流法[10]3種。根據(jù)算法的硬件開(kāi)銷和處理效果,本文選用背景差分法。
根據(jù)文獻(xiàn)[8]中對(duì)背景差分法的定義可得
式中:Fn(x,y)為差分結(jié)果圖像;Bn(x,y)、Jn(x,y)分別為當(dāng)前時(shí)刻背景圖像和教室實(shí)時(shí)圖像矩陣中對(duì)應(yīng)的灰度級(jí);T=30為一常數(shù)。將Fn(x,y)中灰度級(jí)大于等于30的位置標(biāo)記為1,反之為0。在Fn(x,y)的基礎(chǔ)上,進(jìn)行室內(nèi)人員位置計(jì)算。
構(gòu)建一個(gè)6×10的矩形窗,令其在Fn(x,y)上移動(dòng)。若窗內(nèi)標(biāo)記為1的像素個(gè)數(shù)≥50,則認(rèn)為此區(qū)域有人。
圖2為像素級(jí)教室內(nèi)部劃分示意圖,圖像大小為320×240。
圖2 教室區(qū)域像素級(jí)劃分
假定攝像機(jī)位于教室后面中間位置,區(qū)域1、2位于圖像0~50行,區(qū)域3、4位于圖像51~90行,區(qū)域5、6位于圖像91~120行,各區(qū)域?qū)挒?60列。圖像中121~240行為講臺(tái)和墻壁。為提高速度,縱向每隔3行掃描一次,橫向每隔5列掃描一次。
(2)背景圖像構(gòu)建。背景圖像構(gòu)建是背景差分法的關(guān)鍵。目前,已有的背景構(gòu)建方法,例如中值法[11]、均值法[12]、高斯分布法[13],都存在硬件開(kāi)銷大、計(jì)算復(fù)雜等不足,在嵌入式平臺(tái)上難以實(shí)現(xiàn),需要設(shè)計(jì)更簡(jiǎn)單有效的方法。
本文采集不同情況下教室內(nèi)無(wú)人時(shí)的圖像作為背景。針對(duì)圖1所示的中型教室,根據(jù)燈具亮滅,有26個(gè)不同的背景,需要系統(tǒng)存儲(chǔ)64幅圖片。圖1中區(qū)域1和區(qū)域3、6相距較遠(yuǎn),可忽略區(qū)域3、6的燈光對(duì)區(qū)域1的影響。對(duì)于區(qū)域1,只需考慮區(qū)域1、2、4、5照明影響。其余同理,可得表1。
表1 背景模板所需考慮情況
根據(jù)表1,通過(guò)不同排列組合方式將原本需要的64個(gè)背景圖像減少為16個(gè),如圖3所示。
圖3 16幅背景圖像中6個(gè)區(qū)域照明燈具的開(kāi)關(guān)情況
1.2.2 照明強(qiáng)度測(cè)量算法
根據(jù)實(shí)驗(yàn)結(jié)果可得,光照強(qiáng)度與圖像的灰度正相關(guān)[14]。通過(guò)計(jì)算圖像灰度來(lái)測(cè)量光照強(qiáng)度。
計(jì)算如圖4中兩個(gè)紅色區(qū)域的平均灰度值,即黑板兩側(cè)2塊50×50像素的區(qū)域。對(duì)應(yīng)圖2,2塊區(qū)域的范圍為:160~209行,40~89列、240~299列。若平均灰度值≥120,說(shuō)明教室光照充足,反之說(shuō)明太弱。測(cè)量該值的作用為:判斷室內(nèi)是否太暗,提前開(kāi)燈防止人員檢測(cè)算法失效。系統(tǒng)計(jì)算有人區(qū)域的圖像灰度值,若≥150則逐一關(guān)燈,若<120則逐一開(kāi)燈,否則保持不變。
圖4 教室內(nèi)部平均灰度值計(jì)算區(qū)域
系統(tǒng)使用的嵌入式平臺(tái)為STM32開(kāi)發(fā)板,內(nèi)核為STM32F103。圖5所示為系統(tǒng)實(shí)物圖,包含開(kāi)發(fā)板、右側(cè)為一組繼電器、左下角為OV7725攝像機(jī)。
圖5 系統(tǒng)整體實(shí)物圖
OV7725與STM32開(kāi)發(fā)板的對(duì)應(yīng)接口,見(jiàn)表2中CAMERA接口。STM32F103通過(guò)OV_SDA和OV_SCL將控制信息寫入OV7725的寄存器,控制圖像的輸出格式。僅當(dāng)STM32F103的FIFO寫使能信號(hào)FIFO_WEN為高電平,OV7725行同步信號(hào)OV_HREF為低電平時(shí),數(shù)據(jù)才能寫入STM32F103的內(nèi)部Flash。
STM32F103的內(nèi)存較小,需要增加外部存儲(chǔ)器,存儲(chǔ)16幅背景圖像。系統(tǒng)使用W25Q128芯片作為外部存儲(chǔ)器,容量為16 MB。該芯片與STM32開(kāi)發(fā)板的接口,見(jiàn)表2中的W25Q128接口。
7 cm的液晶顯示屏,采用16 bit FSMC總線與STM32開(kāi)發(fā)板連接,接口如表2中液晶屏接口所示。
對(duì)于中型教室,本系統(tǒng)共需要輸出6路控制信號(hào),分別控制6個(gè)電磁繼電器的閉合。繼電器與STM32連接方式,如表2中的電磁繼電器接口所示。
表2 STM32F103 GPIO接口分配情況
本文設(shè)計(jì)的機(jī)器視覺(jué)算法流程如圖6所示。首先進(jìn)行硬件初始化,設(shè)定中斷等級(jí)等。然后獲取一幀教室圖像,計(jì)算平均灰度值,判斷是否需要開(kāi)燈。如果需要開(kāi)燈,則將6個(gè)輸出接口設(shè)置為高電平,點(diǎn)亮所有燈具,并保持60 s供學(xué)生選擇座位。否則關(guān)閉所有燈具,進(jìn)入下一步。
圖6 機(jī)器視覺(jué)算法流程圖
3.1.1 設(shè)置圖像輸出格式
通過(guò)SCCB控制總線,寫OV7725的COM7寄存器,可設(shè)置圖像輸出格式。COM7寄存器地址為0X12。根據(jù)表3,可得控制字為“0100 0110”即0X46。
表3 COM7寄存器各位表示意義
3.1.2 圖像的輸出過(guò)程
(1)捕獲圖像輸出信號(hào)。當(dāng)幀同步信號(hào)為高電平、行同步信號(hào)為低電平時(shí),OV7725輸出一行數(shù)據(jù)。STM32F103采用外部中斷8捕獲OV7725的幀同步信號(hào),中斷8程序代碼如下:
if(EXTI_GetITStatus(EXTI_Line8)==SET);//外部8的中斷
{
OV7670_WRST=0; //復(fù)位FIFO芯片寫指針 OV7670_WRST=1;
OV7670_WREN=1; //FIFO芯片寫使能
ov_sta++; //幀中斷加1
}
(2)STM32F103從OV7725的FIFO中讀取圖像。讀取過(guò)程為:STM32F103復(fù)位FIFO讀指針,給FIFO讀時(shí)鐘,1個(gè)像素占用2個(gè)Byte,第1個(gè)時(shí)鐘讀取高Byte,第2個(gè)時(shí)鐘讀取低Byte。QVGA模式RGB565格式下,需要循環(huán)320×240×2次,讀取1幀圖像。將讀取的圖像存儲(chǔ)到內(nèi)部Flash,進(jìn)行圖像處理;同時(shí),將數(shù)據(jù)寫入到LCD的RAM,進(jìn)行顯示。
STM32F103的SRAM只有64 KB,不能申請(qǐng)150 KB的二維數(shù)組作為中間變量。編程時(shí)申請(qǐng)一個(gè)1 024×2 Bytes的數(shù)組,使用變量buf_flag作為標(biāo)記,當(dāng)buf_flag對(duì)1024取模等于1 023時(shí),將存儲(chǔ)1 024個(gè)像素?cái)?shù)據(jù)的數(shù)組寫入內(nèi)部Flash。重復(fù)75次上述過(guò)程讀取1幀圖像。使用2層循環(huán)完成1幀QVGA圖像的讀取。第1層循環(huán)240次,是圖像的寬度,第2層循環(huán)320次,是圖像的長(zhǎng)度。代碼如下:
for(i=0;i<OV7725_WINDOW_HEIGHT;i++);//共240行
{for(j=0;j<OV7725_WINDOW_WIDTH;j++);//320每行
{
picture2[(buf_flag% 1024)]=camera_gray;
if(buf_flag%1024==1023)
{
STMFlash_Write(Flash_SAVE_ADDR+((buf_flag/1024)*2048),picture2,1024) }
}
}
采用brightness1表示灰度值得總和。
if((i>=160 && i<210 && j>=40 &&j<90)||(i>=160 && i<210 && j>=250 &&j<300))
{
brightness1=brightness1+camera_gray;
}
總灰度值除以5 000,得到灰度平均值,如果該值大于120,說(shuō)明教室照明不暗,令b_flag=0;反之說(shuō)明教室光線弱,令b_flag=1。
為了提高算法穩(wěn)定性,采用一個(gè)8 bit無(wú)符號(hào)數(shù)b_buff作為標(biāo)記,每次左移1位,最低位變成b_flag,最高位舍棄,最低位用于記錄最新的灰度平均值,如果這個(gè)標(biāo)記等于0XFF,說(shuō)明有連續(xù)8幀圖像的b_flag都為1,連續(xù)8幀圖像的灰度平均值都低于閾值,此時(shí)室內(nèi)需要開(kāi)燈。
b_buff?=1;//左移一位,
if(b_flag==1)b_buff+=1;
if(b_buff==0XFF)
程序中使用LCD_Scan_Dir(U2D_L2R)函數(shù),通過(guò)FSMC總線控制器將數(shù)據(jù)寫入LCD中的RAM。
3.4.1 圖像的灰度化
圖像灰度化之前,需要分離R、G、B分量。由RGB565輸出標(biāo)準(zhǔn)可知,每個(gè)像素占2 Byte,第1 Byte高5位表示R分量,第1 Byte低3位以及第2 Byte高3位表示G分量,第2 Byte低5位表示B分量。
提取R、G、B的程序代碼為:
camera_red=(color&0xF800)?8;camera_green=
(color&0x07E0)?3;
camera_blue=(color&0x001F)?3;
將R、G、B圖像轉(zhuǎn)化成灰度圖像的方法通常有平均值法、最大值法和加權(quán)平均值法等[15]。3種方法中,加權(quán)平均值法最符合人眼特征,且不同顏色灰度值的區(qū)分度高,該方法通過(guò)對(duì)3個(gè)分量賦予不同的權(quán)值,得到加權(quán)平均值示灰度值。
式中,f(R,G,B)為灰度值,代碼實(shí)現(xiàn)如下:
camera_gray=(30*camera_red+59*camera_green+
11*camera_blue+50)/10);
編程時(shí)為了減少Flash的讀寫次數(shù),先將OV7725輸出的圖像灰度化后,再存儲(chǔ)到內(nèi)部Flash中。
3.4.2 背景圖像的存入
背景圖像存儲(chǔ)于外部存儲(chǔ)器。核心代碼如下,括號(hào)中的參數(shù)為背景圖像的序號(hào)。
picture2[(buf_flag% 128)]=camera_gray;
if(buf_flag%128==127)
{W25 QXX_Write(picture2,((ad_flag+1)*76800+((buf_flag/128)*128)),128);}
將兩幅圖像對(duì)應(yīng)像素進(jìn)行差分,需要循環(huán)讀取像素。每個(gè)循環(huán),分別讀取2幅圖像中1024個(gè)對(duì)應(yīng)像素?cái)?shù)據(jù),對(duì)每個(gè)像素進(jìn)行差分。具體代碼如下:
STMFlash_Read(Flash_SAVE_ADDR+(i*2048),picture1,1024);
W25QXX_Read(picture2,i*1024,1024);//外部Flash讀背景
for(j=0;j<1024;j++)//對(duì)每數(shù)組中每個(gè)像素進(jìn)行差分
{
if(picture1[j]>picture2[j]);
{
picture1[j]=picture1[j]-picture2[j];
if(picture2[j]<30)picture1[j]=0;
else picture1[j]=1;//若灰度差≥30,置1
}
else
{
picture1[j]=picture2[j]-picture1[j];
if(picture2[j]<30)picture1[j]=0;
else picture1[j]=1;
}
}
圖7(a)為教室背景圖像,圖7(b)為灰度化后的教室實(shí)時(shí)圖像,圖7(c)為差分后的灰度圖像,圖7(d)為二值化圖像。最終差分后的圖像為一幅320×240二值圖像。
圖7 圖像處理流程中間圖像
程序?qū)崿F(xiàn)代碼如下:
STMFlash_Read(Flash_SAVE_ADDR+(i*960),picture1,1920);
//一次讀取6行,需要讀取1920個(gè)數(shù)據(jù)
for(j=0;j<31;j++)
{for(k=0;k<6;k++)
{for(m=0;m<10;m++)
{if(picture1[k*320+m+j*5]==1)coment1++;}
//計(jì)算每個(gè)6×10方塊中像素為1的個(gè)數(shù)。
}
if(coment1>55)flag1=1;
//如≥55,則此區(qū)域有人,令flag1=1并跳出循環(huán)
if(flag1==1)break;
根據(jù)圖6,當(dāng)b_buff為0XFF時(shí),對(duì)教室中的人員進(jìn)行識(shí)別。依次執(zhí)行差分、去噪、人員識(shí)別。人員識(shí)別完成后判斷人員位置是否變化。判斷方法是設(shè)2個(gè)8 bit無(wú)符號(hào)整數(shù)updatebuf1和updatebuf2,updatebuf1存儲(chǔ)上一幀圖像的人員位置,updatebuf2存儲(chǔ)當(dāng)前幀的人員位置,如果兩個(gè)數(shù)相同則不需要更改燈光,否則需要根據(jù)新的識(shí)別結(jié)果更改燈光控制,并對(duì)背景進(jìn)行更新。
實(shí)現(xiàn)代碼如下:
cf();//灰度圖像背景差分,并進(jìn)行二值化
remo_noise();//圖像去噪,二值化形態(tài)學(xué)操作
recg_person();//檢驗(yàn)個(gè)區(qū)域是否有人
updatebuf2=six2one(flag1_w,flag2_w,flag3_w,flag1_w,flag4_w,flag5_w);//計(jì)算對(duì)應(yīng)背景圖像存儲(chǔ)的首地址
if(updatebuf2!=updatebuff1);//如相等,則不更新背景
{
if(flag1_w==1)GPIO_SetBits(GPIOD,GPIO_Pin_11);//更改
else GPIO_ResetBits(GPIOD,GPIO_Pin_11);
……
if(flag6_w==1)GPIO_SetBits(GPIOE,GPIO_Pin_2);
else GPIO_ResetBits(GPIOE,GPIO_Pin_2);
updatebuff1=updatebuff2;
for(j=0;j<75;j++);//更新背景,并存儲(chǔ)到w25q128
{
25QXX_Read(picture4,(updatebuff2+1)*76 800+j*1 024,1 024);
W25QXX_Write(picture4,j*1 024,1 024);
}}
STM32F103的對(duì)應(yīng)接口輸出高電平“1”時(shí),與此接口相連的繼電器導(dǎo)通,反之繼電器斷開(kāi)。
采用串口調(diào)試軟件,獲取OV7725向STM32F103傳輸圖像的幀率,幀率越大說(shuō)明處理速度越快,幀率越小則說(shuō)明越慢。綜上,系統(tǒng)可以保證在10 s之內(nèi)處理完一幀圖像,基本滿足實(shí)際使用需要(見(jiàn)表4)。
表4 系統(tǒng)響應(yīng)耗時(shí)
本系統(tǒng)已在本科畢業(yè)設(shè)計(jì)和大學(xué)生創(chuàng)新實(shí)踐活動(dòng)中得到多次應(yīng)用,學(xué)生參與的積極性很高,教學(xué)效果反映良好。本系統(tǒng)可作為全國(guó)大學(xué)生電子設(shè)計(jì)大賽的選手選拔和實(shí)訓(xùn)項(xiàng)目。將該系統(tǒng)與基于機(jī)器視覺(jué)的面碗旋轉(zhuǎn)對(duì)正系統(tǒng)、產(chǎn)品缺陷檢測(cè)系統(tǒng)和機(jī)器人導(dǎo)航系統(tǒng)打包,開(kāi)設(shè)基于機(jī)器視覺(jué)的實(shí)訓(xùn)項(xiàng)目群,更好的培養(yǎng)學(xué)生的創(chuàng)新實(shí)踐能力。