halcon视觉学习-基于halcon

halcon简介

halcon在工业视觉中属于很棒的。
学习halcon需要具备 软件、图像处理、光学 三个部分的知识。图像处理一般的套路就是 获取图像>分割区域>特征提取

halcon界面

halcon文件所在位置:
Users / Shared / Library / Application Support / halcon 13 / example / hdevelop/
我们做项目的图片路径就在 example/images/ 里面

一、嵌入式工业读码器

包括DM码、QR码、vericode码


二、 图像采集的原理,以及准确成像的专业方法

  • 1.2 相机的接口类型
    USB、IEEE1394、Gigabit Ethernet(千兆网)

  • 1.3 小试halcon
    首先,安装相机驱动(一些品牌halcon自带驱动),比如balser安装pylon驱动,打开halcon界面,选择助手,打开新的Image Acquisition,选择资源,自动检测接口,然后点击右边的按钮选择一个接口,选择后把选项 资源 切换到 连接,再点击连接框里面的一个连接,表示相机和软件建立连接,再点击 实时,相机实时采集数据了。

三、 Blob分析与形态学

Blob
区域是一种非常重要的概念。
区域是blobs这一数据类型在halcon中的一种贴切的表达形式。
采集图像-区域分割,最后通过特征(如圆度、面积、矩形度等)筛选,这一过程被称为Blob(binary large objects)分析。

形态学
形态学是对区域大小调整的一种非常重要的方法和概念。形态学包括「开运算、闭运算、腐蚀、膨胀」
形态学需要引入一个新的概念,即结构元素。

  • 开运算可以去除小区域以及原区域中突出的细节部分;
  • 闭运算可以填补相邻区域以及空洞;
  • 腐蚀,会有一个结构元素,即一个形状的像素组合,以这个结构元素的中心点像素来计算保留处,这个结构元素在目标元素中逐行移动,若目标元素中的形状和结构元素相同,这个目标元素中对应中心点像素保留。
  • 膨胀,与腐蚀相反,即参照一个结构元素,这个结构元素我们可以设定中心点,需要膨胀的位置,然后顺着图像一格一格走,只要有和中心点有交集,即可按结构元素膨胀。
    开运算就是先腐蚀再膨胀,闭运算就是先膨胀再腐蚀。参考
腐蚀
膨胀
  • 灰度直方图。在图像处理中使用非常频繁,比如分开绿豆和红豆,可以拍照后选择灰度,红色和绿色灰度不同,通过直方图选择灰度范围,即可选择出红豆或绿豆。

  • 特征直方图。比如圆度、面积、


实战案例-区分红豆和绿豆

  • 1.首先打开一张图片,点击确定,打开图片后,按住command不放,在图片界面会出现 当前的像素坐标和 灰度值


  • 2.获取图片后,按照套路开始图片分割,我们打开灰度直方图,直接点上方的按钮,选择合适的灰度范围。按照下图操作完后,点击单步跳过函数


整个程序的编写和思考如下:

* 1. 采集图像
read_image (HalconTest01, '/Users/jkx/Desktop/halcon_test01.png')
* 2. 分割图像
threshold (HalconTest01, Regions, 43, 247)  // regions区域,表示选中43-247中间的灰度
dev_set_draw('margin')   // 画出边缘
dev_display(HalconTest01)  // 显示halconTest01这个图片,主要是生成 HalconTest01 这个变量
dev_display(Regions)  // 显示 分割过的 Regions 图片,此时可以看到图片背景有杂质,下一步要去除杂质
* 3. 采用开运算,消除图像杂质,先构建结构元素,结构元素中心点坐标我们可以不用管
gen_circle(Circle, 200, 200, 20)  // 200,200 是结构元素的坐标,不管,后面是半径,根据你杂质的大小选择,否组杂质清不干净
opening (Regions, Circle, RegionOpening)  // 开运算,表示打开 Regions这个对象,依照结构元素Circle这个对象,且生成新的RegionOpening对象
dev_clear_window()
dev_display(HalconTest01)
dev_display(RegionOpening)

