@wenris
2016-01-19T05:08:52.000000Z
字数 7198
阅读 1139
MAVIS - Fast & Robust Machine Vision Platform
快速构建机器视觉引导系统,兼备性能、健壮和易用
机器视觉 软件平台
Wenris Chen <wenris@yeah.net>
免费版Mavis下载:http://share.weiyun.com/d382ea12c0ebbd0e25fdea4dc442ccab
离线PDF文档:http://share.weiyun.com/79d299407228d039a2297e261c2b7d9a
Mavis是专注于机器人引导的智能视觉软件平台,集成了图像搜索、图像工具(找线、找圆、区域特征统计等)、HALCON脚本调用、以太网通信、光源控制、相机标定、配方管理、记录回放等实用功能,可根据目标轮廓、形状和灰度值特征灵活制作模板,支持几何点位计算(交点、中点、垂心等),适用于各类机器人及伺服平台的工作引导。同时具有开放式的标定接口,能与机器人自动标定,自动计算工具坐标,具有高精度的坐标转换。通过功能模块和HDevelop程序调用,Mavis也能实现产品缺陷检测,字符识别,二维码识别,测量等功能。
Mavis 1.0支持64位的Windows 7、Windows 8/8.1和Windows 10操作系统,建议内存安装2GB以上。
将下载的Mavis软件压缩包解压到你想要安装的目录即可。安装文件如下:

其中, exe是Mavis执行文件存放目录,qtlib是QT动态库存放目录,Mavis.exe是主程序,双击即可运行。img目录下还有一些图像文件供测试使用。
本节是Mavis快速向导,受限于篇幅大小,不能对每个操作进行细述,请读者自行尝试,Mavis将努力做好简便的交互。此过程中有任何疑问可在百度贴吧上留言,我将竭力解答。贴吧地址: http://tieba.baidu.com/f?kw=Mavis机器视觉平台。
初次运行Mavis.exe程序,会先弹出一个开始对话框,提示用户选择一个用于存放项目数据的工作目录,并指定相机名称。每个Mavis实例可支持4个相机同时工作。

上图中,指定了S:/Mavis1/Works作为工作目录,并设定了1#、2#相机的名称,点击继续进入Mavis主界面:

点击左边控制面板上图像接口一栏,将会弹出相机选择对话框。试用版Mavis支持Directory、DirectShow、GigEVision三种接口类型的相机,这里我们先选择Directory接口的相机,即选择图像目录作为虚拟的相机采集接口,如图:

选择图像目录,点击连接即可。相机连接好后,单击左边面板的图像采集即可进行拍照,双击可以进入实时拍照监控。
Mavis可以自动检测连接的实体相机,如你的电脑装有摄像头,切换到DirectShow接口进行连接。同时,你可以指定相机的采集参数,如曝光时间、增益、镜像等。
Mavis官方支持相机详情:http://dwz.cn/mavis-camera-list。

上图中,将连接我笔记本上的前置摄像头,并设定采集图像时进行按列方向镜像。双击右边面板可以得到该摄像头的实时影像,如图:

连接好相机后,我们来新建一个用于查找目标的模板。首先点击右边面板上的产品模板一栏,弹出模板选择对话框,点击对话框上边的新建按钮,输入新模板的名称,如WSPA0170,然后点击下方的编辑,进入模板编辑界面。

模板创建的步骤如下:1, 点击最右边相机图标,接入清晰的图像;2, 点击区域绘制图标,绘制合适的模板区域;3, 点击生成选项生成模板;4, 点击测试选项测试模板搜索结果;5, 保存并退出。退出后再点击模板选择对话框的应用按钮,模板设定完毕。详细的模板创建过程请参考下节“模板学习”的内容。

完成模板创建并应用模板后,可点击主界面右边面板的M1测试按钮,进行图像采集和模板查找测试,查找结果显示在面板下方的文本栏内,双击该按钮,将会进入目标的实时跟踪模式,如图:

点击右边面板的运行记录记录一栏,打开运行记录对话框,这里可以设置保存相机触发采集的图像和处理结果,还包括触发时间、触发指令和返回结果数据。

点击对话框上的查看按钮,可以查看已存的记录:

Mavis具有配方管理功能,点击右边全局设定面板下的当前配方一栏,可以新建和修改产品配方。生产配方保存了每个相机的接口和参数数据、模板使用等信息:

