halcon测量:用卡尺找边

一、首先把整体思路列出来:
1、读取一张图像
2、创建一个测量句柄
3、添加测量模型。本次找边,所以要添加一个线“Line”的模型
4、设置相关测量参数。比如:卡尺垂直于边的长度,卡尺的宽度,卡尺的个数,保留的卡尺个数,边缘最低对比度等。
5、开始找边
6、将找到的边界结果显示,同时获得每个卡尺找到的点坐标。

二、代码:
1、先找一张图像:
这里写图片描述
2、在halcon里输入代码:

*读图
read_image (Image, 'C:/Users/HS/Desktop/20171206114857.bmp')
get_image_size (Image, Width, Height)

*在我们要检的边界上画线
draw_line (200000, Row1, Column1, Row2, Column2)
shapeParam:= [Row1,Column1,Row2,Column2]

*创建句柄
create_metrology_model (MetrologyHandle)
set_metrology_model_image_size (MetrologyHandle, Width, Height)

*添加线模型
add_metrology_object_generic (MetrologyHandle, 'line', shapeParam, 20, 5, 1, 30, [], [], Index)

*设置参数,这里根据自己需求设置,这一坨用的都是同一个算子
set_metrology_object_param (MetrologyHandle, 'all', 'measure_transition', 'negative')
set_metrology_object_param (MetrologyHandle, 'all', 'num_measures',50)
set_metrology_object_param (MetrologyHandle, 'all', 'num_instances', 40)
set_metrology_object_param (MetrologyHandle, 'all', 'measure_sigma', 1)
set_metrology_object_param (MetrologyHandle, 'all', 'measure_length1', 80)
set_metrology_object_param (MetrologyHandle, 'all', 'measure_length2', 1)
set_metrology_object_param (MetrologyHandle, 'all', 'measure_threshold',50)
set_metrology_object_param (MetrologyHandle, 'all', 'measure_interpolation', 'bicubic')
set_metrology_object_param (MetrologyHandle, 'all', 'measure_select', 'all')
set_metrology_object_param (MetrologyHandle, 'all', 'min_score', 0.7)

*开始找边缘,顺便把边缘上卡尺找到的所有点坐标输出在ROW,Column里面(数组形式)
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, 'all', 'all', 'result_type', 'all_param', Parameter)
get_metrology_object_result_contour (Contour, MetrologyHandle, 'all', 'all', 1.5)

/释放测量句柄
clear_metrology_model (MetrologyHandle)

三、操作过程:
1、读图
这里写图片描述
2、画线
这里写图片描述
3、找到边界
这里写图片描述
4、查看边界
这里写图片描述

### 使用 Halcon 实现卡尺工具进行缘检测或尺寸测量 #### 创建并配置测量模型 为了使用 Halcon卡尺功能,首先需要创建一个测量模型。此操作可以通过 `create_metrology_model` 函数完成。 ```cpp // 定义测量区域参数 double Row, Column; Row = 200; // 测量区中心行坐标 Column = 300; // 测量区中心列坐标 double Phi = 0; // 测量区旋转角度 (弧度制) double Width = 100; // 测量区宽度 double Height = 80; // 测量区高度 // 设置卡尺参数 int NumCalipers = 5; // 卡尺数量 double Distance = 20; // 各个卡尺间的间距(像素) // 创建测量模型 Hlong ModelID; create_metrology_model(Row, Column, Phi, Width, Height, 'caliper', NumCalipers, Distance, &ModelID); ``` 上述代码片段定义了一个位于图像特定位置的测量窗口,并设置了该区域内使用的卡尺数目及其间隔距离[^1]。 #### 添加特征到测量模型 接着向已建立好的测量模型中加入具体的测量任务,比如直线缘检测: ```cpp add_metrology_caliper(ModelID, "edge", 90, 7, 1, 1); // 参数解释:"edge"表示执行缘检测;90为方向角; // 7是用于寻界的扫描线数;最后两个1分别指定了最小和最大灰度变化阈值。 ``` 这段代码说明了如何指定要查的对象界的方向以及敏感程度等细节设置[^3]。 #### 执行测量过程 当一切准备就绪之后,则可以调用相应函数来实际运行这些设定,在输入图象上实施测量动作: ```cpp execute_metrology_object(Image, ModelID); get_metrology_contour(metrologyHandle, Contours); dev_display(Contours); // 显示轮廓结果以便验证准确性 ``` 这里展示了怎样启动整个流程并对所得数据做初步可视化处理的方法[^2]。 #### 结果获取与分析 最终可以从生成的结果集中提取所需的信息,例如计算两平行线间距离或是求取某些形状的角度特性等等。 ```cpp get_metrology_result_caliper(ModelID, ResultIDs, Positions, Angles, Distances); for(int i=0;i<Distances.Length();i++) { cout << "Distance between edges at position ["<<Positions[i]<<"] is "<<Distances[i]<<" pixels."<<endl; } ``` 以上部分介绍了读取由卡尺测得的具体数值的方式,包括但不限于各处的距离信息等。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值