Halcon 模糊圆边的找圆案例

Halcon 模糊圆边的找圆案例

目录

基本思路

 效果

原图

步骤分解

1.准备

2.将图像转成灰度图像

3.再观察要找到的区域的灰度值变化,找到前景与背景的具体数值。

4.根据找到的前景与背景的具体数值,增强图像对比度。(使图像变成黑白图片)

5.使用灰度直图工具进行阈值分割,找到最佳的阈值

6.使用connection算子进行区域分割。相连的区域联接,不相联的区域分离

7.借助形状特征选择区域。

8.可以对图像边缘进行一些简单的处理。

        9.获取选择区域的信息,如面积,坐标等信息

        10.根据已知的区域坐标信息,使用找圆工具进行处理,并获取圆区域的相关数据,如圆心坐

完整代码


基本思路

        1.将图像转成灰度图像

        2.再观察要找到的区域的灰度值变化,找到前景与背景的具体数值。

        3.根据找到的前景与背景的具体数值,增强图像对比度。(使图像变成黑白图片)

        4.使用灰度直图工具进行阈值分割,找到最佳的阈值

        5.使用connection算子进行区域分割。相连的区域联接,不相联的区域分离

        6.借助形状特征选择区域。新手可以使用特征直方图工具进行可视化的选择区域。

        7.可以对图像边缘进行一些简单的处理。

        8.获取选择区域的信息,如面积,坐标等信息

        9.根据已知的区域坐标信息,使用找圆工具进行处理,并获取圆区域的相关数据,如圆心坐标,轮廓等

 效果

原图

步骤分解

1.准备

*读图
read_image (OriImage, 'E:/机器视觉学习/海康视觉平台/二期VM视觉学习/二期VM视觉学习/机器视觉程序/标定相机找圆心和焊头修正相机找圆心之算法软件/标定相机找圆心和焊头修正相机找圆心之算法软件/03 标定相机找圆心/S2/1号机/2.bmp')
get_image_size (OriImage, Width, Height)
dev_open_window (0, 0, Width/5, Height/5, 'black', WindowHandle)

2.将图像转成灰度图像

*将图像转成灰度图像
rgb1_to_gray (OriImage, GrayImage1)

3.再观察要找到的区域的灰度值变化,找到前景与背景的具体数值。

观察到圆内的灰度值是4,圆外的值是65。

4.根据找到的前景与背景的具体数值,增强图像对比度。(使图像变成黑白图片)

*增强对比度
*输入原图像
*输出处理后的图像
*最小值
*最大值
Enhancement (GrayImage1, Image2, 5, 50)

效果

从图上看我们要找的圆的区域变黑了,这样特征就明显了。

5.使用灰度直图工具进行阈值分割,找到最佳的阈值

插入的代码

threshold (Image2, Regions, 0, 37)

6.使用connection算子进行区域分割。相连的区域联接,不相联的区域分离

connection(Regions, Seg)

7.借助形状特征选择区域。

        新手可以使用特征直方图工具进行可视化的选择区域。

*借助形状特征选择区域
        *Regions (输入参数)要检查的区域。
        *SelectedRegions (输出参数)满足条件的地区
        *Features 要检查的形状特征。        
        *Operation 个体特征的联动类型。默认值:'and' 值列表:'and', 'or'
        *Min 特征的下限或` min `。
        *Max 特征的上限或` max `。        
select_shape (Seg, selectHole, 'area', 'and', 620478, 1.30065e+006)

8.可以对图像边缘进行一些简单的处理。

*用圆形(3.5半径)结构元素【闭运算】
         closing_circle (selectHole, RegionDilation2, 4.5)

        9.获取选择区域的信息,如面积,坐标等信息

*区域和区域中心。
         *参数说明
         *Regions (input_object)  输入要检查(计算)的区域
         *Area (output_control)  输出面积
         *Row (output_control) 中心点的行坐标
         *Column (output_control) 中心点的列坐标
         area_center(RegionDilation2, sel_area, sel_row, sel_col)
         *设置显示的字体
         set_display_font (WindowHandle, 26, 'mono', 'true', 'false')
         disp_message (WindowHandle, '匹配坐标:'+sel_row+','+sel_col, 'window', 20, 20, 'green', 'true')
         *显示十字中心
         disp_cross (WindowHandle, sel_row, sel_col, 50, 10)

        10.根据已知的区域坐标信息,使用找圆工具进行处理,并获取圆区域的相关数据,如圆心坐

