点胶质量检测
1. 项目背景
2. 具体需求
3. 代码案例
3.1 halcon代码
3.2 自定义函数
3.3 完整代码和图片下载

1.项目背景

UV点胶机点热熔胶工位,点胶之后还需要对胶水进行检测,这属于缺陷检测的范畴了。
下面这张图像是使用UV线光源从上面打光得到的图像效果,从图像中可以看到,热熔胶由于添加了荧光剂,被UV光源打亮,而电池的其他部分比较暗。
在这里插入图片描述下面这张图像是利用背光源从底下打光,而上面UV光源此时处于关闭状态。这和上一张图像是同一块电池,只不过使用的光源不同。这张图像可以帮助我们定位电池的位置,从而进行下一步的测量。


在这里插入图片描述

2. 具体需求

热熔胶检测需要测量的内容有:

  • 胶水的长度
  • 胶水的宽度
  • 胶水两端到电池上下边缘的距离
  • 胶水到电池左右边缘的距离

在这里插入图片描述

3. 代码案例

3.1 halcon代码

* 热熔胶检测需要输出的数据有:
* 1. 胶水的长度
* 2. 胶水的宽度
* 3. 胶水两端到电池上下边缘的距离
* 4. 胶水到电池左右边缘的距离
* 5. 胶水是否断开

GlueLength1:=0
GlueLength2:=0
GlueWidth1:=[]
GlueWidth2:=[]
GlueTopDist1:=0
GlueTopDist2:=0
GlueBottomDist1:=0
GlueBottomDist2:=0

WidthNum:=100
WidthThreshold:=100
SideDistThreshold:=30

* 读图
read_image (Image, 'P1.bmp')

* ROI
gen_rectangle1 (ROI_0, 69.6538, 1450.03, 3256.64, 4251.05)

GetGlueRegion (Image, ROI_0, SortedRegions)

* 1.计算胶水长度
CalGlueLength (SortedRegions, GlueLength1, GlueLength2)

* 2.计算胶水宽度
CalGlueWidth (SortedRegions, Image, Cross1, Cross2, Cross3, Cross4, SmoothedContours1, SmoothedContours2, SmoothedContours3, SmoothedContours4, WidthThreshold, GlueWidth1, GlueWidth2, ResultRows1, ResultColumns1, ResultRows2, ResultColumns2)



* 3. 胶水两端到电池上下边缘的距离
* 读图
read_image (Image, 'P2.bmp')

CalOffset (Image, SortedRegions, cross1, cross3, cross2, cross4, cross1_1, cross3_1, cross2_1, cross4_1, GlueTopDist1, GlueTopDist2, GlueBottomDist1, GlueBottomDist2)


* 4. 计算胶水到电池左右边缘的距离
CalDistance (SortedRegions, Image, Line1, Line2, ResultRows1, ResultColumns1, ResultRows2, ResultColumns2, Dist1, Dist2)


dev_display (Image)
dev_set_color ('green')
dev_display (SmoothedContours1)
dev_display (SmoothedContours2)
dev_display (SmoothedContours3)
dev_display (SmoothedContours4)
dev_set_color ('red')
dev_display (cross1)
dev_display (cross2)
dev_display (cross3)
dev_display (cross4)
dev_set_color ('blue')
dev_display (cross1_1)
dev_display (cross2_1)
dev_display (cross3_1)
dev_display (cross4_1)

dev_display (Line1)
dev_display (Line2)

3.2 自定义函数

  • GetGlueRegion
reduce_domain (Image, ROI_0, ImageReduced)
* blob分析,分割胶水
threshold (ImageReduced, Regions, 250, 255)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, ['area','height'], 'and', [9571.06,1014.72], [50000,5000])
sort_region (SelectedRegions, SortedRegions, 'character', 'true', 'row')
return ()
  • CalGlueLength
* 1.计算胶水长度
select_obj (SortedRegions, ObjectSelected, 1)
smallest_rectangle2 (ObjectSelected, Row, Column, Phi, Length1, Length2)
GlueLength1:=Length1*2

select_obj (SortedRegions, ObjectSelected, 2)
smallest_rectangle2 (ObjectSelected, Row, Column, Phi, Length1, Length2)
GlueLength2:=Length1*2
return ()
  • CalGlueWidth
select_obj (SortedRegions, ObjectSelected, 1)
smallest_rectangle2 (ObjectSelected, Row, Column, Phi, Length1, Length2)

Line1Row1:=Row-Length1
Line1Col1:=Column
Line1Row2:=Row+Length1
Line1Col2:=Column

dev_display (Image)

GetUVWidth (Image, Cross1, Cross2, SmoothedContours1, SmoothedContours2, Line1Row1, Line1Col1, Line1Row2, Line1Col2, 1000, 250, 5, WidthThreshold, 5, 'Left', IsFind1, IsFind2, GlueWidth1, ResultRows1, ResultColumns1)


select_obj (SortedRegions, ObjectSelected, 2)
smallest_rectangle2 (ObjectSelected, Row, Column, Phi, Length1, Length2)

Line2Row1:=Row-Length1
Line2Col1:=Column
Line2Row2:=Row+Length1
Line2Col2:=Column

