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

张开发
2026/4/18 2:02:18 15 分钟阅读

分享文章

工业视觉踩坑实录(十):拼出来的图变形了,尺寸测量全废——高精度拼接测量的那些坑
工业视觉踩坑实录十拼出来的图变形了尺寸测量全废——高精度拼接测量的那些坑摘要一个10厘米的圆形金属零件要测它的半径、直径、同心度精度要求极高。听起来很简单是吧放个大倍率镜头拍一张跑个轮廓提取算法几行代码的事。问题是精度要求高到单张拍不下来。关于作者我接触视觉整整10年。机器视觉、烟草、煤矿等行业都有深度开发经验。从硬件选型、算法开发、模型训练到上位机开发及部署都在一线磨过。之前是多家公司人工智能团队的技术负责人。现在自己创业了还在继续做视觉落地这件事。作者说尺寸测量这个事它和缺陷检测有根本性的区别。缺陷检测只关心有没有——这个零件上有划痕吗有裂纹吗有就报警没有就放行。像素级精度对它来说不是刚需。尺寸测量不一样。它关心的是多少——这个半径到底是多少毫米精度要求可能是±0.01mm甚至更高。这意味着你对像素和物理尺寸之间的映射关系要有非常精确的把控。但凡做过精密测量的人都知道这里面的坑比你想的多得多。镜头畸变、标定精度、光源均匀性每一个环节都在蚕食你的精度余量。而今天这篇要讲的是一个更隐蔽的坑——图像拼接带来的尺寸变形。一个零件单张拍不全得多拍几张拼起来。拼是拼上了可测出来的尺寸不对了。这个问题搞了我将近两周。小零件、大精度背光下的尺寸测量先交代一下场景。被测物是一个圆形的金属零件大概10厘米×10厘米的样子。要测的是半径、直径这类的尺寸精度要求很高——具体数字不方便说但总之不是那种差不多就行的级别。光源用的是背光。背光的好处是能把零件的轮廓打得很清晰边缘锐利轮廓提取算法跑起来效果很好。金属零件放在背光板上光从底下透上来零件本体挡住光成像就是一个清晰的黑色轮廓套在白色背景上。对于尺寸测量来说这种光路几乎是理想配置。边缘清晰信噪比高二值化阈值不敏感。那为什么不直接一张拍完呢因为精度。要达到目标精度每个像素对应的物理尺寸必须足够小。你可以理解为——你拿一把尺子量东西刻度越细越准。像素就是这个刻度。10厘米的零件如果用大倍率镜头拍单个视场可能只有3厘米×3厘米拍不全整个零件。那如果把镜头换小、工作距离拉远让整个10厘米都进画面呢行是行但每个像素代表的实际尺寸变大了精度直接往下掉。这就是尺寸测量里的经典矛盾拍得全和测得准天然是对立的。单张拍不全那就多拍几张拼成一张大图在大图上做尺寸测量。思路很清晰。但这条路上有一个致命的坑我也是踩进去之后才明白的。两个电机、九宫格拼接方案的诞生既然要多拍就得让相机动起来。方案是两台电机一台走X方向一台走Y方向。相机装在XY运动平台上每个方向走3个位置3×39个位置每个位置拍一张。九宫格。跟手机全景拍照差不多思路只不过是工业级的精度要求。每张图的视场大概是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的图像拼接工具有三种方式CopyRegionTool——直接硬拷贝。两张图的位置是固定的知道偏移量就直接像素对像素拷过去。简单粗暴但不处理重叠区域的融合。PatMax特征匹配——就是前面说的特征匹配方案。通过PatMax在重合区域做高精度定位然后无缝拼接。标定板拼接——这个是关键。标定板拼接的做法是这样的第一步放一块标定板。标定板固定不动大小要能覆盖整个相机运动范围。比如相机要扫3×3的九宫格那标定板就得比这个九宫格的总面积还大。第二步相机在9个位置分别对标定板拍照。每张照片上都能看到标定板的棋盘格图案。第三步对每张照片做CheckBoard标定。标定的结果是什么呢是这张图像上每个像素对应标定板坐标系下的哪个物理坐标。关键就在这。做完标定之后每张图的输出坐标系都是标定板的物理坐标系。不是图像坐标系是带真实物理单位毫米的坐标系。第四步用CogImageStitch工具做拼接。先调用AllocateBlendingBuffer指定统一的大图坐标系——就是标定板坐标系。然后逐张调用BlendImageIntoBuffer把每个位置的图像写入大图的对应位置。这里的核心是图像的对齐是靠标定板坐标系完成的而不是靠特征匹配。标定板坐标系是物理坐标系它不会对图像做仿射变换或透视变换只是把每个像素放到它应该在的物理位置上。没有特征匹配就没有匹配误差。没有变换就没有变形。图像在拼接过程中保持原始的像素密度每个像素对应的物理尺寸和标定时完全一致。这才是一个适合尺寸测量的拼接方案。踩坑细节原理听起来很完美。实际做的时候也有不少坑。标定板必须固定好。整个拍摄过程中标定板不能有丝毫移动或形变。哪怕偏了0.1mm后面的所有标定结果都会受影响。我们用了机械固定的方式标定板直接用螺丝锁在底座上不允许任何松动。标定板的打印精度要够。标定板上棋盘格的角点位置精度直接决定标定精度。普通的打印标定板角点位置误差可能有好几十微米。对于高精度测量来说几十微米的标定板误差会直接传递到测量结果里。后来换了一块高精度加工的玻璃标定板角点精度做到了微米级标定残差从0.5个像素降到了0.2个像素以内。拍摄过程不能有振动。相机到位之后要等振动衰减再拍照。有些运动平台在到位之后会有残余振荡虽然肉眼看不出来但在像素级别已经能影响到标定板的角点提取精度了。标定板要覆盖整个运动范围。这个很多人容易忽略。标定板太小的话边缘的几个位置可能拍不到标定板的角点标定就没法做。所以标定板的尺寸要留足余量比实际运动范围大一些。不止康耐视说实话标定板拼接这个思路不是康耐视的专利。其他做机器视觉软件的厂商也有类似的功能核心逻辑都是一样的——用标定板把所有子图像统一到一个物理坐标系下避免图像变换引入的尺寸误差。如果你手头用的软件没有现成的标定板拼接工具理论上也可以自己实现。流程就是在9个位置分别对标定板做相机标定拿到每张图的单应性矩阵图像坐标→标定板坐标然后用反向映射把所有像素放到统一的大图上。OpenCV里有一整套相关的函数可以用。不过自己做的话工作量不小而且有些细节处理不到位的话效果可能还不如商业软件。有现成的工具就直接用吧别重复造轮子。回头看这个项目最大的教训是——拼接方案的选择不能只看图能不能拼上还要看拼完之后尺寸变没变。缺陷检测和尺寸测量对拼接的要求是截然不同的。检测要的是视觉连续性拼接缝看不见就行。测量要的是几何保真度每个像素代表的物理尺寸不能变。如果一开始就从尺寸测量这个需求出发去选拼接方案可能就不会走特征匹配那条弯路了。还有一个教训运动机构的精度要和算法的精度匹配。不是算法能力强就能弥补机械的不足。±0.05mm的定位误差在普通检测里可能无所谓但在精密测量里就是灾难。标定板拼接这个方案我后来在几个类似项目里都用上了效果一直很稳定。如果你也遇到需要拼接做精密测量的场景强烈建议直接走标定板这条路。特征匹配拼接不是不好只是不适合这个场景。作者头帕王子系列专栏工业视觉踩坑实录如果觉得有用点赞关注不迷路 如果你也在做类似的工业视觉项目希望这篇文章能帮你少走些弯路。有问题欢迎留言或加我好友讨论。相关专栏工业视觉踩坑实录

更多文章