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语言实现)分布式协 ...
随机推荐
- .Net下你不得不看的分表分库解决方案-多字段分片
.Net下你不得不看的分表分库解决方案-多字段分片 介绍 本期主角:ShardingCore 一款ef-core下高性能.轻量级针对分表分库读写分离的解决方案,具有零依赖.零学习成本.零业务代码入侵 ...
- 解决"The remote SSH server rejected X11 forwarding request"问题
今天突然想起来好久没有登录我的vps了,于是下载了xshell,填入地址登录后,看到提示"WARNING! The remote SSH server rejected X11 forwar ...
- Dynamic Routing Between Capsules
目录 概 主要内容 损失函数 代码 Sabour S, Frosst N, Hinton G E, et al. Dynamic Routing Between Capsules[C]. neural ...
- CSS3的nth-child() 选择器,表格奇偶行变色
nth-child() 应用背景 CSS3的nth-child() 选择器,我之前很少用,在做表格偶数行变色的时候,我通常在绑定的时候,做一个js判断,来加一个css,从而使表格偶数行和奇数行颜色不一 ...
- 高可用k8s集群搭建
虚拟机选择 Win10 Hyper-V 总体架构 三个master,三个node master的组件 etcd kube-apiserver kube-controller-manager kube- ...
- Swoole 中使用通道(Channel)实现协程间通讯(消息队列)
通道 Coroutine\Channel 使用本地内存,不同的进程之间内存是隔离的. 只能在同一进程的不同协程内进行 push 和 pop 操作. Co::set(['hook_flags'=> ...
- Java 字符与字符串
字符 // 定义字符 char c1 = 'a'; char c2 = '1'; char c3 = '中'; // 自动装箱 Character c = c1; // 自动拆箱 c1 = c; // ...
- CSS基础 清除浮动
1.单伪元素清除法:清除浮动 .clearfix::after{ content: '.'; display: block; c ...
- hisql 与sqlsugar,freesql 数据插入性能测试
hisql与目前比较流行的ORM框架性能测试对比 hisql 一直定位为新一代的ORM框架 为低代码开发而生 测试数据数据库为sqlserver数据库 测试源码地址hisql与sqlsugar fre ...
- Docker_容器(container)使用(4)
参数说明 -i: 交互式操作. -t: 终端. -d: 指定容器运行模式. --name:指定容器的NAMES字段名称,不指定则随机生成名称 --restart:容器启动策略.默认为no,常用为alw ...