模板是目标的特征数据,如目标的轮廓、形状、灰度值相关性。有了模板数据,就可以在目标图像上进行地毯式搜索比对,找出具有一定相似度的目标位置。本节学习如何得到这些模板数据。
学习模板前,我们先要准备一张含有目标的样图,然后再样图上绘制出目标的区域,称之为模板区域。打开模板编辑对话框后,可以点击上方的
图标从主界面中拉取图像,或通过
选择合适的样图。接着我们可以在样图上绘制这些区域:
.
- 现有区域与新绘制的区域取并集,用于增添区域
.
- 现有区域与新绘制的区域取差集,用于删减区域
.
- 现有区域与新绘制的区域取交集,很少用到
.
- 绘制直线,仅在学习形状模板有效
.
- 绘制圆形、椭圆形区域
.
- 绘制直角四边形、平行四边形区域
.
- 绘制任意多边形区域
.
- 删除已有现有区域
区域绘制中,使用鼠标右键结束,请注意下方状态栏提示。
轮廓模板是对模板区域内的模板图像进行边缘检测,将得到的边缘轮廓作为模板数据。点击
图标进入轮廓模板学习,在模板编辑对话框右边的模板创建面板上,调试下面的模板创建参数(一般情况下按默认值为好):
| 参数名 | 典型值 | 默认值 | 影响因素 |
|---|---|---|---|
| 对比度范围 | 5 ~ 180 | 30 ~ 80 | 影响边缘检测到的轮廓 |
| 最小对比度 | 5 ~ 180 | 10 | |
| 最小组件 | 5 ~ 900 | 20 | 过滤小于参数值的轮廓 |
| 金字塔级别 | 1 ~ 7 | 6 | |
| 起始角度 | 0 ~ 360 | -30 | |
| 结束角度 | 0 ~ 360 | 30 | |
| 角度步长 | 0.1 ~ 5 | 0.5 | 步长越小,精度越高,但查找速度越慢 |
| 极化选项 | - | ‘use_polarity’ | |
| 优化选项 | - | ‘auto’ |
绘制轮廓模板的区域时,应该包含轮廓清晰稳定的目标位置,同时去除那些易受图像干扰而时隐时现或变形严重的位置。选择合适的对比度范围和最小组件大小,使生成的模板轮廓最符合实际目标的轮廓。
注:本篇指南旨在帮助用户快速了解和使用Mavis,不会对一些图像算法细节进行阐述,相关的参数解析请咨询作者Wenris,后同,请读者见谅。

形状模板与轮廓模板及其相似,只不过形状模板的轮廓获得不是通过对目标图像的边缘检测,而是由用户直接绘制。点击
图标进入形状模板学习,生成参数请参考轮廓模板。

使用轮廓或形状模板的前提是目标必须具有显著的边缘轮廓,对于一些边缘轮不甚清晰的目标,灰度值相关性模板将大派用场。限于篇幅原因,在此不去介绍灰度值相关性模板匹配的数学/算法原理,我只举个简单的例子助大家理解。
假设我要查找的目标是人脸,我可以告诉计算机去匹配一个椭圆性的目标,这其实就是轮廓模板。我也可以告诉计算机去搜索这幅图像中颜色为黄色的区域,并且该黄色区域大致椭圆形(脸型),中上方还有两个黑色的小圆(两只眼睛),这两个黑色小圆上边还有月亮形的黑色区域(眉毛),这就是灰度值相关性模板了。
点击
图标进入灰度值相关性模板的学习,生成参数有:
| 参数名 | 典型值 | 默认值 | 影响因素 |
|---|---|---|---|
| 金字塔级别 | 1 ~ 7 | 6 | |
| 起始角度 | 0 ~ 360 | -30 | |
| 结束角度 | 0 ~ 360 | 30 | |
| 角度步长 | 0.1 ~ 5 | 0.5 | 步长越小,精度越高,但查找速度越慢 |
| 极化选项 | - | ‘use_polarity’ |
绘制灰度值相关性模板区域相对轮廓模板来说可以比较随意,如果背景值稳定的话,也可以将背景纳入模板区域中。
很多实际案例中,由于打光效果不佳、产品形状一致性底等原因,运用轮廓或形状模板很难找准所有的产品,灰度值相关性模板将会是一个更好的选择。专用版Mavis还提供了变形缩放模板、混合模板等更多选择。

很多实际案例中,由于打光效果不佳、产品形状一致性底等原因,运用轮廓或形状模板很难找准所有的产品,灰度值相关性模板将会是一个更好的选择。专用版Mavis还提供了变形缩放模板、混合模板等更多选择。
绘制完模板区域后,通过以下几步完成模板的创建和保存:
1. 点击 图像 图标,确认模板图像
2. 点击 区域 图标,确认模板区域
3. 点击 生成 图标,生成模板
4. 点击 测试 图标,测试模板
5. 点击 图标,保存模板
模板查找是Mavis核心功能,本节学习如何应用上节中创建的模板在一幅图像中搜寻目标,得到与目标相关的点位和区域。
在创建模板对话框右边图像查找面板上可以设定与查找相关的参数,如下:
| 参数名 | 典型值 | 默认值 | 影响因素 |
|---|---|---|---|
| 最小分支 | 0.0 ~ 1.0 | 0.5 | 相似度,原则上不低于0.5 |
| 最大匹配数目 | 1 ~ 200 | 1 | |
| 金字塔组合 | 1 ~ 7 | 3, 5 | 影响速度和精准度 |
| 贪心算法值 | 0.5 ~ 1 | 0.9 | 算法趋向值,仅对轮廓、形状模板有效 |
| 最大重叠 | 0 ~ 1 | 0 | |
| 最小角度 | 0 ~ 360 | -30 | |
| 最大角度 | 0 ~ 360 | 30 | |
| 亚像素精度 | - | ‘ture’ | 影响结果精度 |
点击主界面控制面板上的产品模板一栏,在弹出的模板选择对话框也可以快速对模板查找的参数进行修改,如下:

