当前位置: 首页 > news >正文

【机械视觉】Halcon—【一、Halcon的介绍和基础语法】

目录

介绍

Halcon 主要特点

Halcon 典型应用场景

Halcon 脚本语言语法

1. HDevelop 中的编程语言

2. 外部语言调用 Halcon 库

3. 关键区别

4. 如何选择?

一. 基本语法规则

(1) 语句结束

(2) 注释

二. 变量与数据类型

 变量的运用

变量命名

三. 算子(函数)调用

常见算子分类

四. 控制结构

(1) 条件语句(if-else)

(2) 循环(for/while)

五. 元组

元组:类似数组,但元素类型可混合。

元组常用的操作

六.字典

1. 字典基本概念

七. 错误处理

调试技巧


介绍

Halcon 是由德国 MVTec Software GmbH 公司开发的一款 机器视觉软件,广泛应用于工业检测、医学成像、机器人引导、三维视觉等领域。它提供强大的图像处理和分析功能,支持快速开发高效的机器视觉应用。


Halcon 主要特点

  1. 强大的图像处理算法库

    • 包含 1800+ 图像处理算子,涵盖:

      • 图像预处理(滤波、增强)

      • 特征提取(边缘、角点、纹理)

      • 模式匹配(形状、轮廓、深度学习)

      • 3D视觉(立体视觉、结构光、点云处理)

      • 条码/二维码识别(OCR、条形码、DataMatrix)

  2. 跨平台支持

    • 支持 Windows、Linux、macOS,并可部署在嵌入式设备(如ARM架构)。

  3. 多语言集成

    • 提供 C++、C#、Python、VB.NET 等接口,方便与现有系统集成。

  4. 深度学习支持

    • 集成 深度学习 功能(如分类、目标检测、语义分割),支持训练和推理。

  5. 高性能计算

    • 利用 GPU加速(通过CUDA、OpenCL)和 多核CPU并行计算,适合实时处理。

  6. 灵活的授权方式

    • 提供 永久授权 和 订阅制,支持运行时免版税部署。


Halcon 典型应用场景

  • 工业检测:缺陷检测、尺寸测量、装配验证。

  • 机器人引导:定位抓取、视觉伺服。

  • 医疗影像:细胞分析、X光检测。

  • 物流:包裹分拣、条码识别。

  • 自动驾驶:车道识别、障碍物检测。


Halcon 脚本语言语法

Halcon 程序窗口(即其开发环境 HDevelop)使用 Halcon 自有的脚本语言(类似一种领域特定语言,DSL),同时支持通过其他编程语言(如 C++、C#、Python 等)调用其库函数。以下是详细说明:


1. HDevelop 中的编程语言

  • Halcon 脚本语言

    • HDevelop 是 Halcon 的集成开发环境(IDE),其默认使用 Halcon 自有的脚本语言(文件扩展名为 .hdev)。

    • 语法简洁,专为图像处理设计,直接调用 Halcon 算子(如 read_imagethresholdfind_shape_model)。

    • 示例代码

      read_image(Image, 'particle.jpg')  // 读取图像
      threshold(Image, Region, 128, 255) // 阈值分割
      connection(Region, ConnectedRegions) // 区域连通
      count_obj(ConnectedRegions, NumParticles) // 计数
    • 特点

      • 无需编译,直接运行调试。

      • 支持图形化交互(如 ROI 绘制、结果可视化)。

  • 导出为其他语言

    • HDevelop 支持将脚本自动转换为 C++、C#、VB.NET、Python 等语言,方便集成到实际项目中。
      (通过菜单 文件 -> 导出 实现)


2. 外部语言调用 Halcon 库

Halcon 的核心功能可以通过以下语言调用(需安装 Halcon 库和对应接口):

  • C++:通过 halconcpp 库。

  • C#:通过 halcondotnet 库。

  • Python:通过 python-halcon 模块(如 import halcon)。

  • 其他:VB.NET、Java(通过 JNI)等。

Python 示例

import halcon as ha# 调用Halcon算子
image = ha.read_image("particle.jpg")
region = ha.threshold(image, 128, 255)
num_particles = ha.count_obj(region)
print("粒子数量:", num_particles)

3. 关键区别

场景使用的语言说明
HDevelop 快速原型开发Halcon 脚本语言 (.hdev)适合算法调试、可视化交互。
实际项目集成C++/C#/Python 等通过 Halcon 库调用,需导出代码。
嵌入式部署C/C++(Runtime 环境)需购买 Halcon 运行时授权。

4. 如何选择?

  • 初学者/算法验证:直接用 HDevelop 脚本语言,快速测试算子。

  • 工业项目:导出为 C++/C# 嵌入到现有系统。

  • 深度学习结合:Python + Halcon 库(如训练模型后部署)。


一. 基本语法规则

(1) 语句结束

  • 每行一条语句,无需分号(除非一行写多条语句,用分号隔开)。

    read_image(Image, 'particle.jpg')  // 正确
    threshold(Image, Region, 128, 255); connection(Region, ConnectedRegions) // 分号分隔

(2) 注释

  • 单行注释:*


二. 变量与数据类型

Halcon 变量类型自动推断,常见类型包括:

类型示例说明
图像(Image)ImageGrayImage单通道/多通道图像矩阵。
区域(Region)RegionConnectedRegions二值化后的像素集合。
轮廓(XLD)ContoursEdges亚像素精度的边缘轮廓。
数值(Number)WidthArea整数或浮点数。
字符串(String)FileNameModelName文本数据。

示例

read_image(Image, 'particle.jpg')       // Image 是图像类型变量
threshold(Image, Region, 128, 255)      // Region 是区域类型变量
area_center(Region, Area, Row, Column)  // Area, Row, Column 是数值类型

 变量的运用

  • 在halcon中使用:=进行变量赋值
  • * 整形
    a:=10* 浮点类型
    b:=10.1* 把整形转为浮点类型
    c:=real(a)* 把浮点类型转成整型
    d:=int(b)* 向下求整
    e:=floor(b)* 向上求整
    f:=ceil(b)* 四舍五入
    g:=round(b)* 字符串类型
    h:='90'
    * 转成数字类型
    i:=number(h)* 转成字符串
    i:=a+''

变量命名

  • 变量名以字母开头,可包含字母、数字、下划线。

  • 区分大小写Image 和 image 不同)。

  • 无需显式声明类型(动态类型)。


