Halcon 模糊圆边的找圆案例
基本思路
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