每个模板可以保存十个的关联区域,其中0#和1#区域具有特殊的用途,分别用作为模板区域和搜索区域。每个区域具有 跟随 与 显示 属性,设定有跟随属性的区域在目标查找时会随目标的位置改变而跟着改变,反之该区域就是一个固定区域。模板区域必须是跟随的,而搜索区域则相反。

除了区域,模板还保存有十个的关联点位,其中0#点位是模板的重心位置,不能手动指定。设定有跟随属性的点位可用于标示目标的位置。

发送Mn指令给相机应用将触发模板查找(n取值0~9),返回结果为n#点位的坐标数据。假设发送M1指令给相机,查找得到两个目标,对应的1#点位坐标为(Px1,Py1,Phi1)和(Px2,Py2,Phi2),则返回数据为"M1,2,Px1;Px2,Py1;Py2,Phi1;Phi2"。
TODO
这部分功能变化很大,目前已实现的工具如下:直线查找、圆弧拟合、几何特征统计、区域特征统计、模式查找。由于时间有限,未来得及编写该部分的文档。
通过圆弧拟合和几何特征定位产品:

直线查找:

Mavis可以直接调用HDevelop程序对图像进行处理,并且支持联线调试。本节带你一起体验Mavis这一强大功能。
点击主界面右边面板的后台处理一栏,弹出脚本选择对话框,点击编辑将打开HDevelop开发程序。

被调用的HDevelop程序中嵌有mavis_deal函数,当Mavis接收到Dn指令时,将触发模板查找,查找的结果封装成该函数的输入参数,接着进行函数调用。Mavis_deal的参数如下:
| 参数名 | 类型 | 方向 | 用途 |
|---|---|---|---|
| Image | Image | 输入 | 待处理图像 |
| RoiV | Region {1} | 输入 | 一维Region向量,关联区域 |
| Request | Number | 输入 | Dn指令的n部分 |
| Rows | Tuple | 输入 | 目标重心的X值 |
| Columns | Tuple | 输入 | 目标重心的Y值 |
| Angles | Tuple | 输入 | 目标角度值 |
| Scores | Tuple | 输入 | 目标得分(与模板相似度) |
| PxV | Tuple {1} | 输入 | 一维Tuple向量,关联点位X值 |
| PyV | Tuple {1} | 输入 | 一维Tuple向量,关联点位Y值 |
| PhiV | Tuple {1} | 输入 | 一维Tuple向量,关联点位角度值 |
| WndId | Window Handler | 输入 | 用于绘图的窗口ID |
| Result | Tuple | 输出 | 结果数组 |
| Error | String | 输出 | 出错信息 |
具体编程方法,请参考HDevelop说明文档。需要说明的是,RoiV、PxV、PyV和PhiV是Halcon 12才有Vector类型向量。使用RoiV.at(0)得到模板关联的十个区域,RoiV.at(n)得到第n个目标关联的十个区域,余此类推。
在调用的HDevelop程序中,Mavis安置了与主程序通讯的函数,使得在HDevelop开发界面上直接模拟触发Dn指令,得到mavis_deal需要的参数,然后就可以单步进入该函数进行在线程序编辑和调试了。

在调用HDevelop函数处理图像时,经常会有函数处理失败情况。Mavis是通过模块化的设计,在独立进程中执行HDevelop函数,函数的出错不是导致Mavis的异常退出。同时,Mavis还有异常记录功能,帮助用户查找异常出现的位置,在程序的调试开发阶段尤为重要。

