简介:这份PPT面向机器视觉初学者和自动化检测工程人员,系统梳理Sherlock机器视觉软件的功能定位与使用框架,可帮助读者理解视觉检测程序的配置逻辑、界面组成及通讯、多线程等工程应用背景。内容从主菜单栏、工具栏、图像窗口、监视窗口、变量窗口和报表窗口切入,说明Number、Boolean、String、Point、Line等变量及数组形式在检测数据保存中的作用,并延伸到Landmark位置标定、Calibration刻度校准、Search区域搜索和Color Processing颜色处理等核心环节,同时涉及面性/线性ROI、Blob分析、边缘计数、读码器、OCR及脚本编辑、算法定制等工具箱内容。压缩包共1个PPT文件,约3.93MB,以图文页面集中呈现界面布局、程序单元组织与标定应用示例,便于对照学习和课堂讲解。已有1564人学习,适合需要快速建立Sherlock操作框架、查漏补缺并理解视觉检测流程的读者参考。
1. 先弄明白一件事:机器视觉软件到底在替人干什么
有位朋友第一次听到 Sherlock 机器视觉应用软件这个名字,第一反应是:这玩意儿是不是查案用的?等看到界面上一堆 ROI、Blob、边缘强度之类的词,就更发怵了,觉得这肯定是工程师才能碰的东西。其实它干的活很朴素——摄像头拍下流水线上的零件,软件替你盯着那张画面,判断东西有没有、位置正不正、缺不缺件、条码读不读得出来。Sherlock 就是这类帮你盯画面的 Windows 软件,点击式配置,多视野分析,常见的自动化检测场景基本都能覆盖。
这篇入门向的梳理不聊算法推导,只回答三件事:它是什么、为什么值得零基础的人先学它、第一周该动哪几个按钮。读完你至少能自己打开软件,对着一张图片跑出一条能出结果的流程。
2. 为什么新手值得先学它:门槛低不等于学不到东西
2.1 点击式配置,把写代码换成摆积木
机器视觉开发有两条路。一条像雕刻:拿 C# 或者 C++ 调图像处理库,一行行写采集、滤波、找边、判定,出了毛病自己下断点。另一条像摆积木:软件把常用的图像处理都做成现成的模块,你把模块拖进程序窗口,填几个参数,连起来就成一条流程。Sherlock 走的是第二条路,官方描述里那几个词——点击式、图形化环境、无需传统编程——说的就是这件事。
摆积木的好处很直接:新手第一天就能看到结果。你画一个框,选一个读码算法,点运行,条码内容就出来了,中间不需要理解亚像素、不需要啃什么卷积核。这种即时反馈对零基础的人特别重要,因为学视觉最怕的就是折腾半天屏幕上什么变化都没有,最后不知道自己错在哪。
但门槛低不等于不用动脑。积木摆错顺序照样塌:算法 B 要用算法 A 算出来的点,你把 B 拖到 A 前面,B 拿到的就是个空值;ROI 画大了一圈,把背景的干扰也框进来,读数立刻开始飘。所以真正要学的是两件事——每个模块负责什么,以及它们之间谁先谁后。这两件事想清楚了,剩下的都是鼠标操作。
还有一点值得提前说:Sherlock 是多视野的,一套软件里能同时管多个相机、多个工位的画面。实际产线上常见的场景是,一台机器上装着好几个镜头,分别看不同角度,软件里就是几个图像窗口各管一摊。入门阶段先玩一个窗口,等你把单幅图的流程跑顺了,再多开窗口,思路是一样的。
2.2 先认五个变量字母:N、B、S、P、L
打开程序窗口,你会看到一堆带方括号的东西,像 N[1]、P[3] 这样。这五个字母是 Sherlock 里的变量类型,不认全它们,后面看程序基本等于看天书。第一次接触时我也觉得这是玄学,后来才明白,它其实只是把“结果长什么样”分了个类。
| 字母 | 类型 | 存什么 | 典型用途 |
|---|---|---|---|
| N | Number 数字 | 一个数值 | 测出来的宽度、面积、灰度均值、读码质量分 |
| B | Boolean 布尔 | 真或假 | 判定这一件是 OK 还是 NG |
| S | String 字符串 | 一串字符 | 条码内容、OCR 识别出的文本 |
| P | Point 点 | 一个坐标点 | 找边找到的边缘点、圆心、标定用的参照点 |
| L | Line 线 | 一条线 | 拟合出来的边线、基准线 |
每种类型还有对应的数组写法:N[]、B[]、S[]、P[]、L[]。数组的意思是“同一种东西有好几个”。举个具体例子,你在一条边上放了个线形 ROI 去找边缘,画面里可能同时找到五个符合强度的边缘点,那这五个点就存在 P[] 里面,P[1] 到 P[5] 挨个排着。
为什么要单独讲这个?因为后面所有的调试,本质都是在问一句话:我要的那个值,有没有被算出来、算对没有。变量窗口里 N 一直显示 0,说明算法根本没出结果,问题在配置;N 有值但每次跳来跳去,说明 ROI 或者参数不稳,问题在标定和阈值。分得清这两种情况,排错效率差出好几倍。
新手最容易犯的错是把类型用混。比如想记录条码读出来的字符串,却新建了一个 N 类型的变量去接,软件不会报错,但你永远看不到那串字符。养成习惯:动手接变量之前先想一句“这个结果是人能读的一串字,还是一个数,还是一个真假”。
2.3 六个窗口的分工:谁看结果,谁看过程
Sherlock 的界面乍看很满,其实每个窗口职责很单一。把它们的功能对号入座,界面立刻就不吓人了。
| 窗口或区域 | 干什么 | 什么时候看 |
|---|---|---|
| 主菜单栏与主工具栏 | 开关各类窗口、控制版面分布、保存程序、运行调试 | 开工第一步和收尾 |
| 图像窗口 | 显示相机画面或图片,画 ROI,装图存图,启停采集 | 全程都开着 |
| 程序窗口 | 显示每个算法单元的输入输出,拖拽调整执行顺序 | 搭流程和排查逻辑时 |
| 变量窗口 | 实时显示程序里各类变量的当前值 | 想知道“算出来没有”时 |
| 监视窗口 Monitor | 显示警告、错误、执行时间等运行信息 | 程序跑不动或者变慢时 |
| 报表窗口 Reporter | 承接打印出来的检测数据 | 要留存记录或对接外部时 |
这里有个容易被忽略的细节:图像窗口上有开始和停止采集的按钮,采图和算图是两条独立的线,采集不会停下来等你算完。这就是多线程这个概念在视觉软件里的雏形——画面刷新和程序执行各走各的。入门阶段不用深究调度,但心里要有数:画面上看到的帧,未必就是你正在算的那一帧,所以现场调试时先把采集停掉、用静态图验证逻辑,能省掉大量自我怀疑。
监视窗口 Monitor 是新手最该常开的一个。它不像变量窗口那样给你结果,它给你的是警告、错误和执行时间。程序卡住、某个算法报错、整条流程跑得比以前慢,线索都在这里。我见过太多人盯着画面找问题,其实 Monitor 里早就写清楚了哪一行没通过。
3. 第一个能跑通的例子:对着一张图把条码读出来
3.1 装图:先让软件有东西可看
别一上来就接相机。现场相机连着运动机构,工件一动,你根本分不清是算法配错了还是位置跑了。入门阶段用一张静态图片,可复现、可反复试,这是我最想给新手的建议。
操作顺序是这样的:
- 打开图像窗口,找到装载图像文件的按钮,选一张带条码的图(图书封面、包装盒都行)。
- 用放大、缩小、还原这几个按钮,把图调到条码占画面三分之一左右的大小。
- 打开显示选项设置,确认画面没有被过度缩放拉伸。
第二步为什么要调大小?因为 ROI 是用鼠标拖着画的,图太小你框不准,图太大又看不全上下文。三分之一是个经验值,条码边缘看得清、周围环境也留得住,后面判断“框大了还是框小了”会方便很多。
静态图跑通之后再切相机,切换的动作很小:把图像窗口的采集开起来,画面就从文件变成实时流。这时候如果结果开始抖,你至少能确定问题出在位置或者光照上,而不是自己刚才那套配置白做了。这个顺序能帮你省掉不少后悔药。
3.2 画 ROI 加算法:矩形框配 Barcode 1D
ROI 是“感兴趣区域”的缩写,说白了就是告诉软件:只看这块,别管别的地方。这是整个软件里最高频的动作,画得好不好直接决定结果稳不稳。
- 在图像窗口选择添加 ROI,挑矩形形状。
- 用鼠标在条码外面拉一个框,四边各留一点余量,别贴着条码边缘。
- 在程序窗口里给这个 ROI 配上 Barcode 1D 算法。
- 打开该算法的属性对话窗,确认码制类型和扫描方向跟图上的条码一致。
- 点运行,去变量窗口看结果。
参数上给几个起步建议:
| 项 | 起步怎么设 | 说明 |
|---|---|---|
| ROI 形状 | 矩形 | 一维码是长条,矩形最贴合 |
| 留边 | 条码四周各留 5 到 10 像素 | 贴边容易切掉起止符,直接读不出 |
| 算法 | Barcode 1D | 二维码要换成对应类型 |
| 扫描方向 | 与条码走向一致 | 方向反了等于横着扫竖条,必然失败 |
画框这一步有个血泪经验:宁可小一点、贴着条码,也别大一圈把背景全框进去。框大了,背景里的竖线条、文字、边框都可能被当成条码的一部分,读出来的内容就是乱的。反过来,如果框太小切掉了条码两端,那就直接读不出来。判断标准很简单——把框显示出来,肉眼确认条码完整落在里面,四边还有点空余,就对了。
3.3 看程序窗口和变量窗口:结果到底存在哪
运行之后,别急着看画面上的绿框,先看两个地方。
程序窗口显示的是每个算法单元的输入和输出。你在图像窗口里加了什么算法、设了什么预处理,对应的处理过程和结果参数都会在这里列出来。它的价值在于让你看见“顺序”:第一个单元算出什么,交给了第二个单元,第二个又吐出了什么。流程跑不通的时候,从上往下挨个看,通常能找到第一个输出为空的那一格,问题就在它或者它的上一格。
变量窗口显示的是变量的当前值,而且会随着程序运行实时刷新。读码成功的话,你会看到一个 S 类型的变量里躺着那串条码字符;如果是判定结果,那就是一个 B 类型的真假值;如果是质量分,就是 N 类型的数字。这里有个实操要点:变量不是自动就有的,需要在变量窗口的快捷工具栏里手动添加对应类型的变量,再把它接到算法的输出上。很多人第一次跑通了算法,却发现变量窗口空空如也,就是因为少了这一步。
顺手说一句通讯。真实项目里这个读出来的条码不会只躺在软件里,它要往外走:通过 I/O 接口给 PLC,或者走 OPC 兼容接口跟别的应用交换数据,也有用 VB 写前端界面来对接的。入门阶段先别碰这些,等单机流程稳了再往外接,顺序反了会非常痛苦——数据通路调通了,结果却是错的,你都不知道该改哪头。
3.4 单步跑一遍,再连续跑
工具栏上有几个按钮值得专门记:单步运行、连续运行、停止与中断调试。新手最容易忽略的是单步。
连续运行适合看最终效果,单步适合找问题。点一次单步,程序走一个单元,你就能看清这一格到底算出了什么,然后再点下一格。流程只有三四格的时候区别不大,一旦你的程序长到十几二十格,连续运行报错你根本不知道错在哪,单步走两遍基本就能定位。
调试的时候还有个动作要养成:程序单元是可以拖拽调整顺序的。往程序窗口里加单元时,逻辑上可能需要重排,你只要选中某个单元,按住鼠标左键拖到目标位置上方再松开,它就插进去了。这个操作看着简单,但顺序错了造成的现象特别迷惑——不是报错,而是结果全错或者全为空。所以每次拖完,顺手单步走一遍确认。
4. 让结果稳得住:位置标定是新手第一个必须啃下的功能
4.1 工件一挪,读数就飘,这不是玄学
标准的机器视觉应用都希望从一组图像里分析出相同的特征。但现实是,运动控制本身有误差,采集设备本身有误差,待检工件放上来的姿态也不可能每次都一样。结果就是每幅图里的物体位置都有点偏移,甚至带点旋转。你那个 ROI 是画在固定坐标上的,物体一动,框里的内容就变了,像素统计自然不准。
前面那个读条码的例子最能说明问题。图像往右移动一点,矩形 ROI 里框住的内容就变了,原本完整的条码偏出去一截,识别立刻失败。这时候大部分新手的反应是回去调算法参数,调半天没用——因为问题不在算法,在于框没跟着物体走。
解决思路只有一个:给 ROI 做坐标位置的自我标定。说人话就是,先在工件上找一个稳定、每次都能找到的参照物,用它的位置变化去推算整个画面偏了多少,然后让 ROI 跟着这个偏移量一起动。这个参照物的选取和标定,就是 Sherlock 里的 Landmark 位置标定和 Alignment 校正设置。
选参照物有几个原则,都是踩坑踩出来的。第一,这个特征每张图都必须存在,不能时有时无。第二,它要跟被检测的目标在同一个刚体上,工件转它就转,工件移它就移。第三,它的边缘要清晰、对比要够,别选那种模糊过渡带。图书封面上的条码左边框就是个不错的参照——边界干净,位置固定,每次都在。
4.2 建一个 alignment scheme:把参照点钉在工件上
这一步是整个标定里最需要按部就班的地方,顺序错了后面全白搭。拿前面那张图书封面图举例,参照物选条码左边那条竖直边界。
- 在图像窗口添加一个线形 ROI,横跨条码左侧的边界线。
- 给这个线形 ROI 配置 First Edge 算法,也就是找第一条边缘。
- 把边缘强度参数设成一个明确的值,比如 100,保证只在真正明显的边界处触发。
- 打开图像窗口的 Options 对话窗,切到 Alignment 页面。
- 点击 Create alignment 按钮,创建一个 alignment scheme。
- 系统默认会把它命名成 alignmentA、alignmentB 这种,改成有意义的名字,比如 alignLeftEdge。
- 从 Point readings 窗口里,把 First Edge 探测到的那个点拖到 alignLeftEdge 下面。
第七步做完,一个标定点就算立住了。这里解释几个关键动作。
为什么用线形 ROI 而不是矩形?因为你要的是“一条边界”,线形 ROI 横跨边界时,算法只需要在这一条线上找灰度突变,抗干扰能力强、定位精度也高。矩形框适合做面状统计,不适合精确定位。
边缘强度设 100 是什么意思?它是一道门槛,只有灰度变化超过这个值的才算边缘。设太低,背景的细微纹理、印刷噪点都会被当成边缘,参照点乱跳;设太高,遇到光照偏暗的图就一个边缘都找不到。100 是个可以起步的值,实际要按你的图调,调到“该找到的边界稳定找到,不该找的噪点一个不触发”为止。
命名这一步别偷懒。一条流程里往往有好几个标定点,都用默认的 alignmentA、alignmentB,过两天你自己都分不清哪个对应哪个 ROI。名字带上位置信息,比如 alignLeftEdge、alignTopHole,回头排查时省事。
4.3 把标定套到 ROI 上:让它自己跟着工件跑
标定建立好只是完成了一半,还得告诉每个需要跟着动的 ROI 去用哪一套标定。
- 选中要标定的那个矩形 ROI(就是配了 Barcode 1D 的那个)。
- 打开它的 Edit 窗口,切到属性栏。
- 找到 Alignment 下拉菜单,里面会列出程序里所有的标定设置。
- 选择刚才建好的 alignLeftEdge。
完成之后的效果是:工件水平移动时,线形 ROI 通过 First Edge 算法持续探测条码商标的左边界点,算出从原始位置到新位置偏移了多少,配了 Barcode 1D 的矩形 ROI 就按这个偏移量自动调整位置。有些界面上会用虚线标出矩形 ROI 的原始位置,你能直观看到它跟着跑了多远。
有个概念要分清楚:Landmark 位置标定和 Calibration 刻度校准不是一回事。位置标定解决的是“东西跑到别处去了”,让 ROI 跟过去;刻度校准解决的是“一个像素到底代表多少毫米”,让测量出来的数值有物理意义。新手常把两者混为一谈,结果测量值一直是像素数,不知道要去做标定换算。入门阶段先把位置标定搞熟,刻度校准等你要输出真实尺寸的时候再深入。
再补一句和通讯的关系。标定做好、结果稳定之后,这个 OK 或者 NG 的判定才值得往外送。通过 I/O 接口给 PLC 一个信号,或者走 OPC 兼容接口把数据交给上位应用,前提都是这个判定本身可信。跳过标定直接接外部通讯,等于把不稳定的数据一路放大到整条线,返工成本高得吓人。
5. 避坑:新手最容易翻车的五个地方
5.1 配置阶段的三处坑
坑一:ROI 画大了,把背景一起框进来。
现象是结果时对时错,同一张图重跑几次读数都不一样,或者读出来的字符莫名其妙多几位。原因是 ROI 覆盖范围超出了目标本身,背景里的文字、边框、阴影被算法一并处理,参与了统计和识别。解决方法是把 ROI 收紧到刚好包住目标、四周留一点余量,然后把框显示出来肉眼核一遍;如果拿不准,宁可先画小一点跑通,再一点点放宽。
坑二:照抄别人的边缘强度参数。
现象是参照点要么找不到,要么一张图上蹦出好几个候选点,标定完全不生效。原因是边缘强度是个跟具体图像强相关的门槛,光照、对比度、镜头都不一样,别人图上的 100 在你这张图上可能偏高也可能偏低。解决办法是先看灰度剖面想清楚这条边的对比大概多强,再从中间值试起,往两边调,直到稳定命中唯一一条边界。
坑三:改了参数没重新运行,以为软件坏了。
现象是明明把参数改成了新值,画面上什么反应都没有,变量窗口的值纹丝不动。原因是配置改变需要重新执行程序才会生效,尤其连续运行被停掉之后,光改参数不点运行,界面就是静止的。解决办法是养成“改完必跑一遍”的动作,改参数、单步、看变量窗口,三步连着做,不要跳。
5.2 运行与交付阶段的两处坑
坑四:打印变量忘了加方括号。
现象是报表窗口里出现的是变量名本身,不是数值,或者干脆什么都没有。原因是 Sherlock 里往报表输出检测数据靠的是 IO:Reporter Print 指令,而定制打印内容时,变量名两边必须加上方括号,软件才知道这里要替换成变量值;不加括号它只当普通文字。还有一个限制,你不能打印一个已知的固定读数,只能打印变量值。解决办法是把要输出的内容写成类似“读码结果:[S1] 判定:[B1]”这种形式,清空报表用 IO:Reporter Clear 指令,别手动删。
坑五:程序单元顺序拖错了,结果全空。
现象是不报错,但整条流程跑下来所有变量都是 0 或者空,画面上什么也没检出来。原因是算法之间有依赖,后面那格要用前面那格算出来的点,你把顺序颠倒了,它拿到的是初始空值。解决办法是打开程序窗口从上往下看,找到第一个输出为空的单元,问题通常就在它或它上一格;用单步运行一格一格走,明确每个单元的输入从哪来、输出给谁。
6. 下一步学什么:从会点按钮到能交付一条流程
零基础的人学 Sherlock,最容易走的弯路是想一口气把所有功能都摸一遍。Landmark、Calibration、Search、Color Processing 四大块,加上 Blob 分析、边缘计数、OCR、二维码、脚本编辑、I/O 接口,摊开看确实多。但它们的难度不是并列的,按顺序啃省力得多。
我给一条三个阶段的路径,每个阶段都配一个能自检的验收标准,你照着做就知道自己有没有过关。
| 阶段 | 时间 | 练什么 | 验收标准 |
|---|---|---|---|
| 第一阶段 | 第 1 到 2 周 | 窗口分工、五个变量类型、单步调试、静态图跑通读码 | 给一张新图,不看教程能独立配出读码流程,并能解释每个变量的含义 |
| 第二阶段 | 第 3 到 4 周 | Landmark 位置标定、Alignment 应用到 ROI | 同一目标在画面里平移后,读数仍然正确,ROI 能自动跟随 |
| 第三阶段 | 第 2 到 3 个月 | Search 区域搜索、Color Processing、Blob 分析、边缘计数、刻度校准、I/O 与外部通讯 | 能对一件工件输出带物理单位的测量值,并通过接口把判定结果送出去 |
第一阶段别急着接相机。我见过太多人第一天就把相机架起来,结果画面一直在动,参数永远调不稳,最后怀疑软件有问题。用静态图把逻辑跑熟,这个顺序不能反。
第二阶段的核心是理解“参照物”这个概念。找一条清晰的边界,配 First Edge,建 alignment scheme,拖点,应用到 ROI,这五步走顺了,你就掌握了机器视觉里最通用的一个思路:先定位,再测量。后面不管换成什么软件、什么算法,这个思路都成立。
第三阶段开始接触对外的东西。Search 区域搜索用来做模式匹配,适合找形状固定但位置不定的目标;Color Processing 做颜色对映和分类;Blob 分析数个数、算面积;边缘计数做尺寸测量;刻度校准把像素换算成毫米。这一阶段可以开始碰 I/O 接口和 OPC 兼容接口了,把判定结果送给 PLC 或者上位应用。有一个细节要注意,变量类型要提前规划好:往外送真假值就用 Boolean,送测量数据就用 Number,送条码内容就用 String,类型选错了,通讯那头收到的就是空值。
还有一个具体技巧值得单独说:给你的程序单元起名和排版的习惯。每加一个算法,顺手在变量窗口里给它对应的变量起个带位置和功能的名字,比如 LeftEdge_Pt、Barcode1_Str。程序窗口里的单元顺序按执行逻辑从上到下排好,别东一块西一块。这个习惯在程序只有五格的时候看不出价值,等到二十格的时候,它就是你能不能在两分钟内定位问题的分水岭。
最后说个我自己的教训。早年做一条检测流程,读码总是不稳,我一遍遍调算法参数,调了两天才想起来去看监视窗口,里面早就提示执行时间异常,某个单元在反复重试。从那以后我每次开新流程,第一件事就是把监视窗口打开放在旁边,改完参数先单步走一遍再连续跑。这个习惯救过我很多次,也让我明白一个道理:机器视觉里大部分所谓玄学,其实是没看对地方。
希望帮到你,从装一张图开始就行。
本文还有配套的精品资源,点击获取