tuple_sort_index(sel_area, SortIndex)
        
        if (|SortIndex| > 0)
            select_obj(selectHole, sel_last, SortIndex[0]+1)
            
            fill_up(sel_last, sel_last)
            region_to_bin(sel_last, BinImage, 0, 255,  Width, Height)
            
            MetchedRow := sel_row[SortIndex[0]]
            MatchedColumn := sel_col[SortIndex[0]]
            
            *二维测量精定位圆的位置
            MetrologyParamNames := ['measure_transition', 'measure_select', 'min_score']
            MetrologyParamValues := ['positive', 'first', '0.6']
            *添加找圆工具
            create_metrology_model (MetrologyHandle)   
            set_metrology_model_param (MetrologyHandle, 'camera_param', [])
            set_metrology_model_image_size (MetrologyHandle, Width, Height)
            add_metrology_object_circle_measure (MetrologyHandle, sel_row, sel_col, ModelROIRadius, 70, 1, 1, 30, [], [], Index)
            *返回图像坐标中选定的计量对象的轮廓。
*参数说明
*Contour (输入参数)模型轮廓
*MetrologyHandle (输入参数)计量模型的句柄
*Index 计量对象的索引
*Resolution 相邻轮廓点之间的距离
get_metrology_object_model_contour(Contour, MetrologyHandle, 'all', 1.5)
*获取测量区域和计量模型的计量对象的边缘位置结果
*参数说明
*Contour (输入参数)模型轮廓
*MetrologyHandle (输入参数)计量模型的句柄
*Index 计量对象的索引
*Transition 选择亮/暗 或 暗/亮边缘。ALL全部, negative(白到黑),positive(黑到白)
*Row 测量边的行坐标
*Column 测量边的列坐标
get_metrology_object_measures (Contours, MetrologyHandle, 'all', 'all', Row2, Column2)
            dev_set_color ('cyan')
            dev_display (Contours)
dev_display (Contour)
            apply_metrology_model (BinImage, MetrologyHandle)
            get_metrology_object_result (MetrologyHandle, 0, 'all', 'result_type', 'all_param', Parameter)
            get_metrology_object_result (MetrologyHandle, 0, 'all', 'result_type', 'radius', radius)
            *判断是否找圆成功
            if (|Parameter| > 0)
                ResultCenterRow := Parameter[0]
                ResultCenterColumn := Parameter[1]
                *获取圆的半径
                ResultRadius := Parameter[2]
                *为每个输入点生成一个十字形状的XLD轮廓。
                *gen_cross_contour_xld (Cross, Row2, Column2, 100, 0)
                *dev_set_color('red')
                *dev_display(Cross)
                *创建XLD轮廓对应于圆或圆弧。
                *gen_circle_contour_xld (ContCircle1, ResultCenterRow, ResultCenterColumn, ResultRadius, 0, 6.28318, 'positive', 1)
                *dev_set_color('green')
                *dev_display(ContCircle1)
                 *获取计量模型的测量结果
*参数说明:
*(输出参数)MetrologyHandle 处理计量模型
*index 
*Instance 
*GenParamName ‘result_type’:
*对于圆,返回值是中心的坐标和圆的半径。顺序分别是[‘row’,‘column’,‘radius’]或 [‘x’,‘y’,‘radius’]
*对于椭圆,返回值是中心的坐标,长轴’phi’的方向,较大半轴’radius1’的长度,以及椭圆的较小半轴’radius2’的长度。
*顺序分别是[‘row’,‘column’,‘phi’,‘radius1’,‘radius2’]或 [‘x’,‘y’,‘phi’,‘radius1’,‘radius2’]
*对于一条线,返回该线的起点和终点。顺序是[‘row_begin’,‘column_begin’,‘row_end’,‘column_end’]
*或 [‘x_begin’,‘y_begin’,‘x_end’,‘y_end’]
*对于矩形,返回值是中心的坐标,主轴’phi’的方向,较大的半边’length1’的长度,以及矩形的较小半边’length2’的长度。
*顺序分别是[‘row’,‘column’,‘phi’,‘length1’,‘length2’]或 [‘x’,‘y’,‘phi’,‘length1’,‘length2’]
*GenParamValue
*Parameter
get_metrology_object_result(MetrologyHandle, 'all', 'all', 'result_type', 'all_param', Parameter)
*查询计量对象的结果轮廓
*参数说明
*Contour (输入参数)给定计量对象的结果轮廓
*MetrologyHandle (输入参数)计量模型的句柄
*Index (输入参数)计量对象的索引,想要第几个结果轮廓
*Instance 输入参数)计量对象的实例
*Resolution 相邻轮廓点之间的距离
get_metrology_object_result_contour (Contour1, MetrologyHandle, 'all', 'all', 1.5)
*fill_up(Contour1, Contour1circle)
dev_set_line_width(3)
dev_set_color('green')
dev_display(Contour1)

