Halcon缺陷检测

1.检测圆的最大轮廓:

(1)滤波

(2)Canny边缘分割

(3)提取轮廓

(4)按要求筛选出线段和圆弧

(5)找出最长的圆弧轮廓

(6)拟合圆,连接轮廓

(7)求得半径和坐标

*平滑
median_image(Image,ImageMedian,'square', 5, 'mirrored')
*canny边缘
edges_sub_pix(Image,edges,'canny',1,20,40)
*第一次挑选出长的轮廓,有效滤除假边缘
select_shape_xld(edges,select_edges,'area','or',2000,9999999)
*将XLD轮廓分割为直线段、圆(圆弧)、椭圆弧。
segment_contours_xld (select_edges, ContoursSplit, 'lines_circles', 5, 4, 3)
*根据轮廓点面积挑选出长的圆形轮廓
select_shape_xld(ContoursSplit,select_edges2,'area','or',4000,999999)
*根据圆度挑选轮廓
select_shape_xld(select_edges2,select_edges3,'circularity','or',0,0.15)
count_obj (select_edges3, Number)
*连接轮廓
union_cocircular_contours_xld (select_edges3, CircleContours, rad(45), rad(0), rad(45), 300, 50, 50, 'true', 10)     
*利用连接的轮廓拟合圆
fit_circle_contour_xld (CircleContours, 'algebraic', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
*拟合圆的坐标、半径
gen_contour_polygon_xld (Contour, Row, Column)

如果拟合出来的圆有两段或者多段,可以去半径和坐标相对应的数组中的最大值或者平均值,如图

Halcon缺陷检测_第1张图片

tuple_max(Row, roMax)
tuple_max(Column,coMax)
tuple_max(Radius,raMax)
*选取最大值矩阵
gen_circle_contour_xld(ContCircle,roMax,coMax,raMax, 0, 6.28318, 'positive', 1)
gen_circle(ContCircle,Row, Column, Radius)
reduce_domain(Image,ContCircle,ImageReduced)

2.保存处理好的ROI图像,要求按照剪裁区域保存

在剪裁图像后,调用crop_domain函数

reduce_domain(imgDst,ContCircle,ImageReduced)
crop_domain (ImageReduced, ImagePart)

不掉用的话会直接保存原图

3.寻找最大(最小、第二大、第二小……)的轮廓

Halcon缺陷检测_第2张图片

 

Halcon缺陷检测_第3张图片

 

Halcon缺陷检测_第4张图片

     select_contours_xld (Edges, RelEdges, 'length',500, 999999, 0, 0)
     test_equal_obj(RelEdges, RelEdges, IsEqual)
     union_adjacent_contours_xld(RelEdges, UnionContours, 10, 1, 'attr_keep')
     fit_circle_contour_xld(UnionContours, 'algebraic', -1, 0, 0, 3, 2, Row1, Column1, Ra1, StartPhi1, EndPhi1, PointOrder1)
     *计算图像中的轮廓信息
     area_center_xld(UnionContours, Area, Row, Column, PointOrder)
     *对得到的轮廓面积进行排序(按照大小),存进数组
     tuple_sort_index(Area,Indices)
     *得到轮廓数量
     count_obj(UnionContours, Number)
     *Indices[Number-1]+1 代表tuple中存放的对应位置的索引(具体要第几位大小的需要自己调,现在是最大)
     select_obj(UnionContours, ObjectSelected, Indices[Number-1]+1)

借鉴:halcon选择图像中的物件最大外轮廓的通用办法 - 上位机开发笔记

Halcon选择一堆region中面积第N大的region的算法实现 - xh6300 - 博客园

4. 如何进行自适应ROI提取?

第一类为边界明显变暗,可以通过轮廓搜寻,然后roi,类似下图:

Halcon缺陷检测_第5张图片

 

第二类为边界不明显,不能够完整的搜寻到其轮廓,需要使用阈值分割选取区域再提取轮廓,类似下图:

Halcon缺陷检测_第6张图片

 

你可能感兴趣的:(图像处理,机器视觉,Halcon,计算机视觉)