Halcon学习笔记

在这里插入图片描述

一.简介

  1. Halcon和OpenCV在工业应用中的区别:
  • OpenCV的效率没Halcon高;
  • OpenCV的开发精度没有Halcon高。
  1. 关于HALCON:
    HALCON是MVTec公司的一款软件产品。
    它是一款风靡全球的、用于机器视觉的标准软件,并带有HDevelop集成开发环境。
    使用HALCON可以节省成本并缩短产品上市时间(相当于算法细节不用考虑了,会调用就行)。

二.相机和成像知识

1.成像原理

相机输出图像的过程:
首先物体的光进入镜头成像后,图像是打在感光芯片上的。芯片上有许多微小颗粒的传感器,每个(或每几个)传感器都会将光线变化转换为电信号变化,输出到外部系统。所以图像的每个像素点,实际上是对应相机的感光传感器的,两者间就像有通道连接一样,传感器对外界光线的变化导致像素变化,组合到图像上就是图像的变化。
黑白图像,可能只需要对应一个灰度通道。彩色的对应多个通道,然后根据色彩比例显示结果。

2.工业相机

  1. 工业相机、工控机这些电子产品,相对于日常电子产品,最大的区别就是稳定、抗干扰能力强。好多时候工业产品需要在极端的环境下长时间稳定地进行工作。而工业相机相比于传统民用相机,它具有更高的图像稳定性、高传输能力和高抗干扰能力。
    本质功能就是将光信号转变成有序的电信号。
  2. 工业相机知识拓展:工业相机及相关配件选型
  3. 如下分别是公司所用的2款相机型号,华睿的面阵相机、dasla的线扫相机(也叫线阵相机)的参数截图:
    在这里插入图片描述
    在这里插入图片描述

三.视觉小知识

1. 阈(yu)值化

阈值化是一种图像分割的方法,用于从一幅图片里面提取我们需要的部分。比如分离图像的前景和背景。其基本原理就是利用一幅图像各个部分之间的像素差异,通过设定一个灰度值的阈值,截取出我们需要的部分 。

2.相机内参、相机外参

内参是描述相机内部属性的参数,包括焦距、主点(光学中心)坐标、畸变系数等。内参通常在相机标定时确定,因为它们通常对于特定相机型号是固定的,不随时间变化。一旦相机内参被确定,它们在相机的使用过程中通常是保持不变的。

外参是描述相机在世界坐标系中的位置和姿态的参数,通常包括旋转矩阵和平移向量。外参在不同的相机位置或拍摄时刻可能会发生变化。例如,在立体视觉中,如果您有两个相机,那么它们的相对位置和方向会在每次移动相机时发生变化,从而导致外参的变化。

如果相机不发生位置和方向的变化,比如相机固定在一个固定位置,那么外参在很长一段时间内可能保持不变。然而,如果相机的位置或方向发生变化,例如移动相机或更改拍摄角度,外参会随之变化。

3.标定和标定板

1.标定

标定的本质是建立一个测量的标准系统。
在标定的时候,摄像机通过带有固定间距图案阵列的平板(即标定板)拍摄图像,然后经过标定算法计算,得出拍摄图像的几何模型,进而得到高精度的测量和重建结果,最后通过相关算法校正镜头畸变,从而提高机器视觉应用中图像测量、摄影测量的精度。
通过像机标定我们可以知道些什么?

  1. 外参数矩阵。告诉你现实世界点(世界坐标)是怎样经过旋转和平移,然后落到另一个现实世界点(摄像机坐标)上。
  2. 内参数矩阵。告诉你上述那个点在1的基础上,是如何继续经过摄像机的镜头、并通过针孔成像和电子转化而成为像素点的。
  3. 畸变矩阵。告诉你为什么上面那个像素点并没有落在理论计算该落在的位置上,还产生了一定的偏移和变形。

上述3点的每一个转换,都有已经有成熟的数学描述,通过计算我们完全可以精确地重现现实世界的任意一个点到其数字图像只上对应像素点的投影过程。

2.标定板

标定板就是带有固定间距图案阵列的平板。

4.四个坐标系

在这里插入图片描述

相机成像过程涉及到四个坐标系的变换,变换关系如下:
(U,V,W)是世界坐标系,经过刚体变换(如:旋转、平移)后变为了相机坐标系,再次经过透视投影转变为了图像坐标系,最后经仿射变换转换为了像素坐标系(u,v)。转换关系如下(Z是尺度因子):
在这里插入图片描述

1.世界坐标系(参考坐标系)

世界坐标系就是物体在真实世界中的坐标,比如黑白棋盘格的世界坐标系原点定在第一个棋盘格的顶点,Xw,Yw,Zw互相垂直,Zw方向就是垂直于棋盘格面板的方向。可见世界坐标系是随着物体的大小和位置变化的,单位是长度单位。只要棋盘格的大小决定了,无论板子怎么动,棋盘格角点坐标一般就不再变动(因为是相对于世界坐标系原点的位置不变),且认为是Zw=0。

刚体变换(regidbody motion):三维空间中, 当物体不发生形变时,对一个几何物体作旋转, 平移的运动,称之为刚体变换。

在这里插入图片描述

2.摄像机坐标系