GetUVWidth (Image, Cross3, Cross4, SmoothedContours3, SmoothedContours4, Line2Row1, Line2Col1, Line2Row2, Line2Col2, 1000, 250, 5, WidthThreshold, 5, 'Right', IsFind1, IsFind2, GlueWidth2, ResultRows2, ResultColumns2)
return ()
  • CalOffset
* ROI
gen_rectangle1 (ROI_1, 163.938, 1414.17, 3196.91, 2205.04)
gen_rectangle1 (ROI_2, 124.651, 3437.85, 3039.76, 4189.94)

reduce_domain (Image, ROI_1, ImageReduced1)
reduce_domain (Image, ROI_2, ImageReduced2)

threshold (ImageReduced1, Regions1, 0, 88)
threshold (ImageReduced2, Regions2, 0, 88)

smallest_rectangle1 (Regions1, Row1, Column1, Row2, Column2)
SideLT_R:=Row1
SideLT_C:=(Column1+Column2)/2
SideLB_R:=Row2
SideLB_C:=(Column1+Column2)/2
gen_cross_contour_xld (cross1, SideLT_R, SideLT_C, 36, 0) //左上边缘
gen_cross_contour_xld (cross3, SideLB_R, SideLB_C, 36, 0) //左下边缘

smallest_rectangle1 (Regions2, Row1, Column1, Row2, Column2)
SideRT_R:=Row1
SideRT_C:=(Column1+Column2)/2
SideRB_R:=Row2
SideRB_C:=(Column1+Column2)/2
gen_cross_contour_xld (cross2, SideRT_R, SideRT_C, 36, 0) //右上边缘
gen_cross_contour_xld (cross4, SideRB_R, SideRB_C, 36, 0) //右下边缘

select_obj (SortedRegions, ObjectSelected, 1)
get_region_points (ObjectSelected, Rows, Columns)
GlueLT_R:=Rows[0]
GlueLT_C:=Columns[0]
GlueLB_R:=Rows[|Rows|-1]
GlueLB_C:=Columns[|Rows|-1]
gen_cross_contour_xld (cross1_1, GlueLT_R, GlueLT_C, 36, 0) //左上胶水
gen_cross_contour_xld (cross3_1, GlueLB_R, GlueLB_C, 36, 0) //左下胶水

select_obj (SortedRegions, ObjectSelected, 2)
get_region_points (ObjectSelected, Rows, Columns)
GlueRT_R:=Rows[0]
GlueRT_C:=Columns[0]
GlueRB_R:=Rows[|Rows|-1]
GlueRB_C:=Columns[|Rows|-1]
gen_cross_contour_xld (cross2_1, GlueRT_R, GlueRT_C, 36, 0) //右上胶水
gen_cross_contour_xld (cross4_1, GlueRB_R, GlueRB_C, 36, 0) //右下胶水

GlueTopDist1:=GlueLT_R-SideLT_R
if (GlueTopDist1<0)
    GlueTopDist1:=0
endif

GlueTopDist2:=GlueRT_R-SideRT_R
if (GlueTopDist2<0)
    GlueTopDist2:=0
endif

GlueBottomDist1:=SideLB_R-GlueLB_R
if (GlueBottomDist1<0)
    GlueBottomDist1:=0
endif

GlueBottomDist2:=SideRB_R-GlueRB_R
if (GlueBottomDist2<0)
    GlueBottomDist2:=0
endif
return ()
  • CalDistance
Sigma:=3
Threshold:=30
Transition:='all'
Select:='all'
ActiveNum:=5

select_obj (SortedRegions, ObjectSelected, 1)
smallest_rectangle2 (ObjectSelected, Row, Column, Phi, Length1, Length2)

Line1Row1:=Row-Length1
Line1Col1:=Column
Line1Row2:=Row+Length1
Line1Col2:=Column

rake_COPY_1 (Image, Regions, 100, 100, 5, Sigma, Threshold, Transition, Select, Line1Row1, Line1Col1, Line1Row2, Line1Col2, ResultRow, ResultColumn)
pts_to_best_line (Line1, ResultRow, ResultColumn, ActiveNum, Row1, Column1, Row2, Column2)
distance_pl (ResultRows1, ResultColumns1, Row1, Column1, Row2, Column2, Dist1)

select_obj (SortedRegions, ObjectSelected, 2)
smallest_rectangle2 (ObjectSelected, Row, Column, Phi, Length1, Length2)

Line2Row1:=Row-Length1
Line2Col1:=Column
Line2Row2:=Row+Length1
Line2Col2:=Column

rake_COPY_1 (Image, Regions, 100, 100, 5, Sigma, Threshold, Transition, Select, Line2Row1, Line2Col1, Line2Row2, Line2Col2, ResultRow, ResultColumn)
pts_to_best_line (Line2, ResultRow, ResultColumn, ActiveNum, Row1, Column1, Row2, Column2)
distance_pl (ResultRows2, ResultColumns2, Row1, Column1, Row2, Column2, Dist2)
return ()

3.3 完整代码和图片下载

https://download.csdn.net/download/weixin_38566632/77330329


————————————————
版权声明:本文为CSDN博主「MechMaster」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38566632/article/details/122637756