halcon视觉入门扫盲篇
halcon视觉入门扫盲篇
前言
在公司让我研究视觉的时候,我是两眼一抹黑的。之前完全没有接触过视觉。综合权衡后选择了Halcon,使用的是HDevelop 13 (64-bit)。
下载地址 官方下载
破解有点麻烦,我使用的是文件替换破解。一个exe文件一个dll文件,替换即可。
假设以上环境搭建没有问题,现在开始了解视觉识别的套路
基础知识
既然是做视觉,就需要图像,不管这个图像是从摄像头读过来的还是从文件中读取的。图片有一些基础信息,比如:
通道:一张图片一般有3个通道,也就是R G B 三个通道,R 代表红色 G 代表绿色 B 代表蓝色。
像素:计算机存储每个图片有N多个像素点,我们常说某个相机有几百万像素,说的就是这个,像素在计算机存储层面不可分割,是最小粒子。但在视觉算法上是可以的(后面再说)。
灰度值:灰度也可以认为是亮度,也是黑白图像中点的颜色深度,范围一般从0到255,白色为255 ,黑色为0,故黑白图片也称灰度图像。(如此简单理解即可)
Region:区域,根据特征提取出来的一些范围。
算子:直接理解成方法。
知道这些基础知识以后,我们在来理解什么是视觉识别。也别去看百度百科了,简单的理解就是,通过提取图像中的特征,选取我们需要的区域,从而达到一定的目的。
比如,有如下图

