基于机器视觉的嵌入式教室照明自动控制系统开发

2022-01-06 10:39李香萍
实验室研究与探索 2021年11期
关键词:差分灰度像素

白 煜, 李香萍

(天津大学a.电气自动化与信息工程学院;b.天津市类脑智能技术重点实验室,天津300072)

0 引 言

教室照明控制系统对于节省办学经费和保护学生视力有重要的意义。室内照明控制系统分为手动模式和自动控制模式[1-4]。基于传感器的自动控制模式中,传感器的数量和安放位置对照明控制效果的影响很大。室内环境的限制因素多,传感器布置困难。基于机器视觉的教室照明控制系统[5-7],解决了传感器布置的难题。机器视觉算法需要工控机来实现,使得系统的成本和复杂度较高,缺乏灵活性,且不适合实践教学使用。

本文基于嵌入式平台,设计了机器视觉算法,对教室监控设备获取的图像进行处理,得到室内照明亮度和人员位置信息。在此基础上,实现教室照明自动控制。本系统的特点是:不需要传感器,仅利用教室已有的监控设备,获得基本信息;单层结构,独立运行,无须上位机和组网;基于嵌入式平台,成本低、使用灵活,适用于实践教学。

1 系统设计

1.1 系统方案

如图1所示,中型教室内部分为6个区域,假定每个区域安装一组灯。嵌入式平台的主要任务是控制摄像机的工作状态,执行机器视觉算法,控制继电器。

图1 基于机器视觉的嵌入式教室照明自动控制系统框图

1.2 机器视觉算法

本系统的机器视觉算法分为人员位置检测和照明亮度测量两部分。设计难点为优化算法,使之适应嵌入式系统有限的存储和计算能力。

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 教室内部平均灰度值计算区域

2 硬件原理图及电路连接

系统使用的嵌入式平台为STM32开发板,内核为STM32F103。图5所示为系统实物图,包含开发板、右侧为一组继电器、左下角为OV7725摄像机。

图5 系统整体实物图

2.1 STM32F103和OV7725电路连接

OV7725与STM32开发板的对应接口,见表2中CAMERA接口。STM32F103通过OV_SDA和OV_SCL将控制信息写入OV7725的寄存器,控制图像的输出格式。仅当STM32F103的FIFO写使能信号FIFO_WEN为高电平,OV7725行同步信号OV_HREF为低电平时,数据才能写入STM32F103的内部Flash。

2.2 外部存储空间和STM32F103电路连接

STM32F103的内存较小,需要增加外部存储器,存储16幅背景图像。系统使用W25Q128芯片作为外部存储器,容量为16 MB。该芯片与STM32开发板的接口,见表2中的W25Q128接口。

2.3 液晶显示屏和STM32F103电路连接

7 cm的液晶显示屏,采用16 bit FSMC总线与STM32开发板连接,接口如表2中液晶屏接口所示。

2.4 输出控制电路的连接

对于中型教室,本系统共需要输出6路控制信号,分别控制6个电磁继电器的闭合。继电器与STM32连接方式,如表2中的电磁继电器接口所示。

表2 STM32F103 GPIO接口分配情况

3 编程实现

本文设计的机器视觉算法流程如图6所示。首先进行硬件初始化,设定中断等级等。然后获取一帧教室图像,计算平均灰度值,判断是否需要开灯。如果需要开灯,则将6个输出接口设置为高电平,点亮所有灯具,并保持60 s供学生选择座位。否则关闭所有灯具,进入下一步。

图6 机器视觉算法流程图

3.1 OV7725图像输出

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) }

3.2 图像平均灰度计算程序

采用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)

3.3 图像显示至LCD显示屏

程序中使用LCD_Scan_Dir(U2D_L2R)函数,通过FSMC总线控制器将数据写入LCD中的RAM。

3.4 图像预处理

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);}

3.5 背景差分实现

将两幅图像对应像素进行差分,需要循环读取像素。每个循环,分别读取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 图像处理流程中间图像

3.6 人员位置计算

程序实现代码如下:

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);

}}

3.7 输出控制

STM32F103的对应接口输出高电平“1”时,与此接口相连的继电器导通,反之继电器断开。

4 系统响应速度分析

采用串口调试软件,获取OV7725向STM32F103传输图像的帧率,帧率越大说明处理速度越快,帧率越小则说明越慢。综上,系统可以保证在10 s之内处理完一帧图像,基本满足实际使用需要(见表4)。

表4 系统响应耗时

5 结 语

本系统已在本科毕业设计和大学生创新实践活动中得到多次应用,学生参与的积极性很高,教学效果反映良好。本系统可作为全国大学生电子设计大赛的选手选拔和实训项目。将该系统与基于机器视觉的面碗旋转对正系统、产品缺陷检测系统和机器人导航系统打包,开设基于机器视觉的实训项目群,更好的培养学生的创新实践能力。

猜你喜欢
差分灰度像素
RLW-KdV方程的紧致有限差分格式
符合差分隐私的流数据统计直方图发布
采用改进导重法的拓扑结构灰度单元过滤技术
像素前线之“幻影”2000
数列与差分
Bp-MRI灰度直方图在鉴别移行带前列腺癌与良性前列腺增生中的应用价值
“像素”仙人掌
ÉVOLUTIONDIGAE Style de vie tactile
基于最大加权投影求解的彩色图像灰度化对比度保留算法
高像素不是全部