本发明属于缺陷检测领域,具体涉及一种水表表芯中玛瑙装配的在线检测方法。
背景技术:
水表表芯中玛瑙装配的好坏影响整个水表的质量,传统的人工检测存在许多弊端,比如,检测的精度和工艺性比较差,影响水表的质量;水表的检测需要有丰富经验的老员工进行,消耗大量的人力资源;人工检测的效率比较低,不能满足需求。近年来,机器视觉技术迅速发展,越来越广泛地用于产品缺陷检测,不仅节省了大量的劳动力,而且提高了检测的速度和精度。然而,机器视觉技术在图像采集和处理过程中通常存在:图像质量不稳定、图像数据量较多、部分类型的缺陷与背景的对比度较低等问题。
技术实现要素:
本发明的目的在于提供一种水表表芯中玛瑙装配的在线检测方法,该方法可以采集水表表芯的实时图像,并对图像进行处理、分析,从而获得玛瑙的装配情况,设计的gui界面上显示检测结果,并对玛瑙装配是否合格进行判断,对不合格的产品发出警报。
为实现上述目的,本发明的技术方案是:一种水表表芯中玛瑙装配的在线检测方法,提供一水表表芯中玛瑙装配的在线检测装置,该装置包括ccd相机、led光源、远心镜头、安装有检测算法的计算机;所述方法具体实现如下,
s1、采用前向光照法,将水表表芯置于led光源照射下,并使得待测水表表芯光照均匀;
s2、在ccd相机上安装远心镜头,并使得远心镜头与待测水表表芯所在平面平行;
s3、ccd相机采集待测水表表芯的图像,并将采集图像存储在计算机中;
s4、采用检测算法对采集图像进行图像处理,得到待测目标区域;
s5、将目标区域的特征值与正常特征值取值进行比较,进而判断玛瑙的装配是否合格,而后保存结果并进行编号,该编号与各待测水表表芯相对应。
在本发明一实施例中,所述步骤s3之前,还需检测ccd相机是否正常连接。
在本发明一实施例中,所述步骤s4的具体实现过程如下,
s41、将待测水表表芯的图像转换为灰度图;
s42、将灰度图进行二值化;
s43、按照预定的颜色范围来选择感兴趣的区域;
s44、对所有的白色区域进行标记,移除二值图中的小目标;
s45、对待测水表表芯的图像进行腐蚀操作,去除二值图中的白色外圈;
s46、先连接两个离得比较近的物体并填充小的空隙,再填充待测水表表芯的图像中所有封闭的空洞,对图像中的小目标再进行一次移除,只保留待检测的目标区域;
s47、检测出目标区域的面积、周长、质心的数值。
在本发明一实施例中,所述步骤s5中,目标区域的特征值包括目标区域的面积、周长、质心三个特征值。
在本发明一实施例中,所述步骤s5中,正常特征值取值包括:目标区域的面积取值在s1和s2之间,目标区域的周长在c1和c2之间,目标区域的质心横坐标在x1和x2之间,质心纵坐标在y1和y2之间。
在本发明一实施例中,所述步骤s5中,判断玛瑙的装配是否合格,需同时满足目标区域的三个特征值均在正常特征值取值范围内。
在本发明一实施例中,所述计算机上还设计有gui界面,该gui界面上显示待检测水表表芯的图像、处理后的图像以及三个特征值的检测结果;且若玛瑙装配没有缺陷,则gui界面则显示合格,若玛瑙装配有缺陷,gui界面则显示不合格,并发出警报,所有的检测结果均存储在计算机中。
在本发明一实施例中,所述gui界面上还设置拍照、读图、选图、下一张图片、判断是否合格这五个按钮,只要单击任意一个按钮,系统便会执行对应的程序,完成相应的任务。
在本发明一实施例中,在gui界面上,点击拍照按钮,系统开启ccd相机,自动采集水表表芯的图像,保存成bmp格式并储存在计算机中;点击读图按钮,软件对图片进行处理,处理结果显示在右图中;点击选图按钮,检测算法选择待处理和检测的图片;点击下一张图片按钮,软件进行下一张图片的检测,检测的顺序为相机采集的图片顺序;点击周长、面积、质心按钮,界面上则分别显示对应的特征值;点击判断是否合格按钮,系统会给出判断结果,分为合格和不合格两种情况,若玛瑙装配合格,则显示绿色的字体合格,若不合格,则显示红色的字体不合格,并发出蜂鸣声,蜂鸣声间隔五秒,共五次。
相较于现有技术,本发明具有以下有益效果:
本发明可以对实时采集到的玛瑙图像进行处理、分析、判断,对玛瑙装配不合格的水表表芯发出警报,这样可以容易地分辨出合格品与不合格品,不仅节省了大量的人力资源,还提高了工作效率;
本发明设计的算法还适用于其它产品,比如检测小型零件的装配情况,只需要更改算法中相应的数值就能实现正确、高效的检测;
本发明还设计了简单易操作的gui界面,用户可以根据每个产品的特点,更换检测的特征,调整按钮的分布,设计便于自己操作的界面,实现友好的人机交互。
附图说明
本发明图1水表表芯中玛瑙装配检测系统总体结构图。
图2水表表芯中玛瑙装配检测系统框图。
图3玛瑙装配检测总流程图。
图4玛瑙装配检测图像处理流程图。
图5玛瑙灰度图(合格品)。
图6玛瑙二值图(合格品)。
图7移除小目标后的玛瑙图(合格品)。
图8填充空洞后的玛瑙图(合格品)。
图9玛瑙二值图(不合格品)。
图10填充空洞后的玛瑙图(不合格品)。
图11判断玛瑙装配缺陷流程图。
图12设计的gui界面。
图13gui界面(玛瑙装配合格)。
图14gui界面(玛瑙装配不合格情况一)。
图15gui界面(玛瑙装配不合格情况二)。
具体实施方式
下面结合附图,对本发明的技术方案进行具体说明。
本发明的一种水表表芯中玛瑙装配的在线检测方法,提供一水表表芯中玛瑙装配的在线检测装置,该装置包括ccd相机、led光源、远心镜头、安装有检测算法的计算机;所述方法具体实现如下,
s1、采用前向光照法,将水表表芯置于led光源照射下,并使得待测水表表芯光照均匀;
s2、在ccd相机上安装远心镜头,并使得远心镜头与待测水表表芯所在平面平行;
s3、ccd相机采集待测水表表芯的图像,并将采集图像存储在计算机中;
s4、采用检测算法对采集图像进行图像处理,得到待测目标区域;
s5、将目标区域的特征值与正常特征值取值进行比较,进而判断玛瑙的装配是否合格,而后保存结果并进行编号,该编号与各待测水表表芯相对应。
所述步骤s3之前,还需检测ccd相机是否正常连接。
所述步骤s4的具体实现过程如下,
s41、将待测水表表芯的图像转换为灰度图;
s42、将灰度图进行二值化;
s43、按照预定的颜色范围来选择感兴趣的区域;
s44、对所有的白色区域进行标记,移除二值图中的小目标;
s45、对待测水表表芯的图像进行腐蚀操作,去除二值图中的白色外圈;
s46、先连接两个离得比较近的物体并填充小的空隙,再填充待测水表表芯的图像中所有封闭的空洞,对图像中的小目标再进行一次移除,只保留待检测的目标区域;
s47、检测出目标区域的面积、周长、质心的数值。
所述步骤s5中,目标区域的特征值包括目标区域的面积、周长、质心三个特征值。
所述步骤s5中,正常特征值取值包括:目标区域的面积取值在s1和s2之间,目标区域的周长在c1和c2之间,目标区域的质心横坐标在x1和x2之间,质心纵坐标在y1和y2之间。
其中,s1=23000;s2=24300;c1=700;c2=750;x1=580;x2=600;y1=430;y2=450。
所述步骤s5中,判断玛瑙的装配是否合格,需同时满足目标区域的三个特征值均在正常特征值取值范围内。
所述计算机上还设计有gui界面,该gui界面上显示待检测水表表芯的图像、处理后的图像以及三个特征值的检测结果;且若玛瑙装配没有缺陷,则gui界面则显示合格,若玛瑙装配有缺陷,gui界面则显示不合格,并发出警报,所有的检测结果均存储在计算机中。
所述gui界面上还设置拍照、读图、选图、下一张图片、判断是否合格这五个按钮,只要单击任意一个按钮,系统便会执行对应的程序,完成相应的任务。
在gui界面上,点击拍照按钮,系统开启ccd相机,自动采集水表表芯的图像,保存成bmp格式并储存在计算机中;点击读图按钮,软件对图片进行处理,处理结果显示在右图中;点击选图按钮,检测算法选择待处理和检测的图片;点击下一张图片按钮,软件进行下一张图片的检测,检测的顺序为相机采集的图片顺序;点击周长、面积、质心按钮,界面上则分别显示对应的特征值;点击判断是否合格按钮,系统会给出判断结果,分为合格和不合格两种情况,若玛瑙装配合格,则显示绿色的字体合格,若不合格,则显示红色的字体不合格,并发出蜂鸣声,蜂鸣声间隔五秒,共五次。
以下为本发明的具体实现过程。
参照图1和图2,本发明设计了一套水表表芯中玛瑙装配的检测系统,该系统的硬件包括ccd摄像机、led光源、远心镜头和计算机,软件包括检测算法和gui界面。采用前向光照法,将水表表芯放置在均匀的led光照下,远心镜头安装于ccd相机,相机的镜头与水表表芯所在的平面平行,以保证采集到清晰的图像,将图像信息传送至计算机,为接下来的图像处理做准备。
参照图3,在水表表芯、光源和安装远心镜头的相机按图1调整好位置的情况下,检测系统的主要工作流程:1)、是否打开相机,检测相机的连接是否正常;2)、图像采集,在相机正常连接的情况下,采集水表表芯的图像并将所有采集到的图像存储在计算机中;3)、是否按顺序读图,可以按采集的顺序读图,也可以选择读取任意图像;4)、图像处理,对采集到的玛瑙原图进行图像处理,处理后的图片中只保留一个目标区域;5)、判断玛瑙的装配是否有缺陷,以目标区域的三个特征作为判断依据,gui界面上显示装配是否合格,对于装配不合格的玛瑙发出警报;6)、保存结果,对每个检测结果进行编号,编号均与各自检测的水表表芯对应,所有检测结果储存在计算机中,便于随时查找。
参照图4,图像处理的步骤如下:1)、先将采集到的玛瑙原图转换为灰度图,处理后得到的玛瑙灰度图如图5所示;2)、将灰度图进行二值化,处理后得到的玛瑙二值图如图6所示;3)、按照指定的颜色范围如[59,255]来选择感兴趣的区域;4)、对所有的白色区域进行标记,移除二值图中的小目标;5)、对玛瑙图像进行腐蚀操作,二值图中的白色外圈被去除。移除小目标和白色外圈后的玛瑙图像如图7所示;6)、先连接两个离得比较近的物体并填充小的空隙,接着填充玛瑙图像中所有封闭的空洞,再对图像中的小目标进行一次移除,最后图像中只保留待检测的目标区域,如图8所示。对于装配过程中压碎的玛瑙,填充前如图9所示,填充后如图10所示。在玛瑙装配检测中,检测的重要区域为玛瑙图像的中心位置,因此可以对二值图中没有检测特征的细小白色区域进行移除,将图像主要特征部位进行填充,使得玛瑙图像特征更为突出,增加检测的正确率。
玛瑙装配后主要出现无压入,压碎、压入尺寸不足等缺陷,将目标区域的特征值与正常取值范围进行比较,以目标区域的面积、周长、质心来判断玛瑙装配是否合格。玛瑙装配合格时,目标区域的面积在s1和s2之间,周长在c1和c2之间,同时质心横坐标在x1和x2之间,质心纵坐标在y1和y2之间。
参照图11,缺陷判断流程图步骤如下:1)、判断目标区域的面积,面积为0时,周长也为0,则玛瑙装配有缺陷;2)、目标区域的面积大于0,但不在[s1,s2]内,则玛瑙装配有缺陷;3)、目标区域的面积在[s1,s2]内,但周长不在[c1,c2]内,则玛瑙装配有缺陷;4)、目标区域的面积和周长分别在[s1,s2]和[c1,c2]内,同时,目标区域的质心横、纵坐标分别在[x1,x2]、[y1,y2]内,则玛瑙装配没有缺陷,否则,玛瑙装配有缺陷。
其中,s1=23000;s2=24300;c1=700;c2=750;x1=580;x2=600;y1=430;y2=450。
参照图12,开发gui界面,该界面上显示待检测的原图、处理后的图像以及三个特征值的检测结果。若玛瑙装配没有缺陷,gui界面则显示“合格”,若玛瑙装配有缺陷,gui界面则显示“不合格”,并发出警报,所有的检测结果均存储在计算机中。gui界面上设置“拍照”、“读图”、“选图”、“下一张图片”、“判断是否合格”这五个按钮,只要单击任意一个按钮,系统便会执行对应的程序,完成相应的任务。点击“拍照”按钮,系统开启相机,自动采集水表表芯的图像,图像显示在axes1中,保存成“bmp”格式储存在计算机中;点击“读图”按钮,软件对图片进行处理,图像处理后的结果显示在axes2中;点击“选图”按钮,算法从文件夹中选择待处理图片;点击“下一张图片”按钮,软件即进行下一张图片的检测,检测的顺序为相机采集的图片顺序。
参照图13-15,水表表芯中的玛瑙装配可能出现下列的情况,经过图像处理后得到的目标区域如gui界面上右侧图所示,分别点击“周长”、“面积”、“质心”按钮,界面上则分别显示对应的特征值,点击“判断是否合格”按钮,系统会给出判断结果,分为合格和不合格两种情况,若玛瑙装配合格,则显示绿色的字体“合格”,若不合格,则显示红色的字体“不合格”,并发出蜂鸣声,蜂鸣声间隔五秒,共五次。
上述gui界面的一种具体实现程序实例如下:
functionvarargout=gui(varargin)
gui_singleton=1;
gui_state=struct('gui_name',mfilename,...
'gui_singleton',gui_singleton,...
'gui_openingfcn',@gui_openingfcn,...
'gui_outputfcn',@gui_outputfcn,...
'gui_layoutfcn',[],...
'gui_callback',[]);
ifnargin&&ischar(varargin{1})
gui_state.gui_callback=str2func(varargin{1});
end
ifnargout
[varargout{1:nargout}]=gui_mainfcn(gui_state,varargin{:});
else
gui_mainfcn(gui_state,varargin{:});
end
functiongui_openingfcn(hobject,eventdata,handles,varargin)
handles.output=hobject;
guidata(hobject,handles);
set(handles.hege,'visible','off');
set(handles.buhege,'visible','off');
functionvarargout=gui_outputfcn(hobject,eventdata,handles)
varargout{1}=handles.output;
functionarea_callback(hobject,eventdata,handles)
globalbw;
globalareas;
areas=bwarea(bw);
set(handles.text3,'string',num2str(areas));
functionperimeter_callback(hobject,eventdata,handles)
globalbw;
ifbwarea(bw)==0
set(handles.text2,'string',num2str(0));
else
[l,num]=bwlabel(bw);
s=regionprops(l,'perimeter');
perimeters=cat(1,s.perimeter);
set(handles.text2,'string',num2str(perimeters(1)));
end
functioncentroids_callback(hobject,eventdata,handles)
globalbw;
globalzhixin;
ifbwarea(bw)==0
set(handles.text4,'string',num2str(0));
set(handles.text6,'string',num2str(0));
zhixin=0;
else
[l,num]=bwlabel(bw);
s=regionprops(l,'centroid');
centroids=cat(1,s.centroid);
zhixin=centroids(2);
set(handles.text4,'string',num2str(centroids(1)));
set(handles.text6,'string',num2str(centroids(2)));
end
functionedit1_callback(hobject,eventdata,handles)
functionedit1_createfcn(hobject,eventdata,handles)
ifispc&&isequal(get(hobject,'backgroundcolor'),get(0,'defaultuicontrolbackgroundcolor'))
set(hobject,'backgroundcolor','white');
end
functionnext_picture_callback(hobject,eventdata,handles)
globalk;
globalbw;
picname=sprintf('%d.bmp',k);
a=imread(picname);
bw=roicolor(a,59,255);
bw=bwareaopen(bw,800);
se2=strel('disk',2);
bw=imerode(bw,se2);
ifbwarea(bw)==0
axes(handles.axes1);
imshow(a);
axes(handles.axes2);
imshow(bw);
else
[l,n]=bwlabel(bw);
areas=regionprops(l,'area');
forn=1:n
ifn==1
max1=areas(n).area;
elseifareas(n).area>=max1
max1=areas(n).area;
end
end
max1=max1-1;
bw=bwareaopen(bw,max1);
se=strel('disk',125);
bw0=imclose(bw,se);
bw=imfill(bw0,'holes');
bw=bwareaopen(bw,3000);
axes(handles.axes1);
imshow(a);
axes(handles.axes2);
imshow(bw);
end
ifk==58
k=1;
else
k=k+1;
end
functiontake_picture_callback(hobject,eventdata,handles)
globalobj;
obj=videoinput('winvideo',2,'y800_640x480');
set(obj,'triggerrepeat',inf);
set(obj,'framespertrigger',1);
%建立界面
hf=figure('units','normalized','menubar','none','numbertitle','off','name','演示拍照系统');
ha=axes('parent',hf,'units','normalized','position',[.05.2.85.7]);
axisoff
hb1=uicontrol('parent',hf,'units','normalized',...
'position',[.25.05.2.1],'string','预览',...
'callback',...
['globalobj;objres=get(obj,''videoresolution'');'...'nbands=get(obj,''numberofbands'');'...
'himage=image(zeros(objres(2),objres(1),nbands));'...
'preview(obj,himage);']);
hb2=uicontrol('parent',hf,'units','normalized',...
'position',[.55.05.2.1],'string','拍照',...
'callback','imwrite(getsnapshot(obj),''in.jpg'')');
functionjudgement_callback(hobject,eventdata,handles)
globalzhixin;
globalareas;
if(areas>24300)||(areas==0)
set(handles.buhege,'visible','on');
forn=1:5
pause(0.5);
beep;
end
elseif(areas<24300)&&(zhixin<=400)
set(handles.buhege,'visible','on');
forn=1:5
pause(0.5);
beep;
end
else
set(handles.hege,'visible','on');
end
functiondutu_callback(hobject,eventdata,handles)
globalbw;
globalk;
k=1;
picname=sprintf('%d.bmp',k);
a=imread(picname);
k=k+1;
bw=im2bw(a,0.23);
[l,n]=bwlabel(bw);
areas=regionprops(l,'area');
forn=1:n
ifn==1
max1=areas(n).area;
elseifareas(n).area>=max1
max1=areas(n).area;
end
end
max1=max1-1;
bw=bwareaopen(bw,max1);
bw=imfill(bw,'holes');
axes(handles.axes1);
imshow(a);
axes(handles.axes2);
imshow(bw);
functionxuantu_callback(hobject,eventdata,handles)
globalbw;
axes(handles.axes1);
a=imread(uigetfile('*bmp','选图'));
bw=roicolor(a,59,255);
bw1=bwareaopen(bw,800);
se2=strel('disk',2);
bw=imerode(bw1,se2);
ifbwarea(bw)==0
axes(handles.axes1);
imshow(a);
axes(handles.axes2);
imshow(bw);
else
[l,n]=bwlabel(bw1);
areas=regionprops(l,'area');
forn=1:n
ifn==1
max1=areas(n).area;
elseifareas(n).area>=max1
max1=areas(n).area;
end
end
max1=max1-1;
bw=bwareaopen(bw1,max1);
se=strel('disk',125);
bw0=imclose(bw,se);
bw=imfill(bw0,'holes');
bw=bwareaopen(bw,2500);
axes(handles.axes1);
imshow(a);
axes(handles.axes2);
imshow(bw);
end。
以上是本发明的较佳实施例,凡依本发明技术方案所作的改变,所产生的功能作用未超出本发明技术方案的范围时,均属于本发明的保护范围。