disp_message (WindowHandle, '圆中心坐标:X:'+Parameter[0]+',Y:'+Parameter[1], 'window', 20, 20, 'red', 'true')

ResultCenterColumn := Parameter[0]
ResultCenterRow := Parameter[1]
*清除模板
clear_metrology_model (MetrologyHandle)

完整代码

dev_close_window ()
********************变量定义********************
*搜索ROI
SearchROIRow1 := 405.341
SearchROIColumn1 := 1121.06
SearchROIRow2 := 3245.93
SearchROIColumn2 := 3676

*圆形模板ROI
ModelROIRow := 1281.04
ModelROIColumn := 2422.51
ModelROIRadius := 468.297
DilationRadius := 50

********************************************
* 第二种类型,圆的半径比第一种要大,11
SecondType := true
if (SecondType == true)
    ModelROIRadius := 560
    DilationRadius := 100
endif
Result := 'Pass'
*读图
read_image (OriImage, 'E:/机器视觉学习/海康视觉平台/二期VM视觉学习/二期VM视觉学习/机器视觉程序/标定相机找圆心和焊头修正相机找圆心之算法软件/标定相机找圆心和焊头修正相机找圆心之算法软件/03 标定相机找圆心/S2/1号机/1.bmp')
get_image_size (OriImage, Width, Height)
dev_open_window (0, 0, Width/5, Height/5, 'black', WindowHandle)
*将图像转成灰度图像
rgb1_to_gray (OriImage, GrayImage1)
*增强对比度
*输入原图像
*输出处理后的图像
*最小值
*最大值
Enhancement (GrayImage1, Image2, 5, 50)
*使用不同的掩码计算中值滤波器。
        *Image (输入参数)要过滤的图像。
        *ImageMedian (输出参数)过滤后的图像
        *MaskType 过滤掩码类型 值列表:'circle', 'square'
        *Radius 滤镜遮罩的半径
        *Margin 边界处理 默认值: 'mirrored' 建议值:` mirrored `, ` cyclic `, ` continue `, 0, 30, 60, 90, 120, 150, 180, 210, 240, 255
        *median_image (OriImage, Median, 'circle', 3, 'mirrored')
        *使用直方图确定的阈值分割图像。
        *auto_threshold (Median, Seg, 2.0)
         
         threshold (Image2, Regions, 0, 37)
         *threshold (Image2, Regions, 0, 129)
        *用圆形(2.5半径)结构元素【膨胀】
        *Radius : 圆形(2.5半径)
        *dilation_circle (Regions, RegionDilation2, 4.5)

        connection(Regions, Seg)
        *借助形状特征选择区域
        *Regions (输入参数)要检查的区域。
        *SelectedRegions (输出参数)满足条件的地区
        *Features 要检查的形状特征。        
        *Operation 个体特征的联动类型。默认值:'and' 值列表:'and', 'or'
        *Min 特征的下限或` min `。
        *Max 特征的上限或` max `。        
        select_shape (Seg, selectHole, 'area', 'and', 620478, 1.30065e+006)
        *select_shape(Seg, selectHole, ['width', 'height'], 'and', [ModelROIRadius*2- DilationRadius, ModelROIRadius*2- DilationRadius],\
                     [ModelROIRadius*2+ DilationRadius, ModelROIRadius*2+ DilationRadius])  
        *用圆形(2.5半径)结构元素【膨胀】
        *Radius : 圆形(2.5半径)
        *dilation_circle (selectHole, RegionDilation2, 4.5)
         *用圆形(3.5半径)结构元素【闭运算】
         closing_circle (selectHole, RegionDilation2, 4.5)
         *区域和区域中心。
         *参数说明
         *Regions (input_object)  输入要检查(计算)的区域
         *Area (output_control)  输出面积
         *Row (output_control) 中心点的行坐标
         *Column (output_control) 中心点的列坐标
         area_center(RegionDilation2, sel_area, sel_row, sel_col)
         *设置显示的字体
         set_display_font (WindowHandle, 26, 'mono', 'true', 'false')
         disp_message (WindowHandle, '匹配坐标:'+sel_row+','+sel_col, 'window', 20, 20, 'green', 'true')
         *显示十字中心
         disp_cross (WindowHandle, sel_row, sel_col, 50, 10)
        tuple_sort_index(sel_area, SortIndex)
        
        if (|SortIndex| > 0)
            select_obj(selectHole, sel_last, SortIndex[0]+1)
            
            fill_up(sel_last, sel_last)
            region_to_bin(sel_last, BinImage, 0, 255,  Width, Height)
            
            MetchedRow := sel_row[SortIndex[0]]
            MatchedColumn := sel_col[SortIndex[0]]
            
            *二维测量精定位圆的位置
            MetrologyParamNames := ['measure_transition', 'measure_select', 'min_score']
            MetrologyParamValues := ['positive', 'first', '0.6']
            *添加找圆工具
            create_metrology_model (MetrologyHandle)   
            set_metrology_model_param (MetrologyHandle, 'camera_param', [])
            set_metrology_model_image_size (MetrologyHandle, Width, Height)
            add_metrology_object_circle_measure (MetrologyHandle, sel_row, sel_col, ModelROIRadius, 70, 1, 1, 30, [], [], Index)
            *返回图像坐标中选定的计量对象的轮廓。
            *参数说明
            *Contour (输入参数)模型轮廓
            *MetrologyHandle (输入参数)计量模型的句柄
            *Index 计量对象的索引
            *Resolution 相邻轮廓点之间的距离
            get_metrology_object_model_contour(Contour, MetrologyHandle, 'all', 1.5)
            *获取测量区域和计量模型的计量对象的边缘位置结果
            *参数说明
            *Contour (输入参数)模型轮廓
            *MetrologyHandle (输入参数)计量模型的句柄
            *Index 计量对象的索引
            *Transition 选择亮/暗 或 暗/亮边缘。ALL全部, negative(白到黑),positive(黑到白)
            *Row 测量边的行坐标
            *Column 测量边的列坐标
            get_metrology_object_measures (Contours, MetrologyHandle, 'all', 'all', Row2, Column2)
            dev_set_color ('cyan')
            dev_display (Contours)
            dev_display (Contour)
            apply_metrology_model (BinImage, MetrologyHandle)
            get_metrology_object_result (MetrologyHandle, 0, 'all', 'result_type', 'all_param', Parameter)
            get_metrology_object_result (MetrologyHandle, 0, 'all', 'result_type', 'radius', radius)
            *判断是否找圆成功
            if (|Parameter| > 0)
                ResultCenterRow := Parameter[0]
                ResultCenterColumn := Parameter[1]
                *获取圆的半径
                ResultRadius := Parameter[2]
                *为每个输入点生成一个十字形状的XLD轮廓。
                *gen_cross_contour_xld (Cross, Row2, Column2, 100, 0)
                *dev_set_color('red')
                *dev_display(Cross)
                *创建XLD轮廓对应于圆或圆弧。
                *gen_circle_contour_xld (ContCircle1, ResultCenterRow, ResultCenterColumn, ResultRadius, 0, 6.28318, 'positive', 1)
                *dev_set_color('green')
                *dev_display(ContCircle1)
                 *获取计量模型的测量结果
                *参数说明:
                *(输出参数)MetrologyHandle 处理计量模型
                *index 
                *Instance 
                *GenParamName ‘result_type’:
                *对于圆,返回值是中心的坐标和圆的半径。顺序分别是[‘row’,‘column’,‘radius’]或 [‘x’,‘y’,‘radius’]
                *对于椭圆,返回值是中心的坐标,长轴’phi’的方向,较大半轴’radius1’的长度,以及椭圆的较小半轴’radius2’的长度。
                *顺序分别是[‘row’,‘column’,‘phi’,‘radius1’,‘radius2’]或 [‘x’,‘y’,‘phi’,‘radius1’,‘radius2’]
                *对于一条线,返回该线的起点和终点。顺序是[‘row_begin’,‘column_begin’,‘row_end’,‘column_end’]
                *或 [‘x_begin’,‘y_begin’,‘x_end’,‘y_end’]
                *对于矩形,返回值是中心的坐标,主轴’phi’的方向,较大的半边’length1’的长度,以及矩形的较小半边’length2’的长度。
                *顺序分别是[‘row’,‘column’,‘phi’,‘length1’,‘length2’]或 [‘x’,‘y’,‘phi’,‘length1’,‘length2’]
                *GenParamValue
                *Parameter
                get_metrology_object_result(MetrologyHandle, 'all', 'all', 'result_type', 'all_param', Parameter)
                *查询计量对象的结果轮廓
                *参数说明
                *Contour (输入参数)给定计量对象的结果轮廓
                *MetrologyHandle (输入参数)计量模型的句柄
                *Index (输入参数)计量对象的索引,想要第几个结果轮廓
                *Instance 输入参数)计量对象的实例
                *Resolution 相邻轮廓点之间的距离
                get_metrology_object_result_contour (Contour1, MetrologyHandle, 'all', 'all', 1.5)
