halcon找圆心坐标实例

基本思路:

        1.选择一张图片做为找圆的模板。

        2.在图片中将要找的圆用ROI画出来,并提取模板轮廓

        3.根据模板去匹配(查找)图像,并获取目标的心中坐标

        4.使用找圆工具,获取圆的中心坐标结果。

效果

原始图片

示例代码

dev_close_window ()
*dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*增强对比度参数
Min := 55
Max := 60
read_image (OriImage, 'E:/机器视觉学习/海康视觉平台/二期VM视觉学习/二期VM视觉学习/机器视觉程序/标定相机找圆心和焊头修正相机找圆心之算法软件/标定相机找圆心和焊头修正相机找圆心之算法软件/03 标定相机找圆心/S3/1号机/模板图像.bmp')
get_image_size (OriImage, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
rgb1_to_gray (OriImage, GrayImage)
*增强对比度
Enhancement (OriImage, Image, Min, Max)
*生成ROI区域
draw_circle (WindowHandle, Row, Column, Radius)
*生成圆形区域
gen_circle (Circle, Row, Column, Radius)
*缩小图像的域(ROI) Image
reduce_domain (Image, Circle, ImageReduced)
*做模板,提取模板轮廓
*ImageReduced1(输入对象):输入图像对象
*'auto'(输入控制参数1):默认自动获取
*0(输入控制参数2):创建模板的起始角度(弧度)
*rad(360) (输入控制参数3):创建模板的终止角度(弧度)
*'auto'(输入控制参数4):默认自动获取
*0.2(输入控制参数5):缩放最小比例
*1.5(输入控制参数6):缩放最大比例
*'auto'(输入控制参数7):默认自动获取
*'auto'(输入控制参数8):默认自动获取
*'use_polarity'(输入控制参数9):设置模板优化和模板创建方法
*'auto'(输入控制参数10):默认自动获取
*'auto'(输入控制参数11):默认自动获取
*ModelID(输出控制参数):输出模板句柄
create_scaled_shape_model (ImageReduced, 'auto', rad(0), rad(360), 'auto', 0.3, 1.1, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)

read_image (Image1, 'E:/机器视觉学习/海康视觉平台/二期VM视觉学习/二期VM视觉学习/机器视觉程序/标定相机找圆心和焊头修正相机找圆心之算法软件/标定相机找圆心和焊头修正相机找圆心之算法软件/03 标定相机找圆心/S3/1号机/20240320005141.bmp')
rgb1_to_gray (Image1, GrayImage1)
*增强对比度
Enhancement (GrayImage1, Image2, Min, Max)
*根据模板去匹配(查找)图像
*用于在图像中搜索已知形状模型的实例,同时允许模型在尺寸、旋转和位置方面发生变化。
*这个操作符非常适合于在不同尺度和方向上识别目标对象。
*Image(输入对象):输入需要找寻的图像
*ModelID(输入控制参数1):输入模型句柄
*AngleStart: rad(0)(输入控制参数2):找寻的起始角度,搜索角度的最小值,以弧度为单位。
*AngleExtent: rad(360)(输入控制参数3):找寻的终止角度,搜索角度的最大值,以弧度为单位。
*ScaleMin(输入控制参数4)0.9:找寻的最小缩放比,搜索的最小尺度因子。
*ScaleMax (输入控制参数5)1.1:找寻的最大缩放比,搜索的最大尺度因子。
*MinScore(输入控制参数6)0.5:最小匹配分数.
*NumMatches (输入控制参数7)1:找寻的最大个数,匹配阈值,用于确定是否找到了模型的实例。
*MaxOverlap (输入控制参数8)0.5:(最大重叠率)最大覆盖率还可以发现系数值。
*SubPixel 'least_squares'(输入控制参数9):计算精度的设置,亚像素。
*如果亚像素精度不等于` none `。
*默认值:'least_squares'。
*建议值:'none', 'interpolation', 'least_squares', 'least_squares_high', 'least_squares_very_high', 'max_deformation 1', 'max_deformation 2', 'max_deformation 3', 'max_deformation 4', 'max_deformation 5', 'max_deformation 6'
*NumLevels 0(输入控制参数10):搜索时金字塔的层数.值列表:0、1、2、3、4、5、6、7、8、9、10
*Greediness 0.9(输入控制参数11):贪婪度  一般设置为0.9 速度快 容易出现找不到的情况(0:安全但慢;1:快速,但可能错过比赛)。
*Row(输出控制参数1):匹配位置的行坐标
*Column(输出控制参数2):匹配位置的列坐标
*Angle(输出控制参数3):匹配位置的角度
*Scale(输出控制参数4):默认值Score(输出控制参数5):匹配位置的得分
find_scaled_shape_model (Image2, ModelID, rad(0), rad(360), 0.9, 1.1, 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row1, Column1, Angle, Scale, Score)
*find_ncc_model (ImageReduced, ModelID, -0, 0, Score, 1, 0.2, 'true', ModelNumLevels, MetchedRow, MatchedColumn, MatchedAngle, MatchedScore)  
*find_ncc_model (GrayImage1, ModelID, Angle, Angle, 0.8, 1, 0.5, 'true', 0, Row3, Column3, Angle1, Score1)
*显示匹配(查找)到的图像
dev_display_shape_matching_results (ModelID, 'red', Row1, Column1, Angle, 1, 1, 0)
*设置显示的字体
set_display_font (WindowHandle, 26, 'mono', 'true', 'false')
disp_message (WindowHandle, '匹配坐标:'+Row1+','+Column1, 'window', 20, 20, 'red', 'true')
*显示十字中心
disp_cross (WindowHandle, Row1, Column1, 50, Angle)

*添加找圆工具
create_metrology_model (MetrologyHandle)
*向计量模型添加一个circle或圆弧类型的计量对象,并准备矩形测量区域。模型的句柄在MetrologyHandle中传递。
*参数说明
*MetrologyHandle (输入参数)计量模型的句柄
*Row (输入参数)圆心或圆弧的行坐标(或Y)。
*Column1 (输入参数)圆心或圆弧的列(或X)坐标。
*Radius(输入参数)圆或圆弧的半径
*MeasureLength1 (70)垂直于边界的测量区域的半长(卡尺的长度)
*MeasureLength2 (1)测量区域与边界切线的半长度(卡尺的度度)
*MeasureSigma (1)用于平滑的高斯函数。建议值:0.4,0.6,0.8,1.0,1.5,2.0,3.0,4.0,5.0,7.0,10.0 典型取值范围:0.4≤measuressigma最小增量:0.01,建议增量:0.1
*MeasureThreshold (10)测量阈值,最小边缘振幅
*GenParamName 泛型参数的名称
*值列表:` distance_threshold `, ` end_phi `, ` instances_outside_measure_regions `, ` max_num_iterations `, ` measure_distance `, ` measure_interpolation `, ` measure_select `, ` measure_transition `, ` min_score `, ` num_instances `, ` num_measures `, ` point_order `, ` rand_seed `, ` start_phi `
*GenParamValu 泛型参数的值
*Index(输出参数)创建的计量对象的索引
add_metrology_object_circle_measure (MetrologyHandle, Row1, Column1, Radius, 70, 1, 1, 10, [], [], 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 (GrayImage1, MetrologyHandle)
*获取计量模型的测量结果
*参数说明:
*(输出参数)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)
dev_set_line_width(3)
dev_set_color('green')
dev_display(Contour1)
disp_message (WindowHandle, '圆中心坐标:X:'+Parameter[0]+',Y:'+Parameter[1]+'_匹配分数:'+Score, 'window', 20, 20, 'red', 'true')
*显示十字中心
disp_cross (WindowHandle, Parameter[0], Parameter[1], 50, Angle)
*清除模板
clear_metrology_model (MetrologyHandle)



多图测试增加了FO语法的使用

小优化了:增加卡尺的长度 从70改成100,降低匹配的最小分数 从0.5改了0.3

dev_close_window ()
*dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*增强对比度参数
Min := 55
Max := 60
read_image (OriImage, 'E:/机器视觉学习/海康视觉平台/二期VM视觉学习/二期VM视觉学习/机器视觉程序/标定相机找圆心和焊头修正相机找圆心之算法软件/标定相机找圆心和焊头修正相机找圆心之算法软件/03 标定相机找圆心/S3/1号机/模板图像.bmp')
get_image_size (OriImage, Width, Height)
dev_open_window (0, 0, Width/3, Height/3, 'black', WindowHandle)
rgb1_to_gray (OriImage, GrayImage)
*增强对比度
Enhancement (OriImage, Image, Min, Max)
*生成ROI区域
draw_circle (WindowHandle, Row, Column, Radius)
*生成圆形区域
gen_circle (Circle, Row, Column, Radius)
*缩小图像的域(ROI) Image
reduce_domain (Image, Circle, ImageReduced)
*做模板,提取模板轮廓
*ImageReduced1(输入对象):输入图像对象
*'auto'(输入控制参数1):默认自动获取
*0(输入控制参数2):创建模板的起始角度(弧度)
*rad(360) (输入控制参数3):创建模板的终止角度(弧度)
*'auto'(输入控制参数4):默认自动获取
*0.2(输入控制参数5):缩放最小比例
*1.5(输入控制参数6):缩放最大比例
*'auto'(输入控制参数7):默认自动获取
*'auto'(输入控制参数8):默认自动获取
*'use_polarity'(输入控制参数9):设置模板优化和模板创建方法
*'auto'(输入控制参数10):默认自动获取
*'auto'(输入控制参数11):默认自动获取
*ModelID(输出控制参数):输出模板句柄
create_scaled_shape_model (ImageReduced, 'auto', rad(0), rad(360), 'auto', 0.3, 1.1, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)

*图片文件夹
imageDir := 'E:/机器视觉学习/海康视觉平台/二期VM视觉学习/二期VM视觉学习/机器视觉程序/标定相机找圆心和焊头修正相机找圆心之算法软件/标定相机找圆心和焊头修正相机找圆心之算法软件/03 标定相机找圆心/S3/1号机'
 
*获取文件列表
list_files (imageDir, ['files','follow_links','recursive'], ImageFiles)
 disp_message (WindowHandle, '文件数量:'+|ImageFiles|, 'window', 20, 20, 'red', 'true')
*可以用for算子把文件一个一个打开
for fileIndex := 0 to |ImageFiles| - 1 by 1
    *从文件集合中获取指定索引的数据
    imagePath := ImageFiles[fileIndex] 
    read_image (Image1, imagePath)
    rgb1_to_gray (Image1, GrayImage1)
    *增强对比度
    Enhancement (GrayImage1, Image2, Min, Max)
    *根据模板去匹配(查找)图像
    *用于在图像中搜索已知形状模型的实例,同时允许模型在尺寸、旋转和位置方面发生变化。
    *这个操作符非常适合于在不同尺度和方向上识别目标对象。
    *Image(输入对象):输入需要找寻的图像
    *ModelID(输入控制参数1):输入模型句柄
    *AngleStart: rad(0)(输入控制参数2):找寻的起始角度,搜索角度的最小值,以弧度为单位。
    *AngleExtent: rad(360)(输入控制参数3):找寻的终止角度,搜索角度的最大值,以弧度为单位。
    *ScaleMin(输入控制参数4)0.9:找寻的最小缩放比,搜索的最小尺度因子。
    *ScaleMax (输入控制参数5)1.1:找寻的最大缩放比,搜索的最大尺度因子。
    *MinScore(输入控制参数6)0.5:最小匹配分数.
    *NumMatches (输入控制参数7)1:找寻的最大个数,匹配阈值,用于确定是否找到了模型的实例。
    *MaxOverlap (输入控制参数8)0.5:(最大重叠率)最大覆盖率还可以发现系数值。
    *SubPixel 'least_squares'(输入控制参数9):计算精度的设置,亚像素。
    *如果亚像素精度不等于` none `。
    *默认值:'least_squares'。
    *建议值:'none', 'interpolation', 'least_squares', 'least_squares_high', 'least_squares_very_high', 'max_deformation 1', 'max_deformation 2', 'max_deformation 3', 'max_deformation 4', 'max_deformation 5', 'max_deformation 6'
    *NumLevels 0(输入控制参数10):搜索时金字塔的层数.值列表:0、1、2、3、4、5、6、7、8、9、10
    *Greediness 0.9(输入控制参数11):贪婪度  一般设置为0.9 速度快 容易出现找不到的情况(0:安全但慢;1:快速,但可能错过比赛)。
    *Row(输出控制参数1):匹配位置的行坐标
    *Column(输出控制参数2):匹配位置的列坐标
    *Angle(输出控制参数3):匹配位置的角度
    *Scale(输出控制参数4):默认值Score(输出控制参数5):匹配位置的得分
    find_scaled_shape_model (Image2, ModelID, rad(0), rad(360), 0.9, 1.1, 0.3, 1, 0.5, 'least_squares', 0, 0.9, Row1, Column1, Angle, Scale, Score)
*    find_ncc_model (ImageReduced, ModelID, -0, 0, Score, 1, 0.2, 'true', ModelNumLevels, MetchedRow, MatchedColumn, MatchedAngle, MatchedScore)  
*    find_ncc_model (GrayImage1, ModelID, Angle, Angle, 0.8, 1, 0.5, 'true', 0, Row3, Column3, Angle1, Score1)
    *显示匹配(查找)到的图像
    dev_display_shape_matching_results (ModelID, 'red', Row1, Column1, Angle, 1, 1, 0)
    *设置显示的字体
    set_display_font (WindowHandle, 26, 'mono', 'true', 'false')
    disp_message (WindowHandle, '匹配坐标:'+Row1+','+Column1+'_匹配分数:'+Score+'_fileIndex:'+fileIndex, 'window', 20, 20, 'red', 'true')
    *显示十字中心
    disp_cross (WindowHandle, Row1, Column1, 50, Angle)
    
    *添加找圆工具
    create_metrology_model (MetrologyHandle)
    *向计量模型添加一个circle或圆弧类型的计量对象,并准备矩形测量区域。模型的句柄在MetrologyHandle中传递。
    *参数说明
    *MetrologyHandle (输入参数)计量模型的句柄
    *Row (输入参数)圆心或圆弧的行坐标(或Y)。
    *Column1 (输入参数)圆心或圆弧的列(或X)坐标。
    *Radius(输入参数)圆或圆弧的半径
    *MeasureLength1 (70)垂直于边界的测量区域的半长(卡尺的长度)
    *MeasureLength2 (1)测量区域与边界切线的半长度(卡尺的度度)
    *MeasureSigma (1)用于平滑的高斯函数。建议值:0.4,0.6,0.8,1.0,1.5,2.0,3.0,4.0,5.0,7.0,10.0 典型取值范围:0.4≤measuressigma最小增量:0.01,建议增量:0.1
    *MeasureThreshold (10)测量阈值,最小边缘振幅
    *GenParamName 泛型参数的名称
    *值列表:` distance_threshold `, ` end_phi `, ` instances_outside_measure_regions `, ` max_num_iterations `, ` measure_distance `, ` measure_interpolation `, ` measure_select `, ` measure_transition `, ` min_score `, ` num_instances `, ` num_measures `, ` point_order `, ` rand_seed `, ` start_phi `
    *GenParamValu 泛型参数的值
    *Index(输出参数)创建的计量对象的索引
    add_metrology_object_circle_measure (MetrologyHandle, Row1, Column1, Radius, 100, 1, 1, 10, [], [], 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 (GrayImage1, MetrologyHandle)
    *获取计量模型的测量结果
    *参数说明:
    *(输出参数)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)
    dev_set_line_width(3)
    dev_set_color('green')
    dev_display(Contour1)
    disp_message (WindowHandle, '圆中心坐标:X:'+Parameter[0]+',Y:'+Parameter[1]+'_匹配分数:'+Score+'_fileIndex:'+fileIndex, 'window', 20, 20, 'red', 'true')
    *显示十字中心
    disp_cross (WindowHandle, Parameter[0], Parameter[1], 50, Angle)
endfor

*清除模板
clear_metrology_model (MetrologyHandle)



  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

StevenChen85

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

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

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

打赏作者

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

抵扣说明:

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

余额充值