1. 工业视觉里的“找茬”难题:为什么匹配算法这么重要?
干了这么多年工业视觉,我经常被问到的一个问题就是:“老师,我这个产品要定位,到底该用NCC匹配还是形状匹配?” 这个问题看似简单,背后却藏着工业视觉项目成败的关键。想象一下,你面前有一条高速运转的产线,上面流过的可能是手机主板、锂电池或者汽车零件。你的任务,就是让机器视觉系统像最老练的质检员一样,瞬间“认出”并定位每一个产品,不管它是歪了、暗了,还是被其他东西挡住了一角。这个“认出”的过程,就是模板匹配。
Halcon作为工业视觉领域的“瑞士军刀”,提供了两大主力匹配算子:create_ncc_model(NCC匹配)和create_shape_model(形状匹配)。很多新手朋友一上来就蒙圈,文档里参数一大堆,到底该选哪个?我见过不少项目,前期随便选了一个,结果在现场光照一变,或者产品表面有点油污,整个定位就全乱套了,只能通宵达旦地打补丁、调参数,苦不堪言。
其实,选择的核心不在于哪个算子更“高级”,而在于你的场景到底在“考”它什么。是考它的“记忆力”(对灰度信息的忠实复现),还是考它的“抽象理解力”(对几何形状的把握)?今天,我就结合自己踩过的无数个坑,用最直白的大白话,带你彻底搞懂NCC匹配和形状匹配的区别,并给你一套拿来就用的选择策略。我们会用一个经典的PCB板定位案例贯穿始终,手把手看代码、看效果,让你不仅知道“是什么”,更明白“为什么”和“怎么选”。
2. 初识两位“选手”:NCC匹配与形状匹配的本质区别
要做出正确选择,我们得先摸清两位“选手”的底细和脾气。别看它们最终都能输出一个位置和角度,但内在的工作原理截然不同,这就决定了它们各自擅长的“战场”。
2.1 NCC匹配:忠实的“像素复印机”
NCC,全称是归一化互相关匹配。你可以把它想象成一个极度严谨、一丝不苟的“像素复印机”。它的工作方式非常直接:
- 学习阶段:你给它一张模板图像(比如一个完美的芯片区域),它不做任何复杂的分析,而是直接把这块区域的灰度信息原原本本地记下来,生成一个模板。
- 搜索阶段:在待检测图像上,它拿着这个“灰度模板”像滑动窗口一样一点点移动,计算每个位置下窗口内的图像与模板的灰度相似度(即NCC分数,范围从-1到1,1表示完全匹配)。
- 输出结果:找到相似度最高的位置,认为这里就是目标。
它的核心特点是对灰度值绝对敏感。模板是什么灰阶,它就找什么灰阶。这带来了一个巨大优势:抗线性光照变化能力极强。什么叫线性光照变化?就是整个画面的明暗同时变亮或变暗,但对比度关系保持不变。比如,车间灯光明暗调节,或者产品表面反光均匀增强。在这种情况下,NCC匹配依然稳定,因为灰度值是成比例变化的,归一化后相关性不变。
但是,它的缺点也同样突出:
- 怕非线性光照:如果光照不均匀,比如部分区域有阴影、高光,导致模板和现场的灰度关系不再是简单的比例关系,NCC就会晕头转向。
- 怕遮挡和杂波:模板记的是所有像素。如果目标被挡住一块,或者旁边多出一些无关的图案(杂波),这些“意外”的像素会严重拉低相似度分数。
- 怕形变:它只认灰度,不关心形状。如果物体发生非仿射形变(比如轻微弯曲),即使形状没大变,灰度分布变了,它也找不准。
在Halcon中,我们使用 create_ncc_model 来创建NCC模型,用 find_ncc_model 来查找。
2.2 形状匹配:聪明的“轮廓理解者”
形状匹配,则像是一个聪明的“轮廓理解者”或“素描画家”。它不关心物体具体是亮是暗,它关注的是物体的几何轮廓(边缘)。
- 学习阶段:你给它模板图像,它首先会提取图像的边缘(比如使用
edges_sub_pix算子),得到一组轮廓点。然后,它对这些轮廓信息进行加工,生成一个对光照变化不敏感的“形状模型”。这个模型本质上是轮廓梯度方向的抽象表达。 - 搜索阶段:在待检测图像上,它同样提取边缘,然后在图像中寻找与模板形状轮廓最相似的边缘组合。
- 输出结果:找到形状最匹配的位置、角度和缩放比例。
它的核心特点是对灰度变化不敏感,对形状特征敏感。这带来了截然不同的优缺点:
- 优势:
- 抗非线性光照变化:只要边缘还能清晰提取,不管区域内部是亮是暗,是否有阴影,形状匹配都能工作。
- 抗局部遮挡:如果目标物体只被挡住一部分,只要还有足够多的特征边缘存在,它依然有可能通过剩余部分推断出整体位置。
- 支持缩放和部分形变:一些形状匹配算法(如Halcon的
create_scaled_shape_model)可以处理尺度的变化,对轻微的非刚性形变也有一定容忍度。


1265

被折叠的 条评论
为什么被折叠?



