小型饮料瓶盖颜色识别系统设计与实现
2022-05-01邓三星孙赛伟杨蒙蒙
邓三星 孙赛伟 杨蒙蒙,2 张 凯 李 帅
(1. 黄河交通学院,河南 焦作 454950;2. 河南省智能制造技术与装备工程技术研究中心,河南 焦作 454950)
目前,中国传统饮料瓶盖和瓶身的回收、分拣大多依靠人工完成,费时费力、劳动成本高、识别精度低。而塑料瓶体自动化分拣时又易受土壤、饮料残渣等残留物干扰,分拣准确率较低,尤其在弱光环境下[1-3]。
随着机器视觉和图像处理技术的发展,越来越多的学者投入到食品包装划痕检测、瓶身缺陷检测、瓶盖安装异常检测[4]等方面的研究。周晓等[3]采集了各种塑料瓶图像,利用具有残差连接的卷积神经网络,引入具有自归一化性质的SeLU激励函数进行训练,检测精度优于传统方法,但系统需配备工业相机,成本较高。张超等[8]采用基于像素点的饮料瓶瓶盖检测算法,判断瓶盖安装情况,该算法实用性强,但未涉及到瓶盖颜色识别问题。岳昊等[5]利用真空吸附技术,使用工业相机对附带油污、残次的医用瓶盖进行图像检测,准确率高,但系统组成复杂,体积较大。吴兰兰等[6]针对 PET饮料瓶在封盖过程中的缺陷问题,提出了一种基于机器视觉技术的检测算法,主要研究瓶盖安装是否到位,识别准确率高,但并未涉及瓶盖颜色识别问题。
目前基于机器视觉的颜色识别设备由核心板、外围输入输出设备、摄像头组成[7],需要高性能硬件作为支撑。最常见的X86架构硬件平台由于其硬件结构的固有特点导致整个平台所占体积较大,设备小型化已成为研究的重点方向[8]。因此提出一种基于ARM处理器的小型饮料瓶盖颜色识别系统设计方案,平台尺寸仅为75 mm×50 mm,通过单板硬件与实时操作系统实现阈值设置、目标轮廓检测、目标框出等功能,以期实现瓶盖的高精度分拣,提高不同颜色瓶盖的回收分拣效率。
1 小型饮料瓶盖颜色识别系统方案设计
该系统主要由处理器、存储器以及片外外围电路组成,通过单板硬件与实时操作系统实现机器视觉识别。系统所用摄像头可为24PIN排插式摄像头或USB直插式摄像头,方便更换与升级。处理器选用基于Cortex-A7[9]架构的Allwinner Quad-core H3芯片,该芯片集成了最新的SmartColor丽色显示引擎,支持LPDDR2/LPDDR3/DDR3/DDR3L的SDRAM,支持H.265/HEVC 4K@30fps视频硬解,为机器视觉系统提供强大的处理性能。随机存储器选用三星的K4B4G1646D-BCK0,该存储器内存颗粒速率达1 600 Mbps,工作电压为1.5 V,最大容量为4 Gb,封装为96FBGA。选用TF卡作为只读存储器,因为TF卡具有可更换的特性,方便设备维护与升级。片外外围电路可选范围较广,根据需求主要设计片外电路有HDMI视频输出接口电路、Type-C接口电路、网络传输接口电路、USB 2.0接口电路、24PIN摄像头接口电路。系统组成关系如图1所示。
图1 系统组成关系Figure 1 System composition
研究采用Linux作为实时操作系统,通过在操作系统上部署所需的应用程序来实现所需的功能,系统架构流程关系如图2所示。
图2 系统架构流程关系Figure 2 System architecture process relationship
2 硬件电路设计
Allwinner Quad-core H3芯片的引脚连接复杂,具体设计时使用接口中DRAM0系列引脚与DDR3内存颗粒连接;HDMI系列引脚用于与HDMI视频输出接口连接;USB0系列针脚与Type-C的OTG引脚相连,主要用于扩展相关USB接口;USB1与USB2系列引脚用于USB接口扩展;UART0系列引脚与CP2102芯片将Type-C输入转化为异步串行数据输入;SDC0系列引脚为ROM读写总线;OSC系列引脚接外部晶振;EPHY系列引脚为网口连接引脚,CSI0系列引脚为摄像头接入引脚。在各个外围电路设计中根据外围电路设计的负载不同设计不同的方案,小型饮料瓶盖颜色识别系统中的高速信号线需做好信号完整性分析以保证硬件能够正常运行。整体硬件设计结构关系图如图3所示。
图3 硬件结构关系Figure 3 Hardware structure relationship
2.1 供电电路设计
由于各个接口的负载类型不同,供电电压也不同,所需的电流也需满足设计要求。系统使用多个供电芯片,各个供电芯片均有不同的供电对象,满足了各部分接口的供电需求,如图4所示。其中3.3 V供电对象较多,有Camera以及WIFI,少部分为1.5 V供电,该电压供电采用双供电芯片RT9011,可以输出3.3 V与1.5 V电压。重要的DDR3内存芯片供电由1.5 V输出RT8059芯片支持,输出效率约95%。CPU供电由MP2143[10]系列芯片供电,供电电压为1.3 V。RJ45网络接口供电电路由SY8089A芯片提供2.5 V电压。MP2144芯片为I/O设备提供3.3 V电压,同时增加备用供电LP2992芯片以提高供电电流,满足多个接口设计需求。RT8059芯片为整个系统提供1.2 V时序电压。整个供电系统输出效率较高,需要5 V/2 A电源通过Type-C输入,USBHost与HDMI为默认的5 V供电,无需进行降压处理。
图4 供电关系分配Figure 4 Power supply relationship distribution
2.2 接口电路设计
接口电路设计中,USB接口以及HDMI接口支持热插拔,该类接口由于数据线直连CPU需要对CPU做出一定的静电保护,防止CPU被损坏,需在电路中设计其他非热插拔接口。两个普通USB口供电为5 V,电源脚与供电直连,而数据线与CPU直连。考虑到USB口的特殊性,需要对直连的数据线做一定的保护措施,防止静电击穿CPU。设计采用瞬态电压抑制器ESD9B5V,能够保护敏感电子元件免受静电放电(ESD)击穿,适用于移动电话、精密仪表、PAD、数码相机等电子设备[11]。ESD9B5V防静电能力符合IEC61000-4-2 ESD抗扰度4级测试,选用封装形式为FBC-02C。HDMI接口电路图如图5所示。
图5 HDMI接口电路Figure 5 HDMI interface circuit
2.3 PCB布局设计
设计采用DDR3内存,CPU与内存间传输速度非常快,属于高速电路,考虑到制作工艺以及成本,选择四层板方案。利用HyperLynx的LineSim工具对高速电路进行阻抗匹配仿真分析,用于布线前仿真,验证叠层结构以及布线的阻抗匹配。系统结构板厚1.6 mm,上层夹层PP板厚0.1 mm,介电常数为4.05;中层夹层PP板厚1.265 mm,介电常数为4.5;下层夹层PP板厚为0.1 mm,介电常数为4.05;顶层与底层走线层厚0.035 mm,中间电源层厚0.017 5 mm。将上述参数转化单位设置进传输线模型中,如图6所示。
图6 传输线参数设置Figure 6 Transmission line parameter settings
线宽参数设置为5 mil,以使线路阻抗与信号源内阻匹配。仿真时采用的激励源参数与上图设置相同。从图7 中判断眼图[12]左右抖动位置为一点,信号抖动小,上下超出眼图界限的波形少,噪声干扰小,在标准误差内传输线设置符合要求。
图7 阻抗匹配眼图Figure 7 Impedance matching eye diagram
基于仿真所得的线宽数据,四层板的信号走线层主要为上、下两层。为实现信号层走线合理布局,走线距离合适,线径参数设置不能过小,在DDR走线时使DDR尽量靠近CPU,参考平面完整,线与线之间等长、差分、等线宽。为有效抑制EMI,设计DQS与CK两类数据线[13],对内等长且误差小于10 mil;DQS0-7相对于DQS0等长,误差小于50 mil;DQS8-15相对于DQS1等长,误差小于50 mil;DQSx相对于CK等长误差为800 mil。等长线通常在PCB板上进行蛇形走线,而蛇形走线形成的LC电路具有一定的滤波作用。图8为上下布线层板层图,所选的主要元器件均为贴片式元器件,BGA焊盘覆盖绿油。
图8 PCB板层设计Figure 8 PCB layer design
3 系统程序设计
在整板完成后需对其进行系统固件烧录,将系统镜像写入启动储存设备中,使其正常运行。操作系统烧录方式:首先在系统官网上下载系统镜像,系统镜像格式一般为“.img”格式;将系统镜像下载到本地储存设备上,作烧录使用;准备一张高速TF卡,速度传输规范符合Class10(10 MB/s)规范,使用读卡器将TF卡插入电脑中,WIN系统下将TF卡磁盘扇区删除,然后通过Allwinner Quad-core H3芯片的专业烧录软件烧录系统,烧录完成后即可运行。
在系统基本搭建完毕后即可根据搭载的外围设备类型编写应用程序。在ARM平台上运行调试,选择Python编译环境,使用Jupyter Notebook编译软件,在终端下输入jupyter notebook即可进入Jupyter Notebook中[14]。程序采用基于HSV颜色空间的颜色识别算法,该算法相对于基于RGB颜色空间的算法程序具有识别概率高的优点[15]。
核心图像处理程序:
import enum
def bgr8_to_jpeg(value, quality=75):
return bytes(cv2.imencode('.jpg', value)[1])
def f(x):
return x
font = cv2.FONT_HERSHEY_SIMPLEX
lower_red = np.array([0, 43, 46]) #红色阈值下界
higher_red = np.array([10, 255, 255])#红色阈值上界
lower_green = np.array([36, 150, 59])#绿色阈值下界
higher_green = np.array([71, 255, 255])#绿色阈值上界
lower_blue = np.array([100, 43, 46])#蓝色阈值下界
higher_blue = np.array([124, 255, 255]) #蓝色阈值上界
def video_demo():
capture=cv.VideoCapture(0)
while(True):
ref,frame=capture.read()
img_hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
mask_red = cv2.inRange(img_hsv, lower_red, higher_red) #过滤出红色部分,获得红色的掩膜
mask_green = cv2.inRange(img_hsv, lower_green, higher_green) #获得绿色部分掩膜
mask_green = cv2.medianBlur(mask_green, 7) #中值滤波
mask_red = cv2.medianBlur(mask_red, 7) #中值滤波
mask_blue = cv2.inRange(img_hsv, lower_blue, higher_blue) #获得绿色部分掩膜
mask_blue = cv2.medianBlur(mask_blue, 7) #中值滤波
mask = cv2.bitwise_or(mask_green, mask_red) #三部分掩膜进行按位或运算
print(mask_red)
cnts1, hierarchy1 =cv2.findContours(mask_red, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
#轮廓检测红色
cnts2, hierarchy2 =cv2.findContours(mask_blue, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
#轮廓检测蓝色
cnts3, hierarchy3 =cv2.findContours(mask_green,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
#轮廓检测绿色
for cnt in cnts1:
(x, y, w, h) = cv2.boundingRect(cnt) #该函数返回矩阵4个点
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2) #将检测到的颜色框出
cv2.putText(frame, 'red', (x, y - 5), font, 0.7, (0, 0, 255), 2)
for cnt in cnts2:
(x, y, w, h) = cv2.boundingRect(cnt) #该函数返回矩阵4个点
cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2) #将检测到的颜色框出
cv2.putText(frame, 'blue', (x, y - 5), font, 0.7, (255, 0, 0), 2)
for cnt in cnts3:
(x, y, w, h) = cv2.boundingRect(cnt)#该函数返回矩阵4个点
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) #将检测到的颜色框出
cv2.putText(frame, 'green', (x, y - 5), font, 0.7, (0, 255, 0), 2)
cv2.imshow('frame', frame)
image_widget.value = bgr8_to_jpeg(frame)
c=cv.waitKey(30) & 0xff
if c==27:
capture.release()
break
video_demo()
cv.waitKey()
cv.destroyAllWindows()
4 系统硬件平台搭建与测试
系统采用海康威视DS-E11摄像头,像素为100万,焦距为3.6 mm。核心板插上用于机器视觉识别的摄像头,连接网络,运行应用程序,安装依赖的包文件。在终端中操作首先需要修改为中国的软件源,然后部署一些必备的软件包来安装依赖源。系统所需的主要库文件有OpenCV、Python3以及一系列图形与视频操作库。
针对系统颜色识别功能,分别选用常见的红、绿、蓝3种颜色饮料瓶盖进行测试。Jupyter Notebook检测对象为蓝色瓶盖与蓝色塑料条,从检测结果可以看出,系统可以将检测目标完整框出,显示图形范围,准确识别蓝色,显示为“blue”,见图9。
图9 颜色识别测试效果Figure 9 Color recognition test effect
为验证系统测试准确度,在强、弱光条件下对红、绿、蓝3种颜色进行识别测试。结果表明系统工作稳定,颜色识别效果好,具体测试数据见表1。
表1 强、弱光条件下颜色识别测试Table 1 Color recognition test under bright and low light conditions %
在强、弱光条件下,系统对3种颜色的识别率达到92.7%,弱光条件下的颜色识别率低于强光,其中绿色识别率较红、蓝颜色识别率低。试验方法(精度90.9%)比傅里叶描述子[16](52.2%)方法的检测精度更高。
系统采用OpenCV库,使用Haar Cascade进行人脸检测,其测试效果如图10所示。可以看出,系统能够对实时图像中人脸进行识别,用方框框出,并进行动态追踪。
图10 人脸识别测试效果Figure 10 Face recognition test effect
5 结论
基于ARM的小型饮料瓶盖颜色识别系统能够完成不同光线条件下的颜色识别,识别率达到92.7%,优于傅里叶描述子方法。后续可通过优化机器视觉算法并选用的高性能的CPU,使系统能够胜任复杂工业环境下物品分拣、食品检测等工作。