system: [SYSTEM]

user: 4. 基于App Designer的电容漏插检测系统 本系统关键在于MATLAB视觉检测算法的实现，整个系统设计包括三个模块，分别为视频采集模块、模板制作模块和在线漏插检测模块，各个模块包含的内容如图3所示。第一部分视频采集系统模块主要为模板制作做准备，采集电解电容顶部的图像，并选取最清晰的图像进行保存；第二部分“模板制作”主要为框选ROI (Region of interest)、检测ROI内电容的灰度均值和标准差大小，并将相关信息保存到一个xls文件中；第三部分为在线漏插检测模块，主要包括读取xls文件、视频采集、比对模板并显示电解电容是否漏插，若实时检测的ROI区域的均值和方差在模板信息阈值范围内的通过，反之则不通过。 图3. MATLAB电容漏插检测结构框架 4.1. 视觉采集模块 视频采集模块的主要功能为预览摄像头，选取最清晰的一帧进行拍摄 [ 8 ]，为模板制作模块提供标准图片，主界面如图4所示。该模块采用的面板上共设置4个按钮，“预览”按钮功能为打开摄像头，该功能的实现共依赖imaqhwininfo (‘winvideo’)和videoinput (‘winvideo’， ID)函数，前者用来获取设备ID信息，后者用来进行视频捕获；“拍照”按钮实现图片的采集，该功能实现依靠frame = getsnapshot()实现，其中frame就是拍摄的图片；“关闭摄像头”按钮依赖closepreview()函数实现。最终依赖imshow()函数，将视频流和图片文件放到坐标系中，一定注意在此函数中将坐标系相应的句柄写入，如下面示例所示，frame为拍摄保存的图片，‘parent’为“坐标轴的句柄”属性，“app.UIAxes2_2_option3”为坐标系句柄数。 imshow(frame，'parent'，app.UIAxes2_2_option3); axis(app.UIAxes2_2_option3，'on'); 4.2. 模板制作模块 因模板制作是后续电容漏插的检测标准，故此模块的处理尤为重要。本模块的制作可分为绘制ROI框选、图像灰度化处理、保存模板信息三部分。 图4. 视频采集模块面板 4.2.1. ROI的框选 在MATLAB软件上进行ROI框选可使用imrect()函数和imcrop()函数配合实现截图功能，getPosition()函数可用来获取图像上特定区域的坐标。当把图片导入坐标系中后，鼠标会变成“+”，此时即可进行拖拽实现位置的框选，同时getPosition()函数可以返回ROI区域的[start_x， start_y， width， height]，即ROI起始(x，y)坐标以及框的宽度和高度。主要实现程序如下所示： h=imrect(app.original_option2，[50，50，30，30]); pause(15); pos=getPosition(h); img_ROI = imcrop(img， pos); imrect()下的“app.original_option2”为“原图像”的句柄，初始化绘制一个[50，50，30，30]的矩形框如图5所示，当用户框选移动完成之后利用getPositon()读取ROI位置信息，之后将采集后的图像利用imcrop()函数，保存为img_ROI，并将提取的推向绘制在“ROI图像”的坐标系中。而imcrop()函数的用法为X2 = imcrop (X， map)，其中X表示为需要裁剪的图片，map为截取的区域即getPosition()函数返回的向量。 4.2.2. 图像灰度化处理 对图像进行灰度化处理的方法有很多，本App运用了最大值法、平均值法和加权平均法 [ 9 ]。因要计算图片的灰度均值和标准差，这些都是统计量，因此将uit8类型彩色图片转化为double类型数据。当采用最大值法进行灰度化 [ 10 ] 时，即提取三通道每一个像素的亮度最大值，对于图5中的ROI裁剪图片进行处理的结果如图6(a)所示，可以计算灰度均值为178.5，标准差为47.87；当采用平均值法进行灰度化时，即提取三通道每一个像素亮度平均值，灰度处理结果如图6(b)所示，灰度均值为170.9，标准差为48.77；当采用加权平均法时，即按一定的权重提取每个通道的亮度值，注意RGB三通道的权重和为1，加权平均法处理结果如图6(c)所示，经计算灰度均值为172.3，标准差为48.84，主要功能实现代码如下所示： 图5. ROI框选 gray_img1(x，y) = max(img(x，y，1)，max(img(x，y，2)，img(x，y，3))); gray_img1(x，y) = (double(img(x，y，1))+double(img(x，y，2))+double(img(x，y，3)))/3; gray_img1(x，y) = R*img(x，y，1)+G*img(x，y，2)+B*img(x，y，3); app.mean1_option2.Value=mean2(i); app.bizozhun_option2.Value=sqrt(var(i(:))); 语句中变量gray_img1(x，y)指的是灰度化处理后的图像值，变量img(x，y)指的是带有RGB信息的图像值。其中第一条语句为最大值法处理的语句，分取出去img中每个通道的亮度值，同理第2、3语句分别为平均值处理和加权平均灰度化处理的语句。第4条语句中的mean()函数是用来求灰度均值的，i指的是灰度化后的图像，var()函数用来求解灰度值方差，开方后即为标准差。 图6. 最大值灰度化(a)、平均值灰度化(b)、加权平均灰度化(c) 4.2.3. 保存模板信息 在模板制作模块，需要将标准带有电解电容PCBA检测的信息保存起来，为后面的在线监测做准备。需要保存的模板信息为ROI内的图像灰度均值、图像灰度标准差、ROI位置信息(即横坐标起始点、纵坐标起始点、宽度和高度)、灰度化方法和R、G、B三通道权重共10个数值，利用Xlswrite()函数，第一个参数为保存的文件地址，第二个参数为保存的矩阵信息，本系统经过多次测试，以一次测试为例，其保存的数据如表1所示。 Table 1 Holds the template information value 变量名称 数值 图像灰度均值 137.7 图像灰度标准差 53.88 ROI起始横坐标值 14 ROI起始纵坐标值 75 ROI宽度 16 ROI高度 19 灰度化方法 加权平均法 R通道权重 0.2 G通道权重 0.3 B通道权重 0.5 表1. 保存模板信息值 4.3. 在线漏插检测 这部分所涉及的内容包括读取模板信息，检测PCBA中电解电容是否漏插。为了实现在线实时监测电容漏插情况，必须要添加视频采集程序，而检测方法与模板制作中检测方式相同，这部分不再进行赘述。我们通过程序可以实时捕获判读ROI处的灰度均值和标准差，通过与模板中的电容元件的信息作对比，可以在App Designer的在线检测面板显示出来电路板的电容是否漏插。整个软件的设计包括读取模板信息和在线监测两部分。对于此模块的程序主要分为两部分，整体设计流程图如图7所示。 图7. 在线检测程序流程图 4.3.1. 读取模板信息 对于读取信息处理主要采用xlsread()函数，该函数用法为xlsread (‘filename’， ‘range’)，“filename”指的是需要读取的文件路径，“range”指的是需要读取表格的位置，如“A1:A8”。之后将读取的值分别赋给相应的变量，在读取ROI的位置信息后，需要在摄像头实时检测的坐标系上，借助rectangle()函数具体用法如下所示： rectangle(app.UIAxes_2_option3，'position'，[x_start ， y_start ， width ， height ] ); 第一个参数为需要绘制的坐标系句柄，第二个参数为位置属性‘Position’，后面的是具体的位置信息。除此之外还需要设置检测的灰度检测阈值，本系统经过测试灰度化均值阈值范围为标准值加减15，灰度化标准值加减15。 4.3.2. 灰度处理计算 在摄像头抓拍图像之后，图像需要经过ROI裁剪并进行灰度化处理，为了确保能与模板中的图片比对，其中在在线监测部分的灰度化方式需要读取模板文件中的方法，同时灰度图片的均值和标准差也是直接与模板中的相同。 4.3.3. 在线检测 在这部分，将模板制作的过程全部集成在一个while中，可以实现ROI裁剪、灰度变换处理、电容漏插情况判断及显示是否正确，判断程序如下所示： up_mean=app.Upper_MeanEditField_option3.Value; lw_mean=app.Lower_MeanEditField_option3.Value; up_Deri=app.Upper_DeriationEditField_option3.Value; lw_Deri=app.Lower_DeriationEditField_option3.Value; zhenshi_mean=app.MeanEditField_option3.Value; zhenshi_Dire=app.DeriationEditField_option3.Value; Ifzhenshi_mean>=lw_mean&&zhenshi_mean<=up_mean&&zhenshi_Dire>=lw_Deri&& zhenshi_Dire<=up_Deri app.EditField_4.Value=pass app.Lamp_option3.Color='g'; else app.EditField_4.Value=no app.Lamp_option3.Color='r'; end 这段程序的上半部分为阈值设置，zhenshi_mean为实时检测的灰度均值，zhenshi_Dire为实时检测的灰度标准差，只有实时检测ROI内的灰度均值和灰度标准差都在阈值范围内，才会显示“PASS”同时测试灯为绿色，反之显示“No”，测试灯为红色。