工业视觉踩坑实录(十):拼出来的图变形了,尺寸测量全废——高精度拼接测量的那些坑
2026/4/18 2:02:14 网站建设 项目流程

工业视觉踩坑实录(十):拼出来的图变形了,尺寸测量全废——高精度拼接测量的那些坑

摘要:一个10厘米的圆形金属零件,要测它的半径、直径、同心度,精度要求极高。听起来很简单是吧?放个大倍率镜头拍一张,跑个轮廓提取算法,几行代码的事。问题是,精度要求高到单张拍不下来。


关于作者

我接触视觉整整10年。

机器视觉、烟草、煤矿等行业都有深度开发经验。从硬件选型、算法开发、模型训练,到上位机开发及部署,都在一线磨过。

之前是多家公司人工智能团队的技术负责人。现在自己创业了,还在继续做视觉落地这件事。


作者说

尺寸测量这个事,它和缺陷检测有根本性的区别。

缺陷检测只关心"有没有"——这个零件上有划痕吗?有裂纹吗?有就报警,没有就放行。像素级精度对它来说不是刚需。

尺寸测量不一样。它关心的是"多少"——这个半径到底是多少毫米?精度要求可能是±0.01mm甚至更高。这意味着你对像素和物理尺寸之间的映射关系要有非常精确的把控。

但凡做过精密测量的人都知道,这里面的坑比你想的多得多。镜头畸变、标定精度、光源均匀性,每一个环节都在蚕食你的精度余量。

而今天这篇要讲的,是一个更隐蔽的坑——图像拼接带来的尺寸变形

一个零件,单张拍不全,得多拍几张拼起来。拼是拼上了,可测出来的尺寸不对了。

这个问题搞了我将近两周。


小零件、大精度:背光下的尺寸测量

先交代一下场景。

被测物是一个圆形的金属零件,大概10厘米×10厘米的样子。要测的是半径、直径这类的尺寸,精度要求很高——具体数字不方便说,但总之不是那种"差不多就行"的级别。

光源用的是背光。背光的好处是能把零件的轮廓打得很清晰,边缘锐利,轮廓提取算法跑起来效果很好。金属零件放在背光板上,光从底下透上来,零件本体挡住光,成像就是一个清晰的黑色轮廓套在白色背景上。

对于尺寸测量来说,这种光路几乎是理想配置。边缘清晰,信噪比高,二值化阈值不敏感。

那为什么不直接一张拍完呢?

因为精度。

要达到目标精度,每个像素对应的物理尺寸必须足够小。你可以理解为——你拿一把尺子量东西,刻度越细越准。像素就是这个"刻度"。

10厘米的零件,如果用大倍率镜头拍,单个视场可能只有3厘米×3厘米,拍不全整个零件。那如果把镜头换小、工作距离拉远,让整个10厘米都进画面呢?行是行,但每个像素代表的实际尺寸变大了,精度直接往下掉。

这就是尺寸测量里的经典矛盾:拍得全和测得准,天然是对立的

单张拍不全,那就多拍几张,拼成一张大图,在大图上做尺寸测量。

思路很清晰。但这条路上有一个致命的坑,我也是踩进去之后才明白的。


两个电机、九宫格:拼接方案的诞生

既然要多拍,就得让相机动起来。

方案是两台电机,一台走X方向,一台走Y方向。相机装在XY运动平台上,每个方向走3个位置,3×3=9个位置,每个位置拍一张。

九宫格。跟手机全景拍照差不多思路,只不过是工业级的精度要求。

每张图的视场大概是4厘米×3厘米左右。9张图拼在一起,覆盖面积超过12厘米×9厘米,足以包住整个10厘米的零件,边缘还有余量。

相邻两张图之间有大约25%的重合区域。重合区域是拼接的"胶水"——算法需要通过重合区域的特征来对齐两张图。

方案看起来没什么问题。但真正跑起来,第一个坑就来了——电机精度。

丝杠不够用

一开始用的是步进电机加丝杠传动的方案。丝杠导程5mm,步进电机200步/转,做16细分之后理论分辨率是0.0015mm/步。听起来很精细了对吧?

实际跑起来发现,重复定位误差在±0.05mm左右。

0.05mm。在像素空间里,如果单像素是0.015mm(大约这个量级),那0.05mm的误差就是3到4个像素的偏差。

你想想看,两张图在重合区域对齐的时候差了3到4个像素,拼出来的大图在接缝处就会有明显的错位。做尺寸测量?别想了。

