9:图像处理—圆定位和测量

总体思路

方式一:

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

参考资料

select_shape_std()算子解析

gen_contour_region_xld()算子解析

union_cocircular_contours_xld算子解析

select_shape_xld()算子解析


 已经看到这里了,不妨点个赞和关注吧!

      刚开始写文章,如有不足请多多包含;之后会持续更新关于(halcon学习,VS联合编程,QT联合编程,C++,C#,Opencv图像处理库,三维点云库pcl,相机以及机器人的二次开发)等系统化学习文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值