*                fill_up(Contour1, Contour1circle)
                dev_set_line_width(3)
                dev_set_color('green')
                dev_display(Contour1)
                
                disp_message (WindowHandle, '圆中心坐标:X:'+Parameter[0]+',Y:'+Parameter[1], 'window', 20, 20, 'red', 'true')
                
                ResultCenterColumn := Parameter[0]
                ResultCenterRow := Parameter[1]
                *清除模板
                clear_metrology_model (MetrologyHandle)
            else
                Result := 'Fail'
            endif
            
            
        else
            Result := 'Fail'
        endif
    
************************************************
    
********************显示结果********************
    dev_get_window (WindowHandle)
    set_display_font (WindowHandle, 20, 'mono', 'true', 'false')
    dev_set_line_width (2)
    dev_clear_window()
    dev_display (OriImage)
    if (Result == 'Pass')
        color := 'green'  
        dev_display (Contour1) 
        *显示十字中心
        disp_cross (WindowHandle, Parameter[0], Parameter[1], 100, 90)
        *dev_display (ContCircle)
        dev_disp_text (Result + '\nX:' + ResultCenterColumn + ' Y:' + ResultCenterRow, 'window', 12, 12, color, ['box', 'box_color', 'shadow'], ['true', 'black', 'false'])        
    else
        color := 'red'
        dev_disp_text (Result, 'window', 12, 12, color, ['box', 'box_color', 'shadow'], ['true', 'black', 'false'])
    endif
    
