Halcon:测量拟合法检测缺陷

图像处理结果:
Halcon:测量拟合法检测缺陷_第1张图片

主要思想:
1.Blob分析,就是实际的边界和拟合的距离
2.对于所有实际边界的点,测试到拟合矩形的距离
3.先排除4个角落的点(以拟合矩形角点为中心,7个像素为半径,不测这其中的点),然后再测试中间的点到拟合矩形的距离

代码如下:
*更新窗口
dev_update_off ()
*读取图像
read_image (Image, ‘punched_holes’)
*获取图像大小
get_image_size (Image, Width, Height)
*关闭窗口
dev_close_window ()
*打开窗口
dev_open_window (0, 0, Width, Height, ‘black’, WindowHandle)
*设置字体大小
set_display_font (WindowHandle, 16, ‘mono’, ‘true’, ‘false’)
*显示图像
dev_display (Image)
*快速二值化,增加了被提取区域最小尺寸10个像素
fast_threshold (Image, Region, 128, 255, 10)
*形态学求边界,inner代表内边界。内边界=原图-腐蚀后的图
*外边界=膨胀后的图-原图
boundary (Region, Border, ‘inner’)
*获取边界后,用矩形进行膨胀运算
dilation_rectangle1 (Border, EdgeROI, 7, 7)
*再将图像区域扣取出来
reduce_domain (Image, EdgeROI, ImageReduced)
*边缘提取,输出XLD轮廓,平滑系数1.7
edges_sub_pix (ImageReduced, Edges, ‘canny’, 1.7, 40, 120)
*选择周长在500-100000像素内的边界
select_shape_xld (Edges, RectangleEdges, ‘contlength’, ‘and’, 500, 100000)
*拟合一个矩形,得到一个带方向的矩形
fit_rectangle2_contour_xld (RectangleEdges, ‘tukey’, -1, 0, 0, 3, 2, Row, Column, Phi, Length1, Length2, PointOrder)
*形成一个矩形的亚像素轮廓xld
gen_rectangle2_contour_xld (Rectangles, Row, Column, Phi, Length1, Length2)
*设置颜色为黄色
dev_set_color (‘yellow’)
*显示边
dev_display (Rectangles)
*计算所有边界的数量
count_obj (RectangleEdges, Number)
*开始计算轮廓上的点和最小外接矩形上的点之间的距离(会排除4个叫的距离)
for I := 0 to Number - 1 by 1
*开始选中第一个轮廓,索引从1开始
select_obj (RectangleEdges, RectangleEdge, I + 1)
*通过轮廓,得到轮廓上的点的坐标。会有很多点,这是实际边界上的点
get_contour_xld (RectangleEdge, Rows, Cols)
*形成XLD亚像素轮廓
gen_rectangle2_contour_xld (Rect, Row[I], Column[I], Phi[I], Length1[I], Length2[I])
* 获得拟合的轮廓上的点。这是完美矩形上的点
get_contour_xld (Rect, RowC, ColC)
*下面是横坐标的平方和+纵坐标的平方和,开跟号
*求的就是实际边界上的点和拟合矩形边界上的点的距离
*RowC,ColC从0-3,代表的是拟合的矩形的4个角的坐标值
D1 := sqrt((Rows - RowC[0]) * (Rows - RowC[0]) + (Cols - ColC[0]) * (Cols - ColC[0]))
D2 := sqrt((Rows - RowC[1]) * (Rows - RowC[1]) + (Cols - ColC[1]) * (Cols - ColC[1]))
D3 := sqrt((Rows - RowC[2]) * (Rows - RowC[2]) + (Cols - ColC[2]) * (Cols - ColC[2]))
D4 := sqrt((Rows - RowC[3]) * (Rows - RowC[3]) + (Cols - ColC[3]) * (Cols - ColC[3]))
* 轮廓上的点到最小外接矩形4个角点,上最小距离值
DistCorner := min2(min2(D1,D2),min2(D3,D4))
*求的是轮廓上的点到最小外接矩形间的距离。0代表不忽略任何点
dist_rectangle2_contour_points_xld (RectangleEdge, 0, Row[I], Column[I], Phi[I], Length1[I], Length2[I], Dist)
*假设距离都在规格范围内
RectangleOK := true
for J := 0 to |Dist| - 1 by 1
*从0开始,对于上面计算出的距离值进行判断
*对于某个点而言,到最近的角点的距离超过了7个像素,说明我们对于角落的部分点进行了筛选
*做对应计算的是不在角落7个像素以内的点
*如果这些点和最小外接矩形的区域距离超过1个像素,说明该点是NG的
if (DistCorner[J] > 7.0 and Dist[J] > 1.0)
RectangleOK := false
break
endif
endfor
* sgn是符号函数,括号里面的值=0,Mask就等于0.里面的值>0,Mask就等于1。里面的值<0,Mask就等于-1。
*max2(DistCorner - 7.0,0.0),就代表角点的坐标,如果有超过7个像素的值,那么就>0;Mask就等于1
如果没有超过7个像素的值,那么<0。max2(DistCorner - 7.0,0.0)就等于0,Mask就等于0
Mask := sgn(max2(DistCorner - 7.0,0.0))
* 如果等于1的话,1
这个距离。如果距离的最大值<=1成立,就说明ok
RectangleOK := max(Dist * Mask) <= 1.0
* 显示那个孔洞是OK的
if (RectangleOK)
dev_set_color (‘green’)
*取一个字符串的空间大小
get_string_extents (WindowHandle, ‘OK’, Ascent, Descent, Width, Height)
*设置光标的位置
set_tposition (WindowHandle, Row[I] - Height / 2, Column[I] - Width / 2)
*写一个ok字符串
write_string (WindowHandle, ‘OK’)
else
dev_set_color (‘red’)
get_string_extents (WindowHandle, ‘Not OK’, Ascent, Descent, Width, Height)
set_tposition (WindowHandle, Row[I] - Height / 2, Column[I] - Width / 2)
write_string (WindowHandle, ‘Not OK’)
endif
endfor

对应示例程序:
fit_rectangle2_contour_xld.hdev

你可能感兴趣的:(Halcon,计算机视觉,边缘检测)