基于STM32F103的颜色及形状识别系统设计*
2023-10-29陈梅芬吴佳骏
陈梅芬,吴佳骏
(厦门海洋职业技术学院 信息工程学院,福建 厦门 361100)
0 引言
随着科学技术的发展,机器视觉技术在各个系统中得到了广泛的应用。颜色及形状识别是机器视觉技术的一个重要组成部分,关于图像及形状的识别算法和系统设计已有了较多的研究[1-4],如文[1]提出一种基于HSV空间与形状检测的餐盘识别算法,通过识别餐盘的颜色与形状,获取目标的信息并进行计价;文献[2]提出了基于MATLAB的颜色识别和基本形状参数的自动计算方法。目前,对颜色及形状识别的研究大部分是基于PC机平台或是资源较为丰富的嵌入式CPU, 本文提出一种基于STM32F103的颜色及形状识别系统设计,以满足资源较为有限的应用场景。
1 系统硬件电路设计
1.1 系统框架设计
本研究设计的基于STM32F103的颜色及形状识别系统,主要由STM32F103主控模块、带FIFO的摄像头模块等组成,其组成框图如图1所示。摄像头采用的是OV7725, STM32F103通过SCCB配置接口来配置摄像头模块,通过FIFO读时序将摄像头所获得的图像数据读到主控中。STM32F103主控模块将采集到的图像数据进行处理,通过串口输出颜色及形状识别的结果。
图1 系统组成框图
1.2 STM32F103主控模块
STM32F103主控模块采用了STM32F103ZET6芯片。STM32F103ZET6是基于ARM Cortex-M3的架构,最高主频为72 MHz, 供电电压为2.0 V~3.6 V, 内置64 k字节的SRAM和512 k字节的闪存[5]。
1.3 带FIFO的摄像头模块
OV7725摄像头最高支持640x480@60 Hz分辨率的视频输出,可通过标准的SCCB进行配置,能配置输出YUV422、RAW RGB, RGB(RGB444/RGB565、GRB422)这几种格式的视频数据,具有噪声抑制可调节的功能[6]。在本系统设计中,将OV7725配置成QVGA,RGB565视频输出。如图2所示,OV7725所采集到的图像数据通过FIFO_WE信号来控制是否写入AL422B FIFO中,AL422B内部带有3M bit存储空间,用于存储QVGA RGB565的数据时,可以缓存两帧的数据。P1为摄像头模块与STM32F103模块间的接口。其中SIO_C、SIO_D为标准的SCCB配置接口信号;VSYNC为标准的帧同步信号;FIFO_WR、FIFO_WRST分别为FIFO的写使能与写地址复位信号;FIFO_OE、FIFO_RCK、FIFO_RRST分别是FIFO的读使能、FIFO的读时钟、FIFO的读地址复位信号。
图2 带FIFO的摄像头模块的关键电路原理图
2 系统软件设计
2.1 系统软件总体设计
图3所示为系统软件总体设计流程图,STM32F103通过SCCB接口将OV7725摄像头模块初始为QVGA,RGB565输出,初始化UART4,将其波特率设置为115 200 bps。通过摄像头模块的VSYNC信号检测FIFO中是否有一帧完整的数据,当FIFO中有一帧完整的数据时,通过数据接口D0~D7读取一帧的数据,对其进行颜色识别,将识别后的数据以二值化的形式存储在STM32F103的内置RAM中,接着对二值化后的结果进行腐蚀操作,腐蚀操作后确定有效区域。形状识别模块实现对形状的判别,目前支持圆形、正方形和三角形的判别。最后,通过串口,将颜色及形状识别的结果传送出去。
图3 系统软件总体设计流程图
2.2 颜色识别及图像二值化设计
RGB颜色空间是图像处理中面向硬件、最常用、最基本的颜色空间,分别为红色(R),绿色(G)和蓝色(B)。红色、绿色和蓝色的不同组合可以构成几乎所有的其他颜色。HSV是根据颜色的直观性由A.R.Smith在1978年创建的一种颜色空间,也称六角锥体模型。HSV颜色空间由三部分组成,分别是色调(H),饱和度(S),明度(V)。HSV颜色空间与RGB颜色空间相比,它更接近人们对彩色的感知经验,更容易跟踪某种颜色的物体,经常在图像处理中用到[7]。
RGB转换到HSV的算法如下:
maxd=max(R,G,B);
mind=min(R,G,B);
V=max(R,G,B);
S=(maxd-mind)/maxd;
if (R == maxd) H =(G-B)/(maxd-mind)* 60;
if (G == maxd) H = 120+(B-R)/(maxd-mind)* 60;
if (B == maxd) H = 240 +(R-G)/(maxd-mind)* 60;
if (H <0) H = H+ 360.
S=S*100; //这一步是为了将S转化为整数,便于后面的计算
将RGB转换到HSV空间后,可通过HSV的数据范围来进行颜色的识别,主要是通过判断色调H是否落在某个颜色的范围内(通过H_color_value,H_color_range来设置范围,其中,H_color_value为中心色调,H_color_range为色调范围,这两个数值可根据应用场景做调整)。以红色为例,可通过如下的判断条件来判别是否是红色。
H_color_value=0; H_color_range=12;
if(((H>348)||(H<12)) &&(V>64) &&(S>20) )
*color_detect = 1;
else
*color_detect = 0.
在以上的判断条件中,(V>64) &&(S>20)用于判断是否是有效的彩色值,这里的64与20为经验值,可根据实际的应用场景做调整。
每个像素颜色识别的结果可以作为二值化的依据,当前像素的颜色如果是有效的颜色,则将此像素对应的二值化数值置1。对于QVGA分辨率的图像,共有320×240,即76 800个像素,若一个像素占用一个字节,则总共占用了75 k字节,而STM32F013ZET6共有64 k字节的内置SRAM, 所以在对图像进行二值化时,不允许用一个字节存储一个像素二值化后的数据,可将8个像素的二值化后的数值存储到一个字节中,以节约存储空间。如此,对于320×240的图像,其二值化后的数据占用了9 600字节,即大约9.4 k字节的存储空间。
2.3 腐蚀操作
图像的腐蚀的作用是将目标图像收缩,运算效果取决于结构元素大小内容和逻辑运算性质。腐蚀处理可表示成用结构元素对图像进行探测,找出图像中可放下该结构元素的位置。腐蚀是一种消除边界点,让边界点内缩的过程,可用来消除小且无意义的目标物。
对集合A与B,使用B对A进行腐蚀,用AΘB表示,并使用(B)z表示B平移z后得到的结果,若平移后的结果包含于A,则我们记录下z点,所有满足上述条件的z点组成的集合就是A被B腐蚀后的结果[8]。表示为:
AΘB={|z|(B)z⊆A}.
在实际应用中,按照如下的步骤,对二值化后的图像数据进行腐蚀操作,并找到有效区域。
步骤1:将图像以13×13像素为单位进行划分,对每个13×13像素进行腐蚀操作,以找到腐蚀中心。
步骤2:以腐蚀中心为起点,向左向右,向上向下寻找像素点,从而找出有效区域的图像块大小。
如图4所示,为步骤1的腐蚀算子,对每个13×13的图像块数据中的第7行与第7列的数据进行读取,若读取回的数据为0的次数超过了6次,则认为此13×13的图像块数据没有腐蚀中心;若读回的数据为0的次数不超过6次,则说明此13×13图像块数据有腐蚀中心,第7行第7列对应的像素即为腐蚀中心。
图4 步骤1的腐蚀算子
在步骤2中,以腐蚀中心的坐标为起点,先进行粗搜,即分别向左与向右读取像素数值,当读取的数值为0的次数超过了10次,则认为找到水平方向的粗搜索的边界。接着进行精搜,以粗搜索找到的水平方向的线段为起点分别向上与向下读取像素值,当读取的数值为0的次数超过了2次,则认为精搜索的垂直方向的区域确定了。基于精搜索确定的垂直方向的线段,分别向左向右进行精搜,就可以确定区域的水平方向的范围了。
2.4 形状识别
本系统研究的是物体在静止情况下,按照特定方向摆放,识别其为正方形、圆形或是三角形,采用的是边长特征的识别方法。通过图3系统软件总体设计流程图的腐蚀操作后,可以得到有效区域的起始点及区域的长与宽。如图5所示,W为有效区域的宽,H为有效区域的高。A为有效区域顶端像素中被置1的长度;B为有效区域中间像素中被置1的长度;C为有效区域底端像素被置1的长度。采用如下的方法进行识别:
图5 形状识别示意图
if((A<0.5W) &&(B>0.5W) &&(C<0.5W))
此形状为圆形
else if (A>0.5W) &&(B>0.5W) &&(C>0.5W))
此形状为正方形
else
此形状为三角形
2.5 系统测试
如图6所示,为测试结果图,对于图6(a)红色球的原始图像,通过HSV颜色识别红色并进行二值化操作及腐蚀操作,能得到有效的区域,并且识别出圆形;对于图6(b)黄色正方体的原始图像,能得到有效的区域,并识别出正方形。
图6 测试结果
3 结论
本文提出了一种基于STM32的颜色及形状识别的系统设计,能较好地识别红、黄和绿等不同颜色的物体,并对特定形状如圆形、正方形、三角形进行形状识别。该系统设计可将识别结果通过串口发送出来,易于集成与移植,具有一定的实践意义。当然该系统设计还有待进一步改善,如目前的设计只适用于识别一个有效物体的情况,如若要实现多个有效物体的识别,则需对系统软件设计进行升级;如若碰到对系统性能要求较高的应用场景,可较为快速地将软件移植到高端的CPU上。