总体思路
方式一:
1.循环读取图像
2.绘制ROI区域粗略提取目标区域,并从原图上剪切下来
3.利用二值化进一步提取,并进行填充
4.连通域打散区域,根据面积特征,快速精确的确定目标
5.吧区域转化为轮廓线,利用圆拟合算子进行处理
6.得到圆的信息参数,并显示结果
方式二:
1.利用二值化直接粗略提取目标
2.利用填充,从原图上剪切目标
3.利用Canny算法进行目标边缘提取
4.计算轮廓线个数,进行共圆处理
5.根据轮廓线长度特征进行挑选
6.根据得到的轮廓线进行圆拟合得到参数
7.显示结果
主程序
*循环读取图像
for Index := 1 to 2 by 1
read_image (Image, Index+'.bmp')
*转化为灰度图
rgb1_to_gray (Image, GrayImage)
*获取图像大小
get_image_size (GrayImage, Width, Height)
*打开适合图像的窗口
dev_open_window_fit_image (GrayImage, 0, 0, -1, -1, WindowHandle)
*显示
dev_display (GrayImage)
************************ 方法一 *********************************************************
*画ROI区域,粗略提取目标
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
*从原图上剪切出区域
reduce_domain (GrayImage, Rectangle, ImageReduced)
*二值化精确提取目标
threshold (ImageReduced, Region, 17, 75)
*区域填充
fill_up (Region, RegionFillUp)
*连通域分开
connection (RegionFillUp, ConnectedRegions)
*根据面积特征选出目标
select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)
*区域转化为轮廓线
gen_contour_region_xld (SelectedRegions, Contours, 'border')
*拟合圆
fit_circle_contour_xld (Contours, 'algebraic', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
*根据得到参数,重新生成圆
gen_circle_contour_xld (ContCircle, Row, Column, Radius, StartPhi, rad(360), 'positive', 1)
*生成圆中心
gen_cross_contour_xld (Cross, Row, Column, 16, StartPhi)
*显示结果
dev_clear_window()
dev_display(GrayImage)
dev_set_color('red')
dev_display(ContCircle)
dev_set_color('blue')
dev_display(Cross)
message:='半径='+Radius+'像素'
disp_message (WindowHandle, message, 'window', 460, 450, 'red', 'false')
stop()
************************ 方法二 *********************************************************
dev_clear_window ()
dev_display (GrayImage)
*二值化
threshold (GrayImage, Regions, 72, 255)
*填充
fill_up (Regions, RegionFillUp1)
*连通域打散
connection (RegionFillUp1, ConnectedRegions1)
*特征选取
select_shape_std (ConnectedRegions1, SelectedRegions1, 'max_area', 70)
*腐蚀
erosion_circle (SelectedRegions1, RegionErosion, 13.5)
*从原图剪切
reduce_domain (GrayImage, RegionErosion, ImageReduced1)
*Canny 算法边缘提取
edges_sub_pix (ImageReduced1, Edges, 'canny', 1, 20, 40)
*计算轮廓线个数
count_obj(Edges, Number)
*共圆处理
union_cocircular_contours_xld (Edges, UnionContours, 0.5, rad(6), 0.2, 30, 10, 10, 'true', 1)
*根据长度特征提取
select_shape_xld (Edges, SelectedXLD, 'contlength','and', 504.13, 1000)
*重新计算个数
count_obj(SelectedXLD, Number1)
*分别提取轮廓线
for Index1 := 1 to Number1 by 1
select_obj(SelectedXLD, ObjectSelected, 1)
endfor
*如果个数等于1
if(Number1==1)
*拟合圆
fit_circle_contour_xld(SelectedXLD, 'algebraic', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
*得到圆中心
gen_cross_contour_xld(Cross, Row, Column, 6, rad(0))
*根据参数得到圆轮廓线
gen_circle_contour_xld(ContCircle, Row, Column, Radius, StartPhi, EndPhi, 'positive', 1)
endif
*显示结果
dev_clear_window()
dev_display(GrayImage)
dev_set_color('red')
dev_display(ContCircle)
dev_set_color('blue')
dev_display(Cross)
message:='半径='+Radius+'像素'
disp_message (WindowHandle, message, 'window', 460, 450, 'red', 'false')
stop()
endfor
参考资料
union_cocircular_contours_xld算子解析
已经看到这里了,不妨点个赞和关注吧!
刚开始写文章,如有不足请多多包含;之后会持续更新关于(halcon学习,VS联合编程,QT联合编程,C++,C#,Opencv图像处理库,三维点云库pcl,相机以及机器人的二次开发)等系统化学习文章。