ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

视觉测量中的虚宽高与实宽高:从相机标定到对齐约束的尺寸还原方法

视觉测量中的虚宽高与实宽高:从相机标定到对齐约束的尺寸还原方法 1. 先把概念摆清楚实宽高、虚宽高到底差在哪1.1 虚宽高相机看到的假尺寸做测量的朋友基本都栽过同一个跟头拿起一张照片用图像上目标的像素数除以分辨率直接换算物理尺寸然后发现结果和真实尺子量的对不上。这不是你算错了而是从一开始就把图像里的宽高当成了真实的宽高。虚宽高就是物体经过相机透镜和透视投影之后在图像平面上呈现出来的那个宽高。它是个脏数据里面混着视角倾斜、镜头畸变、拍摄距离变化带来的各种变形。只要相机不是正对着被测目标目标不是完美平行于成像面图像上的宽高就一定不等于物理世界的宽高。举个例子。我做过一个产线工件尺寸抽检项目相机斜着架在产线上方45度视野里躺着十几个零件。从图像坐标看每个工件的高度被压缩到真实高度的0.71倍左右宽度则因为倾斜关系略有放大。如果不处理这个偏差量出来的高度直接差出30%以上放在公差只有正负0.5毫米的产线上这数据根本没法用来做决策。虚宽高虽然假但它并不是废数据。它是整个测量链条的第一手信息——所有后续的校正、对齐、还原都要从这个图像坐标上的数值开始。RGA的处理思路从来不是绕过虚宽高而是把它老老实实捡起来再通过标定参数和几何约束一层层洗干净。1.2 实宽高物体自己的真尺寸与虚宽高相对实宽高是物体在三维物理空间中真实占据的长度和高度。它不随拍摄角度改变不随相机位置移动是物体本身固有的属性。视觉测量的最终目标就是把这些实宽高从虚宽高的表象里完整地剥离出来。但这里有个容易忽略的细节实宽高往往不等于简单的包围盒宽高。如果被测物体形状不规则比如L形支架、带圆角的注塑件、有开孔的钣金件直接量整个包围盒会引入系统性偏差。在RGA中我习惯把实宽高定义为被测物体所附着的主平面通常是地面、桌面或料盘面上目标轮廓关键线段对应的真实长度。也就是说宽和高不是随便量出来的而是针对特定几何特征定义出来的数值。1.3 中间隔着三层账从虚宽高到实宽高不是一步就能跨过去的中间至少隔着三层麻烦。第一层是透视投影。三维空间中的一个点经过相机内外参变换投影到图像平面上这个过程本身就是有损的——它不是等比例缩放而是中心投影下的几何变换。同一个物体近大远小倾斜压缩这是透视的天然属性。第二层是镜头畸变。径向畸变让直线变弯切向畸变让画面歪斜。工业相机的定焦镜头还好一点如果是短焦镜头或者广角镜头畸变在图像边缘区域会非常明显如果不校正特征点的位置会产生好几个像素的偏差。第三层是被测物体与成像面的不平行。就算镜头畸变完全消除只要被测平面与成像面有夹角图像上不同区域的尺度就不一样。靠近相机的一头看着大远离的一头看着小。这三层账加在一起决定了虚宽高和实宽高之间隔着一套完整的相机模型这个事实。忽略任何一层最终的测量结果都会失之毫厘、谬以千里。2. 对齐约束虚转实的钥匙2.1 为什么非对齐不可单靠一张照片理论上能不能恢复出物体的真实尺寸答案是能但必须满足前提有足够的约束条件。这个问题可以这样理解——单目相机拍摄时天然丢掉了深度信息同一个虚宽高可以对应无数种距离不同、尺寸不同的实宽高组合。你看一张照片里面一个杯子你没法判断它是近处的小杯子还是远处的大杯子。这就是所谓自由度过剩。要解决这个问题就得引入约束。约束的本质是给求解过程补上自由度不足的账。三维空间有六个自由度三轴旋转加三轴平移图像平面只提供两个自由度。从二维还原三维就是一场用约束换自由的交易。拿最典型的平面测量场景来说被测物体贴在地面上地面本身就是一个强约束——它把所有特征点都限制在一个二维平面内部。这等于把六个自由度砍掉三个剩下的三个自由度平面的旋转和位移就靠标定板提供的真实尺度来校准。得到平面的单应矩阵之后任意一个在平面上的点都能从图像坐标映射回真实世界坐标。所以对齐约束不是框架里锦上添花的可选项是测量的地基。没有对齐虚宽高就永远只是虚宽高。2.2 四类对齐约束我实际用下来的效果在实际项目里我通常把对齐约束分成四类来用。共面约束被测特征点都落在同一个平面上。这是最常用、也最容易被新手忽略的约束。操作上我会先在图像里选取至少三个已知真实坐标的标定点通常来自标定板或者加工精度很高的定位孔然后求解这组点对应的单应矩阵。有了单应平面上的任何点都能还原。共线约束多个特征点位于同一条直线上。长条形工件、板材的边缘检测都适合用这种约束。比如测量一个长条的铝合金型材截面型材的两端点是应该位于一条水平线上的共线约束可以保证直线方向估计稳定不会因为边缘提取噪声而歪斜。垂直约束两条线段相互垂直。矩形、L形结构件都可以用。拍照时因为透视原本垂直的两条边在图像上会变成不垂直垂直约束会让优化过程把角度校正回90度。等距约束同一平面内多个目标之间的间距相等。这在元件排列整齐的场景里特别有用。比如PCBA板上的定位孔间距设计上是固定等距的但相机角度微倾斜会让图像上的孔距出现左短右长的假象。等距约束做全局优化后所有孔距被统一到设计值附近后续贴片设备拿到的坐标数据才能真正拿来用。四类约束按场景选择不要贪多。在简单场景里共面约束加垂直约束通常就够用。等距约束和共线约束属于锦上添花当数据噪声较大时能帮你把整体误差压下来。2.3 约束不是越多越好它们会打架这是我做RGA过程中体会最深的一件事。约束本质上是在给优化问题增加惩罚项但不同约束之间可能并不自洽。举个实际例子。我有一次用共线约束要求点A、点B共线同时又用垂直约束要求线段AB与线段CD垂直。理论上没问题但问题出在特征点的实际提取结果上。A点提取偏了0.3像素B点偏了0.2像素这种情况下两条约束在数值上就不能被同时完美满足。你硬要同时满足优化过程就会在这两股力量之间反复拉扯最后结果要么收敛到中间某个妥协值要么直接发散。正确的思路是给约束分配权重。我一般用加权最小二乘来解决。置信度高的约束比如标定板上精确加工出来的孔距尺寸权重给到1从图像边缘用视觉算法提取出来的点受到光照、噪声影响对应的约束权重压到0.5左右。然后根据迭代后的重投影误差来回调整权重直到结果稳定。提示硬约束几何上必须满足的比如共面就直接代入方程计算不要做加权。软约束条件性先验比如等距才适合用权重来控制。把硬约束人为放软结果会飘把软约束强行拉硬结果会炸。这个分寸感靠项目经验积累。3. 实操从一张照片算出真实宽高3.1 环境准备与场景搭建先摆一下实际环境方便你照着复现。一台普通工业相机分辨率1600x1200配定焦镜头。一块陶瓷标定板7x7圆点阵列圆心距标称精度正负0.005毫米。被测物体一块矩形金属块设计尺寸120毫米x60毫米厚度30毫米。固定夹具用来保证被测物体和标定板底部在同一水平面。先做相机内参标定。这个环节不能省也不能偷懒。拿出标定板拍摄至少15张不同角度的图像。所谓不同角度不是平移标定板而已要真正让标定板相对相机产生俯仰和偏转的变化。角度覆盖越广标定结果的稳定性越好。标定流程我用的是OpenCV的calibrateCamera具体步骤拍摄15-20张标定板图像覆盖视野中央和边缘每张之间标定板的倾斜角度都不同。检测圆点中心得到亚像素坐标。调用calibrateCamera求解内参矩阵K和畸变系数。检查重投影误差必须小于0.1像素否则说明拍摄角度覆盖不够重拍。标定完成后记录内参fx、fy、cx、cy和畸变系数k1、k2、p1、p2。这些数据后面都要用到。放置被测金属块时有个关键动作让它的下表面和标定板面处于同一个高度平面。如果你手工放置很难保证1毫米以内的高度一致性所以我用了高度卡块来辅助定位把被测机构直接卡在基准面上。这个细节直接影响后续单应矩阵的正确性。3.2 提取关键特征点镜头畸变如果明显第一步先对整幅图像做去畸变操作。用cv2.undistort把图像拉直但要留意去畸变后的图像边缘会出现黑边所以在拍摄取景时要留出至少10%的余量避免关键特征被切掉。对矩形金属块进行特征提取的思路Canny边缘检测拿到轮廓。霍夫直线检测找到四条主边。两两求交点得到四个顶点坐标。这一步得到的四个顶点坐标就是虚宽高的直接体现。它们之间在图像平面上的间距就是看起来的宽高。假设计算后得到四个顶点像素坐标为P1(510, 670)P2(890, 650)P3(920, 890)P4(520, 900)。用欧氏距离公式算一下图像上的宽P1到P2的距离约381.5像素。图像上的高P1到P4的距离约230.2像素。这两个数值显然不可能是120毫米和60毫米它们被透视和畸变严重扭曲了。下一步就是要通过单应矩阵把这些图像坐标还原到世界坐标。3.3 单应矩阵的求解与实宽高的还原单应矩阵H描述的是世界平面上的点到图像平面上的点的映射关系。只要被测物体和标定板处于同一个平面这个关系就是成立的。我习惯用标定板上的12个圆点中心作为参考点。世界坐标是已知的以标定板一个角为原点建立坐标图像坐标通过圆心检测获得。四点就能解H但我用12点配合RANSAC主要是为了把某个圆点提取异常带来的影响剔除掉。求解完成之后把刚才图像上的四个顶点逐一映射回世界坐标每个像素坐标都扩展为齐次坐标乘以H的逆矩阵。得到的齐次结果除以最后一个分量得到三维空间中的坐标。计算一下P1和P2在世界坐标下的欧氏距离得到金属块的宽度P1和P4的距离得到高度。实测下来金属块宽度119.8毫米高度60.1毫米。真实值是120毫米和60毫米误差控制在0.3毫米以内。对产线公差正负0.5毫米的场景来说完全够用。3.4 对齐约束的落地方式单应矩阵流程其实已经隐式用到了共面约束——单应本身就是平面到平面的映射。但在实际项目中物体经常不能完美摆正会带着几度的旋转角。这时候需要两个额外的对齐步骤。第一步是图像旋转对齐。用边缘检测得出长边方向角把图像旋转到长边水平。这一步会让后续的约束计算更直观也更稳定。第二步是约束优化。以单应矩阵初步还原出的顶点坐标作为初值迭代增加平行约束两条长边平行、两条短边平行和垂直约束长边与短边垂直。用高斯牛顿法迭代目标函数是重投影误差。加了约束之后的效果我实测很直观四个顶点的重投影误差从1.8像素降到0.4像素。世界坐标下计算出的宽度从120.5毫米修正到120.0毫米。约束驱动的不是把结果改对而是让结果符合几何先验这才是它真正的价值。3.5 结果验证的几个硬指标算法跑完不能直接信至少做三遍验证重投影误差验证把还原出的世界坐标顶点重新投影回图像平面和实际提取的图像点位置比较。像素偏差必须小于0.5像素如果大于这个数说明求得的H或者约束优化结果不可靠。卡尺实测验证拿游标卡尺实际测量金属块与算法数值做对比误差在公差范围以内才算通过。重复性实验验证同一工件拍10次重新运行整个流程。计算10次结果的均值和标准差标准差小于0.2毫米才算稳定性达标。这三层验证是我从第一次做RGA就定下的规矩。少了任何一层都可能在交付给下游时出问题。4. 常见问题与排查技巧实录4.1 测出来的宽高和真值对不上先查共面如果最后的计算结果和真值差出一大截第一嫌疑人永远是被测物体与标定基准不在同一平面。单应矩阵只适用于平面到平面的映射。物体悬空了、倾斜了、底部垫了东西映射关系全乱。排查方法很简单在基准面上放一个已知厚度的量块把被测物体放上去再测一次。如果测量结果明显偏移偏移量和量块高度成正比那就可以确认是共面问题。解决的办法只有两个要么物理上保证被测面与基准面同高要么单独标定一次载物台平面把标定板和被测物分开处理。第二个方案更可靠因为载物台平面的空间姿态一旦标定只要相机不动就能长期复用。4.2 约束打架结果不稳定怎么办前面提过共线、垂直、等距各类约束会在数值上互相冲突。我碰到的典型情况是一个方形工件同时加共线、共面、等距、垂直四组约束重投影误差死活下不来始终卡在1.5像素附近迭代到后面干脆发散。排查后发现问题出在等距约束的噪声上——等距约束依赖的孔位提取结果里有好几个点提取偏了给等距约束提供了错误的信息。处理方式分两步。先把容易出问题的等距约束权重从1降到0.3用共面和垂直这两个硬约束跑一轮结果迅速收敛到0.5像素。然后逐步把等距约束权重调回0.8误差依然稳定在0.5像素附近。这个结果说明约束本身没问题是初始权重分配不合理导致的冲突。4.3 畸变校正别让它成为隐藏杀手镜头畸变是个容易被忽略的坑。尤其是短焦镜头图像边缘的畸变肉眼都能看出来——直线变弯、圆形变椭圆。忽略畸变校正特征点位置偏2到3个像素很正常换算成物理尺寸可能就是0.4毫米直接超出公差。我的建议是不管镜头畸变是否肉眼可见特征提取之前先做去畸变。标定完成后每次都跑一遍undistort流程固定不带侥幸心理。还有一个细节标定时重投影误差如果超过0.15像素就得回头检查标定图像数量和角度覆盖度别着急往下走。4.4 光照不均边缘提取飘了被测物体表面反光是视觉测量场最常见的噩梦。一块金属块棱边在高光下看着非常亮边缘检测算法会把高光中心当成边而不是真正的棱边。这种误差不容易直接看出来因为提取出来的线看起来还是挺直的但坐标已经整体偏移了换算成毫米就是实打实的尺寸误差。我的对策有两条。第一条是打光方案。用两个条形光源从两侧45度斜照让棱边形成稳定的阴影对比。高光区域被削弱阴影区域提亮边缘检测就稳定了。第二条是对边缘检测算法做置信度处理。在弱梯度区域边缘置信度低对应的特征点权重自动下调。这样即使边缘有干扰对最终优化结果的影响也被控制住了。4.5 基准面的隐藏平面度问题载物台本身不平是视觉测量里最隐蔽的风险之一。很多看似光洁的铝板、亚克力板实际本身有0.5到1毫米的起伏。把这样的板子当基准面就等于把板子的起伏误差复制到所有测量结果里。我现在的做法是备一块经过平面度研磨的基准板所有测量都在基准板上完成。基准板的平面法向量和高度在相机标定阶段一并解出后续每次测量都会把这个平面姿态作为已知条件参与计算。这样虽然前期多一道工序但后面省掉很多次因为莫名其妙测不准而做的返工调试。4.6 快速排查对照表症状可能原因排查方法解决方案宽高整体偏大或偏小被测面与基准面不共面放量块做梯度测试保证共面或单独标定载物台平面结果在不同角度拍摄时漂移约束冲突或权重失衡逐项关停约束观察误差按置信度调权重边缘提取点明显偏移镜头畸变未校正查看图像边缘直线弯曲统一去畸变后再提取特征金属表面反光导致结果不稳光照方案不合适检查边缘检测掩码分布双45度条形灯斜打光重复测量标准差偏大载物台平面不平整换不同位置放目标测引入研磨基准板重投影误差降不下来初值不合理检查单应矩阵质量换RANSAC重解单应矩阵这个表是我项目排查时直接拿来对照用的基本上能覆盖绝大多数常规问题。遇到不在这张表里的情况优先怀疑标定的稳定性重新做一遍完整流程往往就能定位到问题。5. 几句踩坑后的体会第一次做RGA系统时我也被虚宽高狠狠坑过一次。纯粹照搬OpenCV的函数做相机标定和单应变换结果测出来的宽度死活差10毫米。那时候我还没理解对齐约束的真正意义以为标定完内参就是所有准确度的来源。后来静下心一层层拆解才明白标定只是把相机的眼睛校准了测量对象本身和世界坐标系的对应关系——也就是对齐约束——才是决定测量准不准的那把钥匙。现在我接任何和视觉尺寸相关的项目第一件事永远是确认被测面和参考面的对齐关系其次才开始挑算法。这个顺序反了后期大概率要在排查问题上多花三倍的时间。每次想到这点我都会提醒自己相机标定解决的只是看得清对齐约束解决的才是测得准。这个系列后面还有一篇要聊具体误差来源和数据处理管线的落地到时候会把完整项目和实际代码贴出来方便你直接对着跑。
返回列表