它是与拍摄物体发生联系的桥头堡,世界坐标系下的物体需先经历刚体变化转到摄像机坐标系(旋转和平移),然后再和图像坐标系发生关系。它是图像坐标与世界坐标之间发生关系的纽带,沟通了世界上最远的距离。
相机坐标系以光心为相机坐标系的原点,以平行于图像的x和y方向为Xc轴和Yc轴,Zc轴和光轴平行,Xc,Yc,Zc互相垂直,单位是长度单位。

3.图像物理坐标系

图像物理坐标系以主光轴和图像平面交点为坐标原点,x和y方向如图所示,单位是长度单位。

4.像素坐标系

图像像素坐标系以图像的顶点为坐标原点,u和v方向平行于x和y方向,单位是以像素计。

5.腐蚀和膨胀

1.膨胀

膨胀主要用于扩大区域像素,使边缘像素连接在一起。

2.腐蚀

腐蚀主要用于减小区域像素,使边缘像素断开。

6.拟合

用一个参数模型来表示特征,说的直白点就是把平面上一系列的点,用一条光滑的曲线连接起来。简单的特征描述就是线性边缘可以使用线性模型表示,圆形等等,复杂一些的比如车辆的完成轮廓。

7.亚像素

例如两个感官原件上的像素之间有4.5um的间距,宏观上它们是连在一起的,微观上它们之间还有无数微小的东西存在,这些存在于两个实际物理像素之间的像素,就被称为“亚像素”。亚像素实际上应该是存在的,只是缺少更小的传感器将其检测出来而已,因此只能在软件上将其近似计算出来。

亚像素可以表示为如下图所示,每四个红色点围成的矩形区域为实际原件上的像素点,黑色点为亚像素点:
在这里插入图片描述

8.Halcon中基于形状的模板匹配过程

Halcon中一个完整的模板匹配过程如下:

读取并显示图像;
确定模板ROI及检测ROI;
创建模型;
匹配模板;
ROI仿射变换,得到ROI位置。

四.Halcon安装相关

1.报错解决方案

  1. 安装完halcon13软件并且替换了license后,启动hdevelop软件报错,报错信息如下:
    在这里插入图片描述
    解决方案:将破解版的halcon.dll放入路径如下即可:
    在这里插入图片描述

五.Halcon入门

1.C#和Halcon联合编程

可以有2种方式写halcon算法代码:

  • 方法1:在hdevelop里将算子导出为C#版本的代码类,然后集成在VS的项目中。
  • 方法2:直接在VS里面通过halcon的dll调用相应API。
    但是第一种方方法生成的代码不是很直观,大家往往采用第二种方法来联合编程。

2.HALCON算子

HALCON库中的任何功能,都是通过算子来完成的。当前版本(笔者用的18.1)有超过2000个算子。大部分算子内部包含多个函数,可以通过传参去灵活调用它们。所有算子的完整列表可以在HDevelop的算子对话框或参考手册中找到。

3.常用到的数据类型

HTuple 用于控制参数;
HObject 用于图像数据;
HWindowControl 一般用于项目中用于输出窗口;

4.变量名

HDevleop导出的代码,为所有本地图像变量增加了前缀 ho_ ,为控制变量增加了前缀 hv_ ,以避免与保留词发生冲突。

5.异常处理

在HDevelop中,每个异常通常都会导致程序停止,并在对话框窗口中报告错误消息。这点在C#中可能没啥用。在C#中处理这个问题的标准方法是使用 try/catch 机制。这允许访问异常的原因并继续相应的操作。因此,对于包含错误处理 ((dev_)set_check(“~give_error”)) 的HDevelop程序,相应的代码会自动被包含。假设HALCON错误机制被关闭,则每个算子调用都包含在 try块(后面接着catch块)中。后者(指catch块)会处理异常,并将相应的HALCON错误号分配给由 dev_error_var 激活的错误变量 或 本地错误变量。

6.内存管理

在导出的C#代码中,每个图像对象都由.NET HObject 对象表示。从.NET GC的角度来看,.NET HObject对象相当小。因此,它可能不会从内存中被回收,尽管底层的图像对象(例如,image)实际可能占有很大的内存。为了避免这种情况引起的内存泄漏,在导出的代码中,每个图像对象在被分配一个新值之前都被显式删除。例如:
在这里插入图片描述

8.一些常用算子

  1. dev_update_window (‘off’),会关闭图像变量向图形窗口的自动输出(设置为’off’,还有一点好处是当你选中图像变量,图形窗口中只会显示选中的图像变量,方便观察,不然需要手动再选一次 显示/清除)。
  2. dev_close_window(),关闭活动的图形窗口。
  3. dev_open_window (0, 0, 728, 512, ‘black’, WindowID),打开一个728×512的黑色背景窗口。
  4. dev_display(), 显式输出读取的图像到图形窗口。
  5. set_display_font (WindowID, 14, ‘mono’, ‘true’, ‘false’)和disp_continue_message (WindowID, ‘black’, ‘true’),看似是系统算子,但实际上是预定义好的外部函数。效果就是在图像下方显示文字。
  6. stop() ,暂停程序执行。
  7. threshold(),阈值化。
  8. read_image(),读取图片。
  9. shape_trans (),它可以变换区域的形状。
  10. reduce_domain (),从原图中裁剪出矩形区域的图像。
  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值