* 4. 分离区域,将一个区域分解成多个区域
connection(RegionOpening, ConnectedRegions)  //这次分离只分离开部分,后面优化可以删掉这条
gen_circle(Circle1, 200, 200, 21.5)    // 腐蚀,结构元素更大,确保连在一起的豆子被分割开,Circle1是对象
erosion1 (ConnectedRegions, Circle1, RegionErosion, 1)  // ConnectedRegions, Circle1, RegionErosion, 1 ,括号里是函数的参数,这些参数是对象,RegionErosion是新的对象,halcon的套路是函数参数里靠后的是新生成的对象,输入、结构元素、输出
connection (RegionErosion, ConnectedRegions1)   // 分离开这些豆子
* 5. 再次清屏,为了更好的展示效果
dev_display(HalconTest01)
dev_display(RegionErosion)
* 6. 数一数有多少个被腐蚀后的参数
count_obj(ConnectedRegions1, Number)
* 7. 膨胀,恢复原来的样子
dilation1 (ConnectedRegions1, Circle1, RegionDilation1, 1)
* 8. 再次清屏,显示效果,为了便于理解,程序才这么啰嗦,实际可简化
dev_clear_window ()
dev_display (HalconTest01)
dev_display (RegionDilation1)
* 9. 插入特征直方图,区分豌豆和绿豆
select_shape (RegionDilation1, SelectedRegions, 'circularity', 'and', 0.571, 0.743)
dev_set_line_width (2)
dev_display (HalconTest01)
dev_display (SelectedRegions)  // 和上面的不能倒顺序,倒顺序就只能显示Halcon01,不能显示 SelectedRegions

count_obj (SelectedRegions, Number1)  // 数一下豌豆的数量
set_tposition (200000, 24, 12)  // 设置显示文字的位置
write_string (200000, '豌豆的个数是:' + Number1)   // 显示的内容
* dev_clear_window ()
* dev_display (HalconTest01)

difference (RegionDilation1, SelectedRegions, RegionDifference)   // 差值运算,这里小错误,虽然差值了,很多元素看不见了,但是还存在,所以结果还是67,需要再次处理
select_shape (RegionDifference, SelectedRegions1, 'area', 'and', 855, 4895)

count_obj (SelectedRegions1, Number2)
set_tposition (200000, 24, 12)
new_line (200000)
write_string (200000, '绿豆的个数是:' + Number2)   // 显示绿豆数

颜色空间
主要分为以下几点:Halcon支持的颜色空间、通道与颜色空间的转化、通道与区域分割方法、案例讲解

一般来说,我们得到一幅图像可以拆分为RGB(红黄蓝三通道分量交织,按BGRB排序)随后我们可以由RGB得到HSV空间图像。
而且,通道图像和 颜色空间图像 都是 8bit 灰度图像。

  • 色调 H
    用角度来度量,取值为 0~360度,从红色开始逆时针计算,红色为0,绿色为120,蓝色为240,它们的补色黄色为60,青色180,品红300.

  • 饱和度 S
    饱和度表示颜色接近光谱的程度,一种颜色可以看出光谱色和白色混合的结果,其中光谱色越大,饱和度越高,颜色越艳丽,类似油画里的白矾,颜色加上白矾,它的保护度就降低了。

  • 明度 V
    明度表示颜色的 明亮程度,对于光源色,明度值取决于发光体的光亮度,对于物色体,此值和物体的折射比和反射比相关,一般取值从0%(黑)到100%(白)。

四、 几何定位+仿射变换+视觉测量

定位三方法:Blob定位、模板匹配、深度学习

仿射变换:就是一种特殊的几何变换,是一种投影,常见的有 旋转、平移、缩放 (就是矩阵间的运算)

Blob分析 模板匹配

五、MPL深度学习(多层神经网络)

比如对于不同的物品,A、B、C,我们可以通过纹理区分ABC,得出3个不同的值,再比如我们 通过周长区分ABC,又得出3个不同的值,那边把这些特征集合在一起构成特征向量, 不同物品的特征向量值不一样,可以划分出ABC,这个划分的过程就是靠分类器完成的,而训练的过程就是根据 特征向量的不同,把他们训练成某类物品并归类分类。
MPL:Multi-Layer Perceptron


halcon视觉总结

一般来说,对于2D项目,无外乎这样的套路:

    1. 图像采集
    1. 预处理,主要有两种方法,对比度去噪
对比度:
scale_image (灰度缩放算子,在灰度直方图里操作,线性拉伸灰度)
emphsize (增强算子)
grey_range_rect (增加灰度动态范围的算子)
equ_histo_image (直方图均匀化,让图片灰度分布更均匀)

去燥:
mean_image (均值滤波)、高斯滤波、中值滤波
    1. 图像分割
      二值化、形状选择、形态学
    1. 特征识别 和 求取计算
    1. 显示与通讯

