Halcon 机器视觉案例 之 药剂液面高度测量

第二篇 机器视觉案例 之 药剂液面高度测量

文章目录

  • [第二篇 机器视觉案例 之 药剂液面高度测量](#第二篇 机器视觉案例 之 药剂液面高度测量)
    • 1.案例要求
    • 2.实现思路
      • 2.1获得液面的位置:
        • [2.1.1 获得每支药剂的位置坐标](#2.1.1 获得每支药剂的位置坐标)
        • [2.1.2 根据药剂的横坐标设置卡尺工具助手找到每一个液面的位置](#2.1.2 根据药剂的横坐标设置卡尺工具助手找到每一个液面的位置)
      • [2.2 获得基准线的位置:](#2.2 获得基准线的位置:)
      • [2.3 导入点与线测得距离](#2.3 导入点与线测得距离)
      • [2.4 显示测量结果](#2.4 显示测量结果)
    • 3.实现效果
    • [4. 算子](#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)
    • 获得匹配个数(根据坐标数组长度)
      • 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个新元组;

拓展

相关推荐
安冬的码畜日常3 分钟前
【Vim Masterclass 笔记25】S10L45:Vim 多窗口的常用操作方法及相关注意事项
笔记·vim·自学笔记·vim多窗口·vim子窗口·vim水平分割·vim垂直分割
m0_548049704 分钟前
SpringCloud学习笔记【尚硅谷2024版】
笔记·学习·spring cloud
我是聪明的懒大王懒洋洋7 分钟前
dl学习笔记:(7)完整神经网络流程
笔记·神经网络·学习
USER_A00131 分钟前
JavaScript笔记进阶篇01——作用域、箭头函数、解构赋值
javascript·笔记
次元工程师!2 小时前
JAVA-IO模型的理解(BIO、NIO)
java·笔记·学习·nio·bio·io模型
mit6.8242 小时前
[实现Rpc] 项目设计 | 服务端模块划分 | rpc | topic | server
网络·c++·笔记·rpc·架构
Pandaconda4 小时前
【新人系列】Python 入门(二十八):常用标准库 - 上
开发语言·经验分享·笔记·后端·python·面试·标准库
ThisIsClark5 小时前
【gopher的java学习笔记】Java中Service与Mapper的关系详解
java·笔记·学习
高精度计算机视觉6 小时前
如何用vscode断点调试Vue.js的项目
笔记
就爱学编程7 小时前
C语言编程笔记:文件处理的艺术
c语言·开发语言·笔记