三. 算子(函数)调用

Halcon 的核心功能通过算子(Operators)实现,语法为:

算子名(输入参数1, 输入参数2, ..., 输出参数1, 输出参数2, ...)

常见算子分类

类别示例算子作用
图像输入/输出read_imagewrite_image读取/保存图像。
预处理gauss_filtermedian_image滤波、去噪。
分割thresholdregiongrowing阈值分割、区域生长。
特征提取edges_sub_pixfind_shape_model边缘检测、模板匹配。
数学运算add_imagemult_image图像加减乘除。

示例

read_image(Image, 'chip.png')              // 读取图像
rgb1_to_gray(Image, GrayImage)             // 转为灰度图
threshold(GrayImage, Region, 0, 100)       // 阈值分割
connection(Region, ConnectedRegions)       // 区域连通
count_obj(ConnectedRegions, NumChips)      // 计数

四. 控制结构

(1) 条件语句(if-else)

if (条件)// 语句块
elif (条件)// 语句块
else// 语句块
endif

示例

* 基本if语句
if (Area > 100)disp_message('Large object found', 'window', 12, 12, 'black', 'true')
endif* if-else结构
if (Score > 0.8)disp_message('Match found', 'window', 12, 12, 'green', 'true')
elsedisp_message('No match', 'window', 12, 12, 'red', 'true')
endif* 多条件判断
if (Area > 100 and Circularity > 0.9)classification := 'Circle'
elif (Area > 50 and Area <= 100)classification := 'Small Object'
elseclassification := 'Unknown'
endif

(2) 循环(for/while)

  • for 循环

    for Index := 1 to 10 by 1// 循环体
    endfor
  • while 循环

    while (条件)// 循环体
    endwhile

示例

for i := 1 to 5 by 1disp_message('当前次数:' + i, 'window', 20*i, 12, 'black', 'true')
endfor

五. 元组

  • 元组:类似数组,但元素类型可混合。
    Tuple := ['apple', 123, 3.14, true]
  • 元组常用的操作