halcon中涉及的图像处理十大理论知识

  1. 图像处理基础知识
  2. 图像的灰度变换
  3. 图像增强(预处理:增强对比度 和去噪(均值、中值、高斯滤波))
  4. 图像的几何变换(仿射变换、投影变换、极坐标变换等)
  5. 图像分割(边缘提取、Blob分析等)
  6. 图像的频域(缺陷划痕检测等)
  7. 图像的形态学(膨胀、腐蚀、开运算、闭运算等)
  8. 图像的复原(这点halcon涉及不多,主要是刑侦用)
  9. 运动图像(运动检测,差分、光流法)
  10. 图像配准(模板匹配等)


六、硬件知识

购买工业相机必须要知道的参数

  • 分辨率(Resolution):相机每次采集图像的像素点数。对于数字工业相机一般是直接与光电传感器的像元数对应的,对于模拟相机则是取决于视频制式,PAL制为768576,NTSC制为640480。
  • 像素深度(Pixel Depth):即每像素数据的位数,一般常用的是8Bit.例如,一幅彩色图像的每个像素用R,G,B三个分量表示,若每个分量用8位,那么一个像素共用24位表示,就说像素的深度为24,每个像素可以是16 777 216(2的24次方)种颜色中的一种。在这个意义上,往往把像素深度说成是图像深度。表示一个像素的位数越多,它能表达的颜色数目就越多,而它的深度就越深。
  • 最大帧率(Frame Rate)/行频(Line Rate):即相机采集传输图像的速率,对于面阵相机一般为每秒采集的帧数,对于线阵相机为每秒采集的行数。
  • 曝光方式(Exposure)和快门速度(Shutter):对于线阵相机都是逐行曝光的方式,可以选择固定行频和外触发同步的采集方式,曝光时间可以与行周期一致,也可以设定一个固定的时间;面阵工业相机有帧曝光、场曝光和滚动行曝光等几种常见方式。数字工业相机一般都提供外触发采图的功能,快门速度一般可到10微秒,高速工业相机还可以更快。
  • 像元尺寸(Pixel Size):像元大小和像元数共同决定了相机靶面的大小。目前数字工业相机像元尺寸一般为3-10μm,一般像元尺寸越小,制造难度越大,图像质量也越不容易提高。
  • 光谱响应特性(Spectral Range):指该像元传感器对不同光波的敏感特性,一般响应范围是350-1000nm,一些相机在靶面前加了一个滤镜,滤除红外光线,如果系统需要对红外感光时可去掉该滤镜。

打光和镜头
《工程光学》 打光、选型、镜头

附录:以上是工业上的,其实在显微镜等超高精度的视觉中,除了要考虑相机图像分辨率,还要考虑 光学系统分辨率,这里一般精度在 nm 级别,可 参考文章



与公司算法工程师的交流:

  • 问:卷积在图像算法中能干嘛?
    答:可以用来滤波,也可以来模板匹配

  • 问:图像中 均值滤波、高斯滤波、中值滤波,这些感冒?
    答:去噪声。比如中值滤波可以去椒盐噪声, 自然界的噪声高斯噪声多,用高斯滤波去除,等等。补充:频域高通滤波锐化图像,即图像中的边界轮廓越明显,丢失了信息丰富的低频部分;频域低通滤波平滑图像,即图像中轮廓被淡化。

  • 问:卷积是对图片进行平滑处理吗?
    答:卷积可以理解为一种方法、一种操作,卷积就是按照块滑动处理,比如去一些图像毛刺。Halcon中的 开运算、闭运算、膨胀、收缩、也可以理解 为一种卷积。

  • 问:傅里叶变换在图像中的意义是?
    答:傅里叶变换用途很大,比如有时候噪声很难再时域中去除,在频域中 很好去除,另外,傅里叶可以用来压缩图像,图像打包后变成频域,解压再变成时域。

  • 涉及具体数学,傅里叶到底对图片做什么?
    答:图片其实可以理解为三维空间 图,xy 为空间位置,z为灰度值,通过傅里叶变换后,新的三维空间图像 xy 为不同方向的频率,z为幅值(待定)


图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯

这就得出了一个结论:傅里叶变换后的白色部分(即幅度较大的低频部分),表示的是图像中慢变化的特性,或者说是灰度变化缓慢的特性(低频部分)。

傅里叶变换后的黑色部分(即幅度低的高频部分),表示图像中快变化的特性,或者说是灰度变化快的特性(高频部分)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容