需要识别每个方格中是否有芯片。这是一个需求。根据这个需求,我们来进行需求拆解:
1. 如何在这张图里面得到这些方格。
2. 如何在每个方格中判断芯片是否存在。
大体思路就是这样了,接下来对图像进行分析,得到具体解决问题的思路:
如何在这张图里面得到这些方格。
分析图像可以知道:
方格是白色的,亮度较高。但白色的内容不只有方格,所以在提取特征的时候,需要注意。
方格比较规整,都是方形,面积相似。
方格与方格相连,所在的区域在整个图像的中心位置。
以上就是分析图像得到的信息。这些信息就是方格的特征,我们通过特征进行筛选,从而得到所有的方格。
如何判断方格中是否存在芯片
此时我们的兴趣点就在每个方格中,所以分析每个方格,我们可以得出一下结论:
芯片面积大小都差不多。
因为光照不均匀,导致有些地方的芯片亮度较高,有些亮度比较低,这可能是我们识别芯片过程中的难点。
芯片都是矩形。
有些芯片跟白色方格线比较近,可能会给我们识别芯片带来干扰。
芯片颜色灰度跟方格中的背景色不一致。
如果方格中没有芯片,那么方格中没有上述特征。
以上是特征分析,和解决问题的思路,接下来是编程的套路。
视觉分析的编程套路一般如下几个步骤:
- 打开图片(OpenImage)
- 将图片分解成3通道图片,或是转成灰度图(GrayImage)。
- 二值化或动态二值化(Region)。
- 联通区域。
- 特征筛选。
- 如果区域有干扰,一般会进行一下操作:
- 腐蚀
- 膨胀
- 形状转换
- 以上步骤重复,或组合重复。
- 根据需要,还可以合并区域,并重复4-6,从而达到目的。
- 输出区域并标注。
实则还有其他的处理方式,比如我们需要的区域特征不明显,不需要的区域特征很明显,此时,我们可以获取不需要的区域,然后使用相减的方式得到需要的区域。(这个会在实际的使用中讲到)
接下来进行答疑
我在学习的过程中,产生了很多疑问,直到我反复编程理解后才明白为什么要这么做。在这里,我会先给出答案。
Q:为什么需要将图片分解成3通道图片,或是灰度图?
A:我的理解是,因为如果不分解,图片是RGB三通道图片,那么程序就不知道对哪个通道进行操作。将图片转换为灰度图或是单通道后,我们才能根据图片的明暗,也就是灰度,进行特征提取。
Q:什么是二值化?
A:二值化通俗的讲就是通过两个灰度值来分割出感兴趣的区域。比如,我需要的区域很亮,我查看特征后发现,这个区域的亮度范围在 210-255之间。此时我就可以通过 threshold 算子,如: threshold(Image, Region, 210, 255) 来得到我们感兴趣的区域 Region。这里 Image是输入参数,210是控制参数,255是控制参数,Region是输出参数。
Q:什么是联通区域?
A:联通区域实际上是一个算子 connection,是这样调用的:connection (Region, ConnectedRegions) ,实际上我们通过二值化得到的区域不一定就完全是我们需要的内容,可能会存在干扰。也就是说,会有很多个区域存在,但这些区域在没有执行 connection之前是一个整体,我们只有在对他进行联通之后,才会被分割成多个对象。此时,我们就可以通过,面积,长宽,矩形相似度等特征进行进一步筛选。总的说回来,connection这个算子虽然说是联通区域,但实际上是将区域分割成多个部分。
Q:什么是特征筛选?
A:特征筛选是通过面积,长宽,矩形相似度,灰度值等条件,将我们需要的内容筛选出来。
Q:什么是腐蚀?
A:腐蚀的前提是我们要的比实际的结果要小,所以需要对目标区域进行腐蚀,让它变小。
Q:什么是膨胀?
A:膨胀跟腐蚀正好相反,因为我们要的比较大,但目标区域比较小,所以我们需要让它变大。
Q:什么是形状转换?
A:将目标区域转化为特定的形状,比如得到的区域是一个不规则的矩形,我们可以作外接矩形或是外接圆,让它更符合实际结果。
halcon视觉入门扫盲篇的更多相关文章
- halcon视觉入门钢珠识别
halcon视觉入门钢珠识别 经过入门篇,我们有了基础的视觉识别知识.现在加以应用. 有如下图片: 我们需要识别图片中比较明亮的中间区域,有黑色的钢珠,我们需要知道他的位置和面积. 分析如何识别 编写 ...
- Halcon视觉入门芯片识别
Halcon视觉入门芯片识别 需求 有如下图的一个摆盘,摆盘的方格中摆放芯片,一个格子中只放一个,我们需要知道每个方格中是否有芯片去指导我们将芯片放到空的方格中. 分析 通过图片分析得出 我们感兴趣的 ...
- java学习——入门扫盲篇
概要 近期这几天開始进入java的学习,接触到了好多不是非常了解的概念,像JDK.JRE.JVM.GC等等这些,放到这里来进行下扫盲. java java是一种面向对象程序设计语言和java平台的总称 ...
- Httpd服务入门知识-http协议版本,工作机制及http服务器应用扫盲篇
Httpd服务入门知识-http协议版本,工作机制及http服务器应用扫盲篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Internet与中国 Internet最早来源于美 ...
- 《IM开发新手入门一篇就够:从零开发移动端IM》
登录 立即注册 TCP/IP详解 资讯 动态 社区 技术精选 首页 即时通讯网›专项技术区›IM开发新手入门一篇就够:从零开发移动端IM 帖子 打赏 分享 发表评论162 想开 ...
- 使用Python+OpenCV进行图像处理(二)| 视觉入门
[前言]图像预处理对于整个图像处理任务来讲特别重要.如果我们没有进行恰当的预处理,无论我们有多么好的数据也很难得到理想的结果. 本篇是视觉入门系列教程的第二篇.整个视觉入门系列内容如下: 理解颜色模型 ...
- 转摘 MySQL扫盲篇
一下文章摘自:http://www.jellythink.com/archives/636 MySQL扫盲篇 2014-09-15 分类:MySQL / 数据库 阅读(1412) 评论(1) 为什么 ...
- Asp.Net MVC2.0 Url 路由入门---实例篇
本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术. 接着上一篇开始讲,我们在Global.asax中注册一条路由后,我们的请求是怎么转到相应的Vi ...
- 分布式协调服务Zookeeper扫盲篇
分布式协调服务Zookeeper扫盲篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 身为运维工程师对kubernetes(k8s)可能比较熟,那么etcd(go语言实现)分布式协 ...
随机推荐
- anaconda 安装 gdown
pip install gdown注意不要使用conda install gdown 这样会报错参考:gdown · PyPI
- 第十个知识点:RSA和强RSA问题有什么区别?
第十个知识点:RSA和强RSA问题有什么区别 这个密码学52件事数学知识的第一篇,也是整个系列的第10篇.这篇介绍了RSA问题和Strong-RSA问题,指出了这两种问题的不同之处. 密码学严重依赖于 ...
- 排列组合 "n个球放入m个盒子m"问题 总结
求,盒子都可以分成是否不能区分,和能区分,还能分成是否能有空箱子,所以一共是8种情况,我们现在来一一讨论. 1.球同,盒不同,无空箱 C(n-1,m-1), n>=m0, n<m 使用插板 ...
- mybatis练习-获取拥有“普通用户”角色的所有用户信息,要求查询结果除了包含用户自身信息,还包括角色名和角色创建时间。
实现要求: 获取拥有"普通用户"角色的所有用户信息,要求查询结果除了包含用户自身信息,还包括角色名和角色创建时间. 实现思路: 在用户实体类SysUser中新增角色SysRole成 ...
- NPM镜像地址
NPM镜像地址 npm ---- https://registry.npmjs.org/ cnpm --- http://r.cnpmjs.org/ taobao - https://registry ...
- 编写Java程序,遍历所有英雄信息(美和易思JDBC,PreparedStatement执行查询语句练习习题)
返回本章节 返回作业目录 需求说明: 继续完善英雄信息系统.使用JDBC技术,通过PreparedStatement对象的executeQuery()方法获取表示所有英雄数据的ResultSet结果集 ...
- Laravel Redis分布式锁实现源码分析
首先是锁的抽象类,定义了继承的类必须实现加锁.释放锁.返回锁拥有者的方法. namespace Illuminate\Cache; abstract class Lock implements Loc ...
- IntelliJ IDEA 2020.1.1 x64 Debug 断点调试模式详解
前言 对于初入职场的萌新们来说,很多都还不会 Debug 断点模式.记得我刚写代码的时候,也是通过 System.out.println() 一行一行的把变量打印出来看.其实强大的编辑器已经帮我们做好 ...
- python 面向对象:类方法&静态方法
一.类方法 1.1 概念和语法说明 类方法就是针对类对象定义的方法.在类方法内部可以直接访问类属性或者调用其他的类方法 语法如下: @classmethod def 类方法名(cls): pass 说 ...
- Linux上天之路(十三)之系统进程管理
主要内容 进程介绍 进程管理 进程优先级 1. 进程介绍 Linux系统中的几乎任何行动都会以进程的形式进行.如果你用网络浏览器查看网页,浏览器就作为进程运行.如果键入bash shell的命令行,这 ...