白 煜, 李香萍
(天津大學a.電氣自動化與信息工程學院;b.天津市類腦智能技術重點實驗室,天津300072)
教室照明控制系統對于節省辦學經費和保護學生視力有重要的意義。室內照明控制系統分為手動模式和自動控制模式[1-4]。基于傳感器的自動控制模式中,傳感器的數量和安放位置對照明控制效果的影響很大。室內環境的限制因素多,傳感器布置困難。基于機器視覺的教室照明控制系統[5-7],解決了傳感器布置的難題。機器視覺算法需要工控機來實現,使得系統的成本和復雜度較高,缺乏靈活性,且不適合實踐教學使用。
本文基于嵌入式平臺,設計了機器視覺算法,對教室監控設備獲取的圖像進行處理,得到室內照明亮度和人員位置信息。在此基礎上,實現教室照明自動控制。本系統的特點是:不需要傳感器,僅利用教室已有的監控設備,獲得基本信息;單層結構,獨立運行,無須上位機和組網;基于嵌入式平臺,成本低、使用靈活,適用于實踐教學。
如圖1所示,中型教室內部分為6個區域,假定每個區域安裝一組燈。嵌入式平臺的主要任務是控制攝像機的工作狀態,執行機器視覺算法,控制繼電器。

圖1 基于機器視覺的嵌入式教室照明自動控制系統框圖
本系統的機器視覺算法分為人員位置檢測和照明亮度測量兩部分。設計難點為優化算法,使之適應嵌入式系統有限的存儲和計算能力。
1.2.1 人員位置檢測算法
(1)人員位置計算。基于圖像處理的人體檢測算法,大致可分為背景差分法[8]、幀間差分法[9]、光流法[10]3種。根據算法的硬件開銷和處理效果,本文選用背景差分法。
根據文獻[8]中對背景差分法的定義可得

式中:Fn(x,y)為差分結果圖像;Bn(x,y)、Jn(x,y)分別為當前時刻背景圖像和教室實時圖像矩陣中對應的灰度級;T=30為一常數。將Fn(x,y)中灰度級大于等于30的位置標記為1,反之為0。在Fn(x,y)的基礎上,進行室內人員位置計算。
構建一個6×10的矩形窗,令其在Fn(x,y)上移動。若窗內標記為1的像素個數≥50,則認為此區域有人。
圖2為像素級教室內部劃分示意圖,圖像大小為320×240。

圖2 教室區域像素級劃分
假定攝像機位于教室后面中間位置,區域1、2位于圖像0~50行,區域3、4位于圖像51~90行,區域5、6位于圖像91~120行,各區域寬為160列。圖像中121~240行為講臺和墻壁。為提高速度,縱向每隔3行掃描一次,橫向每隔5列掃描一次。
(2)背景圖像構建。背景圖像構建是背景差分法的關鍵。目前,已有的背景構建方法,例如中值法[11]、均值法[12]、高斯分布法[13],都存在硬件開銷大、計算復雜等不足,在嵌入式平臺上難以實現,需要設計更簡單有效的方法。
本文采集不同情況下教室內無人時的圖像作為背景。針對圖1所示的中型教室,根據燈具亮滅,有26個不同的背景,需要系統存儲64幅圖片。圖1中區域1和區域3、6相距較遠,可忽略區域3、6的燈光對區域1的影響。對于區域1,只需考慮區域1、2、4、5照明影響。其余同理,可得表1。

表1 背景模板所需考慮情況
根據表1,通過不同排列組合方式將原本需要的64個背景圖像減少為16個,如圖3所示。

圖3 16幅背景圖像中6個區域照明燈具的開關情況
1.2.2 照明強度測量算法
根據實驗結果可得,光照強度與圖像的灰度正相關[14]。通過計算圖像灰度來測量光照強度。
計算如圖4中兩個紅色區域的平均灰度值,即黑板兩側2塊50×50像素的區域。對應圖2,2塊區域的范圍為:160~209行,40~89列、240~299列。若平均灰度值≥120,說明教室光照充足,反之說明太弱。測量該值的作用為:判斷室內是否太暗,提前開燈防止人員檢測算法失效。系統計算有人區域的圖像灰度值,若≥150則逐一關燈,若<120則逐一開燈,否則保持不變。