* 1 创建元组 -元素为整形数字
nums:=[1,2,3,4,5,6,7]* 2 获取元组的元素 通过索引值
x:=nums[2]* 3 获取元组的长度 | |
len:=|nums|* 4 遍历元组
for Index := 0 to |nums|-1 by 1num:=nums[Index]
endfor* 5 批量创建元组的元素
nums1:=[0:10]* 6 [a:b:c] 元素范围是a到c,每次递增b
nums2:=[0:3:9]
* 也可以反着来
nums3:=[9:-3:0] * 8 可以把变量重新定义成元组
str:='a'
str[0,1,2]:='ac'* 9 元组合并
list1:=[1,2,3]
list2:=['a','b','c']
list3:=[list1,list2]* 10 元组并集: 去掉重复的元素
* 参数1 要合并的元组
* 参数2 要合并的元素
* 参数3 合并之后元组
tuple_union(list3,num,Union)* 11 元组的交集: 获取两者之间相同的
tuple_intersection (list1,nums,val1)* 12 元组的插入元素
tuple_insert(list1,2,list2,val2)* 13 从元组中截取元素,从索引值为1开始截取,截取长度为3
list8:=list3[1:3]* 14 移除元素 指定位置移除
list8:= remove(list8,2)* 15 获取指定位置元素
list8:=subset(list8,1)* 16 绝对值
tuple_abs (-50,ABs)*嵌套数组
* a5 有4个元素,分别为1 2 3 [4,5,6]
a5:=[1,2,3,[4,5,6]]
* 按照嵌套元组的方式取出
c1:=a5[3]* 把元组所有的元素加1操作
A6:= a5+1* 把元组所有的元素乘以操作
A7:= a5*5* 把元组转成字符串结构
cc:=['1','2','3']
tuple_join (cc,',',JoinedStrings)* 批量赋值
A8[0,1,3]:=99* 随机0-1之间的数字
tuple_rand(10,Rand)

六.字典

1. 字典基本概念

字典是Halcon 20.11引入的高级数据结构,用于键值对存储:

* 1 创建字典   字典名称为aaa
create_dict(aaa)
* 2 给字典设置键值对
* 参数1 要设置的字典
* 参数2 键
* 参数3 值
set_dict_tuple(aaa,'v',10)
set_dict_tuple(aaa,'v2','hello')
set_dict_tuple(aaa,'v3',[1,2,3])
* 3 设置键值对(值为对象)
* 参数1 添加的对象
* 参数2 添加的目标字典
* 参数3 键
set_dict_object(rectangle,aaa,'v4')* 如果俩个键一样,去替换之前值
set_dict_object (rectangle1,aaa,'v4')
* 4 复制字典
copy_dict(aaa,[],[],bbb)
* 5 获取字典中的值
* 参数1 输出的对象
* 参数2 字典
* 参数3 键
get_dict_object(object,bbb,'v4')
* 6 获取字典值元组类型
* 参数1 目标字典
* 参数2 获取值的键
* 参数3 输出值
get_dict_tuple (bbb,'v3',Tuple)
* 7 获取字典当中所有的键存储在一个元组里面
* 参数1 目标字典
* 参数2 keys 获取字典里面所有的key
* 参数3 可选参数
* 参数4 输出的元组
get_dict_param(bbb,'keys',[],GenParamValue)
* 8 删除键值对
remove_dict_key (bbb,'v4')

七. 错误处理

使用 try-catch 捕获异常:

tryread_image(Image, 'nonexist.jpg')  // 可能失败
catch (Exception)disp_message('错误:文件不存在!', 'window', 12, 12, 'red', 'true')
endtry

调试技巧

变量窗口:HDevelop 中可实时查看变量值。

单步执行:按 F6 逐行调试。

可视化:右键算子可显示图像/区域/轮廓。


本文主要介绍一些基础语法,下期全面讲述算子!

相关文章:

  • AdGuard解锁高级版(Nightly)_v4.10.36 安卓去除手机APP广告
  • 宏山激光韩国釜山开放日圆满举行,服务本地化再提速
  • 路由协议RIP配置与分析
  • 机器人强化学习入门学习笔记(三)
  • 中国软件行业 2024 年度分析报告
  • MyBatis 中 parameterType 属性
  • el-form表单规则验证
  • 机器学习 Day1
  • G1人形机器人软硬件组成
  • 什么是HTTP
  • [SWPUCTF 2024 秋季新生赛]ret2libc也阴嘛?(NSSCTF)
  • 公司内网本地的SVN没有公网IP地址,在家外网也能远程访问SVN服务!
  • 1.2.1+1.2.2计算机硬件的基本组成
  • Vue3中的TSX:用函数式思维构建现代组件的实践指南
  • 初识main函数
  • 深度学习模型可视化:Netron的安装和使用
  • Spring源码编译
  • Ensp --四路由练习
  • 日拱一卒【6】
  • 【agent】简历信息提取智能体
  • 网站不被收录/如何提升网站seo排名
  • 哪些网站可以做免费答题/南昌网优化seo公司
  • 零基础学平面设计怎么学/百度关键词优化有效果吗
  • 宁波seo网站服务/软文代发代理
  • 中山高端企业网站设计/今日头条荆州新闻
  • 杭州有哪些做网站的公司好/深圳百度关键