halcon 检测直线
图像:
代码:
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*加载图像
read_image (Image,'G:/halcon练习用/MemoryStick.jpg')
get_image_size (Image, Width, Height)
*界面操作得到测量区域,转到视野上画线
draw_line (WindowHandle, Row1, Column1, Row2, Column2)
shapePararm:=[Row1,Column1,Row2,Column2]
*创建直线模型
create_metrology_model (MetrologyHandle)
*设置直线模型图像大小,即需要被检测的图像大小
set_metrology_model_image_size (MetrologyHandle, Width, Height)
*添加线模型通用测量对象 sharp参数设置为line Index:输出创建测量对象的索引值
add_metrology_object_generic (MetrologyHandle, 'line', shapePararm, 200, 10, 1, 10, [], [], Index)
*找线方式,暗 / 亮(positive)或亮 / 暗(negative)边缘,'uniform' 表示同时检测并分别拟合
set_metrology_object_param (MetrologyHandle, 'all','measure_transition', 'all')
*设置卡尺数量
set_metrology_object_param (MetrologyHandle, 'all', 'num_measures', 20)
*拟合数,每个计量对象最多拟合的有效实例数,达到后停止拟合
set_metrology_object_param (MetrologyHandle, 'all', 'num_instances', 6)
*高斯平滑系数,值越大边缘越清晰,越不容易找到边缘,值越小,干扰边缘越多
set_metrology_object_param (MetrologyHandle, 'all', 'measure_sigma', 2)
*测量双立方插入值,区别于bilinear双线性
set_metrology_object_param (MetrologyHandle, 'all', 'measure_interpolation', 'bicubic')
*边缘振幅最小值,最小边缘幅度越大,要求找到的边缘越锐利(灰度变化明显),反而越不容易找到边缘
set_metrology_object_param (MetrologyHandle, 'all', 'measure_threshold', 20)
*取值 all,first,best,last
set_metrology_object_param (MetrologyHandle, 'all', 'measure_select', 'all')
*判定有效拟合实例的最低分数(检测边缘数 / 最大测量区域数)
set_metrology_object_param (MetrologyHandle, 'all', 'min_score', 0.4)*设置卡尺长,实际长2000*2
set_metrology_object_param (MetrologyHandle, 'all', 'measure_length1', 2000)
*设置卡尺宽,实际宽10*2
set_metrology_object_param (MetrologyHandle, 'all', 'measure_length2', 10)
*开始找边缘
apply_metrology_model (Image, MetrologyHandle)
*获取模型的计量区域和边缘结果
get_metrology_object_measures (Contours, MetrologyHandle, 'all', 'all', Row, Column)
*把所有点显示出来
gen_cross_contour_xld (Cross, Row, Column, 6, 0.785398)
*得到线的起点坐标并显示出来
get_metrology_object_result (MetrologyHandle, 0, 'all', 'result_type', 'all_param', Parameter)
*获模型计量对象的结果轮廓
get_metrology_object_result_contour (Contour, MetrologyHandle, 0, 'all', 1.5)select_obj(Contour, ObjectSelected1, 1)
select_obj(Contour, ObjectSelected2, 2)
select_obj(Contour, ObjectSelected3, 3)
*释放测量句柄,很重要否则导入C#代码运行没多久就会崩溃程序
clear_metrology_object (MetrologyHandle, 'all')
运行效果:
调整参数可控制检测数量 :
num_instances | 控制检测的直线数量(例如设为2则最多返回2条最优直线) |
min_score | 分数阈值(0~1),越高则直线质量要求越严格 |
measure_length1 | 测量区域的长度(影响边缘点数量) |
measure_sigma | 高斯平滑系数,越大抗噪性越强 |
图中后三个对象既是检测出的图像;
参考:Halcon尺寸测量之二维计量模型(create_metrology_model)_halcon设置卡尺个数-CSDN博客