圖4 教室內部平均灰度值計算區域
系統使用的嵌入式平臺為STM32開發板,內核為STM32F103。圖5所示為系統實物圖,包含開發板、右側為一組繼電器、左下角為OV7725攝像機。

圖5 系統整體實物圖
OV7725與STM32開發板的對應接口,見表2中CAMERA接口。STM32F103通過OV_SDA和OV_SCL將控制信息寫入OV7725的寄存器,控制圖像的輸出格式。僅當STM32F103的FIFO寫使能信號FIFO_WEN為高電平,OV7725行同步信號OV_HREF為低電平時,數據才能寫入STM32F103的內部Flash。
STM32F103的內存較小,需要增加外部存儲器,存儲16幅背景圖像。系統使用W25Q128芯片作為外部存儲器,容量為16 MB。該芯片與STM32開發板的接口,見表2中的W25Q128接口。
7 cm的液晶顯示屏,采用16 bit FSMC總線與STM32開發板連接,接口如表2中液晶屏接口所示。
對于中型教室,本系統共需要輸出6路控制信號,分別控制6個電磁繼電器的閉合。繼電器與STM32連接方式,如表2中的電磁繼電器接口所示。

表2 STM32F103 GPIO接口分配情況
本文設計的機器視覺算法流程如圖6所示。首先進行硬件初始化,設定中斷等級等。然后獲取一幀教室圖像,計算平均灰度值,判斷是否需要開燈。如果需要開燈,則將6個輸出接口設置為高電平,點亮所有燈具,并保持60 s供學生選擇座位。否則關閉所有燈具,進入下一步。

圖6 機器視覺算法流程圖
3.1.1 設置圖像輸出格式
通過SCCB控制總線,寫OV7725的COM7寄存器,可設置圖像輸出格式。COM7寄存器地址為0X12。根據表3,可得控制字為“0100 0110”即0X46。

表3 COM7寄存器各位表示意義
3.1.2 圖像的輸出過程
(1)捕獲圖像輸出信號。當幀同步信號為高電平、行同步信號為低電平時,OV7725輸出一行數據。STM32F103采用外部中斷8捕獲OV7725的幀同步信號,中斷8程序代碼如下:
if(EXTI_GetITStatus(EXTI_Line8)==SET);//外部8的中斷
{
OV7670_WRST=0; //復位FIFO芯片寫指針 OV7670_WRST=1;
OV7670_WREN=1; //FIFO芯片寫使能
ov_sta++; //幀中斷加1
}
(2)STM32F103從OV7725的FIFO中讀取圖像。讀取過程為:STM32F103復位FIFO讀指針,給FIFO讀時鐘,1個像素占用2個Byte,第1個時鐘讀取高Byte,第2個時鐘讀取低Byte。QVGA模式RGB565格式下,需要循環320×240×2次,讀取1幀圖像。將讀取的圖像存儲到內部Flash,進行圖像處理;同時,將數據寫入到LCD的RAM,進行顯示。
STM32F103的SRAM只有64 KB,不能申請150 KB的二維數組作為中間變量。編程時申請一個1 024×2 Bytes的數組,使用變量buf_flag作為標記,當buf_flag對1024取模等于1 023時,將存儲1 024個像素數據的數組寫入內部Flash。重復75次上述過程讀取1幀圖像。使用2層循環完成1幀QVGA圖像的讀取。第1層循環240次,是圖像的寬度,第2層循環320次,是圖像的長度。代碼如下:
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,說明教室照明不暗,令b_flag=0;反之說明教室光線弱,令b_flag=1。
為了提高算法穩定性,采用一個8 bit無符號數b_buff作為標記,每次左移1位,最低位變成b_flag,最高位舍棄,最低位用于記錄最新的灰度平均值,如果這個標記等于0XFF,說明有連續8幀圖像的b_flag都為1,連續8幀圖像的灰度平均值都低于閾值,此時室內需要開燈。
b_buff?=1;//左移一位,
if(b_flag==1)b_buff+=1;
if(b_buff==0XFF)
程序中使用LCD_Scan_Dir(U2D_L2R)函數,通過FSMC總線控制器將數據寫入LCD中的RAM。
3.4.1 圖像的灰度化
圖像灰度化之前,需要分離R、G、B分量。由RGB565輸出標準可知,每個像素占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圖像轉化成灰度圖像的方法通常有平均值法、最大值法和加權平均值法等[15]。3種方法中,加權平均值法最符合人眼特征,且不同顏色灰度值的區分度高,該方法通過對3個分量賦予不同的權值,得到加權平均值示灰度值。

