基本思路:
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)