坐标转换是视觉引导类应用的重要环节,转换矩阵是将图像坐标转换到机械坐标的数据结构式,通常所说的相机标定(刻度),指的是转换矩阵的求解过程。通用版Mavis提供的标定方法是,在图像范围内放置n个Mark点,通过图像查找得到其坐标,记为[Pn],另一方面,想办法得到这些点的机械坐标,记为[Qn],然后通过[M] = [Qn] / [Pn]计算得到转换矩阵M。
严格意义上,标定是依据相机成像的几何模型,输入相机的芯片和镜头参数和图像采样,确定物理位置与图像位置的转换关系。这种方法适用于图像测量、摄像测量和三维重建等应用,如果你有这方面需求,可以联系Wenris获取技术支持。
动态标定是在运动的机械位置上取一个图像特征明显,且机械位置明确的点位作为Mark点,机械运动改变Mark点在图像的位置,记录图像点位和机械点位3个以上,通过计算得到转换矩阵。
首先,建立Mark点的图像模板,将1#关联点位设定在Mark点中心,接入相机开启目标实时跟踪模式;接着点击右边面板的坐标转换一栏,打开坐标转换对话框,选择单点采集模式,逐个采集数据,如图:

底部相机的手动刻度实例,获取的点位应集中在工作位置上,一般取4或9个按行列排列整齐的点,Mavis自动采集坐标数据,并进行计算得到相机的标定参数。
静态标定时,可以打印一张印有4个或9个Mark点的纸粘在图像可视范围内,通过模板查找获取到这些Mark点的图像坐标,然后通过机械示教,得到它们的机械坐标。
首先,建立Mark点的图像模板,将1#关联点位设定在Mark点中心。打开坐标转换对话框,选择2x2或3x3矩阵采集图像坐标;然后将机械坐标按对应关系输入至Qx和Qy两列;最后,点击计算即可。

不同的应用环境,可以灵活地选择标定方式,比如对于同时具有俯视相机和仰视相机的系统可以进行双相机配合标定。标定的过程应尽可能减少手工操作,以减少采样数据误差。通过对Mavis软件进行定制,可以实现自动化的标定过程,这对于机械与图像相对位置易发生改变的应用具有很大的帮助。
底部相机的自助刻度示意图,控制机器人在图像视野内移动,采集3x3宫格+旋转中心点的坐标数据并传送至视觉上位机。

自助刻度程序,通过与机器人、Mavis通讯,得到机器人与图像的坐标组,通过计算可以得到机器人的工具坐标参数及相机的标定参数。

针对EPSON机器人实现的全自动标定程序,手工只需要将目标移动至图像中心位置,标定程序将自动完成机器人动作、坐标采集、计算并上传相机的标定参数至Mavis。
网络服务端口默认为5700, 可在全局设定面板上更改。接入客户端连接的对象可以是Master、Vision1、Vision2、Vision3和Vision4, 初始时连接的Master,发送“Vision&1”指令可以切换到Vision1,这时需要发送“Quit”回到Master。
接入Master对象时,可以受理的指令有:
| 指令 | 回复 | 解释 |
|---|---|---|
| ListVision | ListVision&1;…&2;…&3;…&4;… | 查询相机 …是相机名称 |
| SetRecipe;#n 或 SetRecipe;$配方名 | SetRecipe;OK 或 SetRecipe;Bad | 更改配方 |
| Vision&n | Vision&n;… | 接入n#相机 …是相机名称 |
接入Vision对象时,可以受理的指令有:
| 指令 | 回复 | 解释 |
|---|---|---|
| GD{&Pn}{&Qn}{&Tn} | GD{&Pn;…}{&Qn;…}{&Tn;…} | 触发并计算 Pn请求像素坐标 Qn请求机械坐标 Tn请求工具数据 |
| Quit | Vision&0;Master | 退出到Master |
| 内部指令 | 内部指令 | 其他内部指令 |
举例,触发并请求1#点的机械坐标跟0#图像工具的计算结果,假设查找到两个目标:
. 发送 GD&Q1&T0
. 收到 GD&Q1;x1,y1,r1,s1;x2,y2,r2,s2&T0;d1;d2
数据x1,y1,r1,s1是第一个目标(坐标[x1,y1],角度r1,相似度s1),x2,y2,r2,s2是第二个目标,d1、d2是两个目标的工具计算结果,不同工具类型数据格式不同。
有时希望相机采集图像后马上答复,这时电控程序再请求图像计算,同时开始进行其他运动,达到计算与运动并行。实现的方法是拆分GM指令:
我是Wenris,从事软件开发5年有余,Mavis视觉平台是基于我这些年的项目经验,迎合以下需求开发的:
- 核心需求是对机器人进行视觉向导,最常见的是Pick & Place应用
- 多类型产品支持,并且能快速增加和切换产品,普通用户也能轻易操作
- 快速对相机进行标定,最好普通用户也能轻易完成
- 系统开发一定要快,设备调试时间越短越好
- 软件运行必须快、稳定可靠,一定要避免错找或漏找目标
Mavis 1.0基本满足了这些需求,通过HDevelop程序调用,更是扩展了Mavis了应用范围。在后续版本的开发上,我会增加一些智能相机的功能在里面,如测量、二维码识别、OCR模块,满足更多的项目需求。