式中,f(R,G,B)為灰度值,代碼實現如下:
camera_gray=(30*camera_red+59*camera_green+
11*camera_blue+50)/10);
編程時為了減少Flash的讀寫次數,先將OV7725輸出的圖像灰度化后,再存儲到內部Flash中。
3.4.2 背景圖像的存入
背景圖像存儲于外部存儲器。核心代碼如下,括號中的參數為背景圖像的序號。
picture2[(buf_flag% 128)]=camera_gray;
if(buf_flag%128==127)
{W25 QXX_Write(picture2,((ad_flag+1)*76800+((buf_flag/128)*128)),128);}
將兩幅圖像對應像素進行差分,需要循環讀取像素。每個循環,分別讀取2幅圖像中1024個對應像素數據,對每個像素進行差分。具體代碼如下:
STMFlash_Read(Flash_SAVE_ADDR+(i*2048),picture1,1024);
W25QXX_Read(picture2,i*1024,1024);//外部Flash讀背景
for(j=0;j<1024;j++)//對每數組中每個像素進行差分
{
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)為灰度化后的教室實時圖像,圖7(c)為差分后的灰度圖像,圖7(d)為二值化圖像。最終差分后的圖像為一幅320×240二值圖像。

圖7 圖像處理流程中間圖像
程序實現代碼如下:
STMFlash_Read(Flash_SAVE_ADDR+(i*960),picture1,1920);
//一次讀取6行,需要讀取1920個數據
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++;}
//計算每個6×10方塊中像素為1的個數。
}
if(coment1>55)flag1=1;
//如≥55,則此區域有人,令flag1=1并跳出循環
if(flag1==1)break;
根據圖6,當b_buff為0XFF時,對教室中的人員進行識別。依次執行差分、去噪、人員識別。人員識別完成后判斷人員位置是否變化。判斷方法是設2個8 bit無符號整數updatebuf1和updatebuf2,updatebuf1存儲上一幀圖像的人員位置,updatebuf2存儲當前幀的人員位置,如果兩個數相同則不需要更改燈光,否則需要根據新的識別結果更改燈光控制,并對背景進行更新。
實現代碼如下:
cf();//灰度圖像背景差分,并進行二值化
remo_noise();//圖像去噪,二值化形態學操作
recg_person();//檢驗個區域是否有人
updatebuf2=six2one(flag1_w,flag2_w,flag3_w,flag1_w,flag4_w,flag5_w);//計算對應背景圖像存儲的首地址
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++);//更新背景,并存儲到w25q128
{
25QXX_Read(picture4,(updatebuff2+1)*76 800+j*1 024,1 024);
W25QXX_Write(picture4,j*1 024,1 024);
}}
STM32F103的對應接口輸出高電平“1”時,與此接口相連的繼電器導通,反之繼電器斷開。
采用串口調試軟件,獲取OV7725向STM32F103傳輸圖像的幀率,幀率越大說明處理速度越快,幀率越小則說明越慢。綜上,系統可以保證在10 s之內處理完一幀圖像,基本滿足實際使用需要(見表4)。

表4 系統響應耗時
本系統已在本科畢業設計和大學生創新實踐活動中得到多次應用,學生參與的積極性很高,教學效果反映良好。本系統可作為全國大學生電子設計大賽的選手選拔和實訓項目。將該系統與基于機器視覺的面碗旋轉對正系統、產品缺陷檢測系統和機器人導航系統打包,開設基于機器視覺的實訓項目群,更好的培養學生的創新實踐能力。