一开始以为是安装的问题,重新调了导轨、紧了螺丝,改善不大。后来查了丝杠的参数——丝杠本身有螺距误差和回程间隙,步进电机又没有反馈,跑多了以后位置漂移是正常的。

最后换了方案:步进电机换成伺服电机,加编码器做闭环控制。丝杠也换了精度更高的一档。重复定位精度做到了±0.01mm以内,在像素空间里不到1个像素的偏差,这才勉强够用。

我自己的感受是,很多人做视觉项目的时候,会觉得"拼接嘛,算法能补偿"。对,算法确实能补偿一部分。但机械精度是基础,基础不行,算法再怎么折腾都是在给一个歪的地基做精装修。你装修得再漂亮,房子还是歪的。

背光也有坑

另外顺便说一个光源的坑。

背光源的均匀性在整个运动范围内必须一致。相机在9个位置分别拍照,如果不同位置的背光亮度不一样,拼出来的大图就会有明暗条纹。对于轮廓提取来说,亮度不一致会影响二值化阈值,进而影响边缘位置的判断。

一开始用的背光源在中心位置亮度很好,但到边缘稍微暗了一点。别小看这一点——暗了百分之几,边缘可能就会偏移零点几个像素。对精密测量来说,零点几个像素的边缘偏移就是几丝的误差,完全不能忍。

后来换了一块更高均匀性的背光板,这个问题才算解决。


拼接让图变形了:尺寸测量失去意义

电机的问题解决了,拼接算法跑起来了,9张图拼成一张大图。

图是拼上了,看起来也还算整齐。但跑尺寸测量的时候,数据不对。

测出来的半径,跟单张拍局部区域测出来的半径,差了将近0.5%。

0.5%。在10厘米的零件上,这就是0.5mm。对于精密测量来说,这个误差完全不可接受。

一开始怀疑是标定的问题。重新做标定,换了标定板,多角度拍了20多张,精度提升了一点,但0.5%的偏差还在。

又怀疑是镜头畸变校正不够。重新优化了畸变模型的参数,边缘的残差从0.5个像素降到了0.2个像素,偏差还是在。

折腾了好几天。最后才想明白——问题出在拼接本身

特征匹配在"偷偷"变形你的图

我们用的拼接方式是经典的特征匹配拼接:提取相邻两张图重合区域的特征点,算出一个变换矩阵(仿射变换或者透视变换),然后把其中一张图变换到另一张的坐标系下。

这个过程在缺陷检测里完全没问题。拼接之后的图可能有一点点变形、一点点拉伸,但人的眼睛看不出来,检测算法也不在乎。缺陷是圆的还是椭圆的?划痕是直的还是弯的?这些信息在微小的变形之后依然能保留。

但尺寸测量不行。

仿射变换和透视变换会引入缩放。哪怕只有0.3%的缩放——你的图就被放大或缩小了0.3%。用这张被缩放过的图去测尺寸,结果自然就不准。

而且这种缩放不是全局一致的。因为9张图的拼接是逐对进行的,每对之间的变换都不一样。拼接的路径越长(比如第一张到第九张,中间要经过5次变换),累积的缩放误差就越大。大图的中心可能变形很小,但边缘可能已经被拉伸或压缩了好几次。

你用一张局部有变形的大图去做尺寸测量,测出来的结果自然是不可信的。

怎么说呢,这个坑的本质是:特征匹配拼接的设计目标是对齐图像,不是保持尺寸。它关心的是"两张图看起来接上了",而不是"接上之后每个像素代表的物理尺寸没有变"。

对于检测类应用,这是没问题的。

对于测量类应用,这是致命的。


标定板拼接:康耐视的解法

想明白问题之后,我开始找解决方案。核心诉求很明确:拼接之后不能引入变形

后来在康耐视VisionPro的文档里找到了一个方案——标定板拼接。

这个方案的思路和特征匹配拼接完全不同。

原理

VisionPro的图像拼接工具有三种方式:

  1. CopyRegionTool——直接硬拷贝。两张图的位置是固定的,知道偏移量就直接像素对像素拷过去。简单粗暴,但不处理重叠区域的融合。
  2. PatMax特征匹配——就是前面说的特征匹配方案。通过PatMax在重合区域做高精度定位,然后无缝拼接。
  3. 标定板拼接——这个是关键。

标定板拼接的做法是这样的:

