Halcon 机器视觉案例 之 药剂液面高度测量
第二篇 机器视觉案例 之 药剂液面高度测量
文章目录
- 第二篇 机器视觉案例 之 药剂液面高度测量
- 1.案例要求
- 2.实现思路
- 2.1获得液面的位置:
- 2.1.1 获得每支药剂的位置坐标
- 2.1.2 根据药剂的横坐标设置卡尺工具助手找到每一个液面的位置
- 2.2 获得基准线的位置:
- 2.3 导入点与线测得距离
- 2.4 显示测量结果
- 3.实现效果
- 4. 算子
- 拓展
1.案例要求
- 测量每一支药剂的液面高度
2.实现思路
- 测量液面高度需要获得药剂液面的位置与一条基准线,通过测量点到线距离公式可以测得液面的高度
2.1获得液面的位置:
2.1.1 获得每支药剂的位置坐标
-
对图像进行预处理操作,使得液面的特征更加明显,便于模板查找、
- 均衡操作可以增加图像的对比度,使图像的柱状线性化
- 使用算子
equ_histo_image (Image, ImageEquHisto)
- 均衡后的图像:
-
画一个区域并根据区域创建模板
- 创建区域
gen_rectangle1 (Rectangle, 218, 281, 312, 328)
- 裁剪区域
reduce_domain (ImageEquHisto, Rectangle, ImageReduced)
- 创建模板
create_shape_model (ImageReduced, 'auto', rad(-45), rad(45), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
- 创建区域
-
查找模板并获得模板结果,在模板结果中获取匹配个数以及坐标
- 查找模板
- find_shape_model (ImageEquHisto1, ModelID, rad(-45), rad(40), 0.5, 0, 0.5, ‘least_squares’, 0, 0.9, Row, Column, Angle, Score)
- 获得模板匹配结果
- dev_display_shape_matching_results (ModelID, ‘red’, Row, Column, Angle, 1, 1, 0)
tuple_length (Row, Length)
- dev_display_shape_matching_results (ModelID, ‘red’, Row, Column, Angle, 1, 1, 0)
- 获得匹配个数(根据坐标数组长度)
tuple_length (Row, Length)
- 查找模板
2.1.2 根据药剂的横坐标设置卡尺工具助手找到每一个液面的位置
- 创建一个卡尺助手
- 画线 —— 给卡尺设置长度
- 设置边缘幅度
- 设置卡尺的参数
- 插入代码
- 设置卡尺的横坐标
- 卡尺检测结果
measure_pos (Image, MsrHandle_Measure_02_0, 1, AmplitudeThreshold, 'all', 'first', Row_Measure_02_0, Column_Measure_02_0, Amplitude_Measure_02_0, Distance_Measure_02_0)
- 获得液面坐标
- (Row_Measure_02_0, Column_Measure_02_0)
2.2 获得基准线的位置:
- 画线算子
- draw_line (WindowHandle, Row1, Column1, Row2, Column2)
- 获得坐标后设置固定值
- gen_region_line (RegionLines, 301, -4.5, 297, 632.5)
2.3 导入点与线测得距离
distance_pl (Row_Measure_02_0, Column_Measure_02_0, 301, -4.5, 297, 632.5, Distance)
2.4 显示测量结果
- 将每一个药剂测量的结果与坐标拼接成数组
tuple_concat (distances, distance, distances)
tuple_concat (rows, Row_Measure_02_0-10, rows)
tuple_concat (columns, Column_Measure_02_0-30, columns)
- 设置字体格式以及输出字
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
disp_message (WindowHandle, distances, 'window',rows, columns, 'red', 'false')
3.实现效果
4. 算子
- 创建一个匹配轮廓模型
create_shape_model(Template::NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metric, Contrast,MinContrast:ModelID)
- 参数:
- Template:输入的图像模板名称; 用来产生模型的图像;
- NumLevels:最大的金字塔(分析法)层数,
- AngleExtent:输入匹配时的角度范围;
- AngleStep:输入匹配旋转角度的步长
- Optimization:设置模板优化和模板创建方法
- Metric:设置匹配方法
- Contras:设置对比度
- MinContrast:输入图像中匹配物体的最小差别(对比度)
- ModelID:输出模型句柄;
- 在一个图像中找出一个最佳匹配轮廓
find_shape_model(Image::ModelID, AngleStart, AngleExtent,MinScore, NumMatches, MaxOverlap, SubPixel,NumLevels, Greediness: Row, Column, Angle, Score)
- 参数:
- Image:输入匹配模型的图像 (byte/uint2) ;
- ModelID:输入模型句柄;
- AngleStart:输入匹配时的起始角度;
- AngleExtent:输入匹配时的角度范围;
- MinScore:输入最小的匹配值(匹配质量) , 考虑到模板的一半被遮挡, 默认0.5
- NumMatches:在图像上找到模板的最大个数,默认1个
- MaxOverlap :定义了找到的两个目标区域最多重叠的系数
- MaxOverla p=1, 所有找到的目标区域都要返回。
- SubPixel :确定找到的目标是否使用亚像素精度提取
- NumLevels:搜索时使用的金字塔层数
- Greediness 搜索时的“贪婪程度
- Row:输出目标外形轮廓的y值坐标(轮廓中心位置) ;
- Column:输出目标外形轮廓的x坐标(轮廓中心位置) ;
- Angle:输出目标物体模型旋转后对应的角度;
- ScaleR:输出y值方向的比例大小;
- ScaleC:输出x值方向的比例大小;
- Score:输出目标物体的匹配值;
- 均衡图像,图像的柱状线性化
- equ_histo_image(Image:ImageEquHisto:😃
- 参数:
- Image :输入多通道图像 (byte/uint2);
- ImageEquHisto: 输出图像的柱状线性化图像 (byte/uint2);
- 合并两个元组
tuple_concat(::T1, T2: Concat)
- 参数:
- T1:输入元组1;
- T2:输入元组2;
- Concat:合并两个元组为1个新元组;
拓展
- 本案例还可以使用VisionPro完成,参考文章:VisionPro 机器视觉案例 之 药剂液面高度检测
- 区别在于VisonPro的控件可视化程度更高,Halcon的算子更快捷,可以两篇文章对比学习