***********************************************
    stop ()

效果

END

### Halcon 示例案例与实际应用 以下是关于 Halcon 的一些常见示例和实际应用场景,涵盖了多种图像处理技术的应用。 #### 直线拟合 通过 `fit_line_contour_xld` 函数可以实现直线拟合。以下是一个完整的代码示例: ```hdevelop * 数据生成 gen_cross_contour_xld (Cross, 0, 0, 100, pi/4) * 拟合操作 fit_line_contour_xld (Cross, 'tukey', -1, 0, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist) * 结果可视化 dev_display(Cross) disp_line(RowBegin, ColBegin, RowEnd, ColEnd) ``` 上述代码展示了如何利用轮廓数据进行直线拟合并显示结果[^1]。 #### 拟合 对于形目标的检测,可以通过 `fit_circle_contour_xld` 完成拟合过程: ```hdevelop * 创建模拟形轮廓 gen_circle_contour_xld (Circle, 50, 50, 30, 0, 2*pi, 'positive', 100) * 执行拟合 fit_circle_contour_xld (Circle, 'algebraic', -1, 0, 0.1, 10, Row, Column, Radius, StartPhi, EndPhi, PointOrder) * 显示拟合结果 dev_display(Circle) disp_circle(Row, Column, Radius) ``` 此代码片段说明了如何创建一个虚拟形轮廓并通过代数法完成其参数估计。 #### 多项式曲线拟合 当面对更复杂的形状时,可采用多项式函数来描述这些形态特征。下面是一段用于二次多项式的例子: ```hdevelop * 构造样本点集 X := [0, 10, 20, 30, 40] Y := [0, 98, 197, 296, 395] * 进行二阶多项式回归分析 tuple_polyfit(X,Y,2,A,B,C) * 绘制原始散点图及其对应的拟合曲线 TupleGenPoly(A,B,C,X,PolyVal) plot_func_data(PolyVal,'red') ``` 这里演示的是基于给定点集合执行二次方程形式的最佳逼近方法。 #### 曲面拟合 针对三维空间内的表面重建需求,则需借助专门设计好的工具包来进行处理。例如,在 HALCON 中提供了名为 `surface_fitting` 的模块支持此类任务。 --- 除了以上理论上的算法介绍外,还有许多真实世界中的成功实践可供参考学习。比如工业自动化领域里经常遇到的产品缺陷探测问题——即通过对生产线上传送带上的物件拍照扫描之后再运用机器视觉手段识别是否存在瑕疵损伤等情况;又或者是无人驾驶汽车环境感知部分所依赖的道路标志牌识读功能等等均属于典型代表作之一[^2]。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

StevenChen85

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值