第一步,放一块标定板。标定板固定不动,大小要能覆盖整个相机运动范围。比如相机要扫3×3的九宫格,那标定板就得比这个九宫格的总面积还大。

第二步,相机在9个位置分别对标定板拍照。每张照片上都能看到标定板的棋盘格图案。

第三步,对每张照片做CheckBoard标定。标定的结果是什么呢?是这张图像上每个像素对应标定板坐标系下的哪个物理坐标。

关键就在这。做完标定之后,每张图的输出坐标系都是标定板的物理坐标系。不是图像坐标系,是带真实物理单位(毫米)的坐标系。

第四步,用CogImageStitch工具做拼接。先调用AllocateBlendingBuffer,指定统一的大图坐标系——就是标定板坐标系。然后逐张调用BlendImageIntoBuffer,把每个位置的图像写入大图的对应位置。

这里的核心是:图像的对齐是靠标定板坐标系完成的,而不是靠特征匹配。标定板坐标系是物理坐标系,它不会对图像做仿射变换或透视变换,只是把每个像素"放"到它应该在的物理位置上。

没有特征匹配,就没有匹配误差。没有变换,就没有变形。图像在拼接过程中保持原始的像素密度,每个像素对应的物理尺寸和标定时完全一致。

这才是一个适合尺寸测量的拼接方案。

踩坑细节

原理听起来很完美。实际做的时候也有不少坑。

标定板必须固定好。整个拍摄过程中标定板不能有丝毫移动或形变。哪怕偏了0.1mm,后面的所有标定结果都会受影响。我们用了机械固定的方式,标定板直接用螺丝锁在底座上,不允许任何松动。

标定板的打印精度要够。标定板上棋盘格的角点位置精度直接决定标定精度。普通的打印标定板,角点位置误差可能有好几十微米。对于高精度测量来说,几十微米的标定板误差会直接传递到测量结果里。后来换了一块高精度加工的玻璃标定板,角点精度做到了微米级,标定残差从0.5个像素降到了0.2个像素以内。

拍摄过程不能有振动。相机到位之后要等振动衰减再拍照。有些运动平台在到位之后会有残余振荡,虽然肉眼看不出来,但在像素级别已经能影响到标定板的角点提取精度了。

标定板要覆盖整个运动范围。这个很多人容易忽略。标定板太小的话,边缘的几个位置可能拍不到标定板的角点,标定就没法做。所以标定板的尺寸要留足余量,比实际运动范围大一些。

不止康耐视

说实话,标定板拼接这个思路不是康耐视的专利。其他做机器视觉软件的厂商也有类似的功能,核心逻辑都是一样的——用标定板把所有子图像统一到一个物理坐标系下,避免图像变换引入的尺寸误差。

如果你手头用的软件没有现成的标定板拼接工具,理论上也可以自己实现。流程就是:在9个位置分别对标定板做相机标定,拿到每张图的单应性矩阵(图像坐标→标定板坐标),然后用反向映射把所有像素放到统一的大图上。OpenCV里有一整套相关的函数可以用。

不过自己做的话,工作量不小,而且有些细节处理不到位的话效果可能还不如商业软件。有现成的工具就直接用吧,别重复造轮子。


回头看

这个项目最大的教训是——拼接方案的选择不能只看"图能不能拼上",还要看"拼完之后尺寸变没变"

缺陷检测和尺寸测量对拼接的要求是截然不同的。检测要的是视觉连续性,拼接缝看不见就行。测量要的是几何保真度,每个像素代表的物理尺寸不能变。

如果一开始就从"尺寸测量"这个需求出发去选拼接方案,可能就不会走特征匹配那条弯路了。

还有一个教训:运动机构的精度要和算法的精度匹配。不是算法能力强就能弥补机械的不足。±0.05mm的定位误差在普通检测里可能无所谓,但在精密测量里就是灾难。

标定板拼接这个方案我后来在几个类似项目里都用上了,效果一直很稳定。如果你也遇到"需要拼接做精密测量"的场景,强烈建议直接走标定板这条路。特征匹配拼接不是不好,只是不适合这个场景。


作者:头帕王子
系列专栏:工业视觉踩坑实录
如果觉得有用,点赞关注不迷路 👋

如果你也在做类似的工业视觉项目,希望这篇文章能帮你少走些弯路。有问题欢迎留言或加我好友讨论。


📎相关专栏

  • 工业视觉踩坑实录

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询