ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

海康线扫相机平场矫正全指南:原理、实操与常见坑

海康线扫相机平场矫正全指南:原理、实操与常见坑 干机器视觉这些年平场矫正这个活儿看着不起眼翻车概率却一点都不低。尤其是线扫相机视场宽、行频高、光照环境千奇百怪图像上亮暗不均、明暗条纹是家常便饭。海康线扫相机在工业现场用得非常多MV-CL系列为代表的那批相机平场矫正功能本身是成熟的但很多人要么根本不知道有这功能要么采集标定图的方法不对矫正完反而更糟。这篇文章我就围绕海康线扫相机的平场矫正把原理、步骤、坑位一次讲透给正在和线扫图像较劲的朋友省点时间。先说我自己的经历。之前有个项目做锂电池极片外观检测线扫相机装好了图像中间亮两边暗得厉害检测算法里的阈值怎么调都稳定不下来。当时第一反应是换光源折腾了两天没解决最后静下心来从头查发现相机出厂默认的平场矫正参数根本没有针对现场光源做过标定等于带着一副别人的眼镜在看东西。重新做了一次完整的平场矫正之后整幅图像的均匀性直接提升了一个量级后面算法调参顺利得多。1 为什么线扫相机必须做平场矫正1.1 三个“不均匀”从哪来线扫相机和面阵相机不一样它本质上是“一行一行”地成像。传感器上那一排像素理论上应该对相同光强给出完全一致的响应但现实中没有绝对均匀的传感器。每个像素点由于制造工艺的微小差异光电转换效率会有百分之一到百分之几的偏差这就是PRNU光响应非均匀性。同时即使完全遮光每个像素也会因为暗电流不同而输出一个不为零的基线值不同像素之间还不一样这叫DSNU暗信号非均匀性。这两项叠加在一起拍出来的原始图像天生就带“纹”。除了传感器自身外部因素更明显。线扫相机的横向视场很大光源要照满整个幅面并不容易。LED光源在阵列排布时光源正下方和两颗灯珠之间的位置照度肯定不一样加了漫射板之后能缓解但很难彻底消除。再加上镜头的暗角效应图像宽度方向上中间亮、边缘暗是常态边缘衰减5%到20%都很正常。前一阵我帮客户调一台检铜箔的线扫设备视场600mm不做矫正之前同一张均匀白纸在图像左右两侧灰度能差30个灰度级。这种底子给算法缺陷检测根本没法做。还有一个很多人忽视的维度是时间方向。线扫相机是逐行曝光的如果光源亮度存在周期性波动比如LED驱动电源纹波太大或者使用了非恒流的PWM调光每行的曝光量就会不一样图像上就会出现水平方向的横条纹。这种条纹在单帧静态图里不明显但连续扫描时非常扎眼。平场矫正不能根治这种动态问题但可以通过合理的矫正流程把固定分量压掉这个后面我会专门讲。1.2 矫正公式与系数本质平场矫正的原理并不复杂核心就一句话让每个像素在同样的光强下输出同样的灰度值。计算公式是这样的Y_corrected (Y_raw - D) / (F - D) * Target这里Y_raw是原始灰度值D是暗场均值F是明场均值Target是你希望矫正后输出的目标灰度。D和F都是逐像素的也就是说相机或者算法会为传感器上的每一个像素分别保存一个暗场偏移值和一个明场增益值。矫正过程实际就是先扣掉每个像素的暗电流基线再乘一个系数把它的亮场响应拉齐。展开说D这一项主要解决DSNU问题。拍摄暗场时把镜头完全遮住此时每个像素的输出就是它的暗响应理论上应该都是0实际不是有的像素可能输出3、5有的可能输出十几。如果曝光时间很长、温度升高暗电流还会变大所以做暗场矫正时曝光时间尽量和生产工况一致这是很多工程师容易忽略的点。F这一项主要解决PRNU、光源均匀性和镜头暗角。在白场下采集的每个像素灰度值代表了“这个位置的光源亮度×镜头透过率×像素响应”三者叠加后的总结果。平场矫正就是把这一堆影响因素当作一个整体用系数抹平。但这里有个关键限制它只能校正静态的设备链路不能实时跟踪光源变化。光源衰减了20%矫正后的图像会整体偏暗但均匀性还在影响不大可如果光源的相对空间分布变了比如灯珠坏了一颗原来的矫正系数就不准了所以实践里光源一致性差的设备需要定期重做矫正。注意平场矫正不是“万灵药”它本质是逐像素的乘加运算。能抹平空间上的固定不均匀但对时间维度的随机噪声、光源动态波动无能为力。想清楚这一层后面遇到问题才不会瞎调。2 矫正前必须做好的三件事2.1 均匀白场怎么搭平场矫正最理想的状态是给相机提供一个在整个视场内照度绝对均匀的白场这样采集到的明场图像就只包含传感器和镜头的信息。实际做不到绝对均匀但越接近越好。工程上常用的几种方案积分球在积分球出口放置均匀漫射面均匀度可以做到98%以上是实验室和出厂标定的首选。缺点是体积大、价格贵现场设备一般不会常备。PTFE/硫酸钡漫反射白板专业光学标定用的材料漫反射特性好表面均匀抗环境光干扰能力强。价格不低但做一次矫正能用很久适合精度要求高的场景。氧化铝陶瓷白板硬度高、耐磨耐脏适合需要频繁做矫正的现场工位擦一下就能继续用。高克数亚光白纸临时凑合可以用但纸的纹理、厚度、拼接痕迹都会被刻进矫正系数里。如果是低精度检测或者只求肉眼均匀它够用高精度项目不建议后面排查问题会很痛苦。白板的尺寸也有讲究。宽度方向必须完全覆盖相机视场最好比视场宽1%到2%的余量防止边缘采样不足扫描长度方向也就是运动方向要保证相机在稳定运行之后采集至少几百行、最好是1000行以上的有效数据。白板放上去之后要尽量让它与被检物处于同一焦平面附近。虽然平场矫正对离焦不太敏感但焦距差异过大时镜头的边缘透过特性会变矫正系数会引入偏差。2.2 曝光、增益、行频必须和生产一致这是平场矫正里最容易踩的坑。很多工程师觉得矫正嘛随便拍一张白纸就行了结果矫正用的是小曝光、低增益实际生产用的是长曝光、高增益矫正完图像反而更难看了。原因是暗电流和增益的配合关系是动态的。D项暗场输出会随曝光时间变化F项又会受增益影响。如果你矫正时用了4000us曝光、1倍增益生产时却切到8000us、2倍增益矫正系数里的暗场偏移和明场增益都对不上图像就会出来奇怪的“偏色”或“负值”。所以我的习惯是矫正之前先锁定生产参数曝光时间、增益、行频、触发模式、ROI全部按实际生产工况来然后把参数固化到相机用户集中矫正完成后再确认一遍没有参数被改回去。另外还需注意相机位姿和光源状态。矫正时相机安装角度、光源高度、光源功率都要保持和生产一致。光源功率尤其重要有工程师图省事用较低功率做矫正因为怕白板反光饱和结果生产时把功率调回100%成像均匀性立刻变差。正确做法是把光源调到生产功率白场灰度太高就加中性密度滤光片或缩短曝光而不是动光源功率。提示矫正用目标灰度值建议设置在满量程的75%到90%。8bit相机取190到23012bit相机取3000到3600之间。目标灰度太低矫正系数信噪比不够太高部分响应偏高的像素可能饱和饱和像素参与计算会把矫正系数拉偏。2.3 采集帧数与去噪策略平场矫正的明场和暗场图像都带有随机噪声。单帧采集的明场图每个像素的灰度在真值附近跳来跳去如果直接用单帧图去做除法等于把噪声也当成固定不均匀性写进系数里。矫正之后本来连续的图像会被附加一层随机颗粒噪声。正确的做法是多帧平均。一般取32帧到256帧把每一帧对应像素求和再取平均随机噪声会按均方根收敛。具体帧数看现场噪声小的相机32帧就够环境EMC干扰大的现场建议128帧以上。有些相机固件自带多帧平均功能海康线扫相机在MVS里可以选择标定时的处理方式如果固件支持就尽量用固件省得自己写采集逻辑。自己写代码采集时要注意每一帧都在同一行频和同一曝光下采集中间不能切参数。实际采集过程中白板或相机要一直处于静止状态吗不一定。有些产线是运动过程中做矫正的比如白板贴着传送带扫过去这样采集到的明场图包含了运动的均匀性更接近生产真实状态。但如果用静止白板则需要保证光源稳定避免环境光直射用遮光帘挡住杂散光是最稳妥的。还有一个细节白板表面不能有手印、灰尘、纤维毛絮这些在矫正后会直接变成图像上的暗斑或亮斑足以让检测算法误报。3 海康线扫相机平场矫正完整实操流程3.1 在MVS里完成矫正海康线扫相机在MVS客户端里提供了比较完整的平场矫正入口。不同固件版本的节点名称略有差异但整体逻辑是一样的。我以常见的操作路径来说明具体菜单名以你手上相机的实际固件为准。第一步先把相机连接好打开MVS进入相机设置页面。找到平场校正相关节点通常会带FlatField字样比如FlatFieldCorrection这样的开关。先把模式设为Off拍一张当前状态下的原始图确认画面能看到明显的不均匀心里有个底。第二步做暗场采集。用镜头盖把镜头完全遮住注意接口处和镜头周围不能漏光。环境光强的车间里最好再盖一层黑色遮光布。在MVS里把平场校正模式切到Calibrate或者对应的标定模式相机或软件会先采集一帧暗场数据。如果有“暗场帧数”或“平均次数”的设置项建议设到32以上。第三步做明场采集。把白板放在视场下方打开光源到生产功率确认白板上没有反光点、没有遮挡物。在MVS里触发明场标定系统会采集多帧白场图像并计算每个像素的增益系数。处理完成后MVS通常会显示一个均匀性统计或者预览效果这时候把模式切到Apply或者On矫正就生效了。第四步验证。拿一张均匀的灰卡或者直接用白板连续采集几张图用软件里的剖面线工具拉一条横向灰度曲线看看起伏是否被压平。如果还有明显的局部暗带多半是白板表面有污染或者光源本身出现了局部衰减先排查这两个因素再重新标定。3.2 用SDK做矫正与系数管理如果项目需要批量部署或者自动化产线手动在MVS里点按钮远远不够。这种情况下可以用海康的SDK把平场矫正流程集成到上位机程序里。SDK做矫正的流程和MVS手动操作是一样的先设置相机参数然后抓取暗场图和多帧明场图计算D和F把矫正系数写入相机的非易失存储或者直接在上位机图像处理链路里完成矫正。两种方式各有适用场景。写入相机端的优势是矫正后的图像在数据输出前就已经处理好了不占用上位机CPU也不会给图像处理流水线增加额外延迟。而且相机内部的矫正通常是硬件处理对高行频应用没有压力。缺点是需要占用相机的存储空间不同型号的容量不同通常支持多组系数可以分别对应不同的生产配方。上位机处理的优势是灵活可以随时切换系数、做A/B对比甚至可以在采集后针对某块ROI单独做矫正。缺点是增加了CPU负载10GigE接口的高行频线扫相机每秒钟的数据量可能达到几百MB到几个GB逐像素计算压力不小如果算法链路本身已经很重就要谨慎选择。实现上如果是在.NET/C环境里流程大致是通过SDK采集一组暗场图和明场图的原始数据逐像素计算偏移表D和增益表G。G Target / (F - D)Y_corrected (Y_raw - D) * G。计算完把系数表保存为二进制文件放到产线配置目录下。上位机运行时加载系数文件在图像回调里对每一帧做查表运算。这里有一个性能优化的小技巧把浮点增益表预先量化为定点数比如扩大2^12倍存成unsigned short做运算时用整数乘再右移速度比浮点快很多。3.3 效果验证与参数保存矫正做完不是直接上线就完事了一定要做量化验证。我最常用的方法是在白板场景下采集一张图沿图像宽度方向取一条横向剖面线统计灰度均值和标准差。用一个具体的例子说明。之前调试一台设备矫正前的横向剖面线均值是180但左侧边缘只有150右侧边缘135最大最小值差45个灰度级标准差有12.6。做完矫正之后再采同一张白板横向剖面线均值稳定在200左右最大最小值差压到了3个灰度级以内标准差降到了0.8。这个数据单独看可能不够直观但对检测算法来说相当于把阈值的浮动空间从45个灰度级压缩到了3个缺陷判定的可靠性完全不是一个量级。验证通过之后记得把矫正系数保存到相机用户集。海康相机的用户集通常有UserSet0、UserSet1等多个位置建议把矫正系数和配套的曝光、增益参数放到同一个用户集里命名成类似“FFC_Default”“FFC_ProductA”这样的规范名称。这样即使现场有人误改了参数只要载入对应的用户集就能一键恢复到经过验证的状态。经验保存用户集之前把当前所有关键参数记录下来包括曝光、增益、行频、目标灰度、矫正模式、校正开关状态。导出一份参数备份文件放到项目文档里这是现场问题定位最快的手段之一。4 常见伪影与排查技巧实录4.1 矫正后边缘黑、中心依旧亮这种情况非常典型表现为图像中间亮、两侧暗即便矫正系数已经应用了效果还是不理想。原因大概率不在传感器而在明场采集时白板本身的光照就不均匀。说白了如果用于明场标定的白场本身就是中间亮、两边暗矫正系数会把“中间亮”当作标准等生产时对着同样分布的光源矫正后的图像自然还是中间亮。这不叫矫正失败这叫把光源缺陷固化进了系数里。解决思路分两步。第一步先评估光源均匀性。在白板位置放一个均匀反射体采集一张图拉横向剖面线看照度分布。如果边缘和中心差超过10%优先调整光源的安装高度、角度、漫射板或者增加条光的数量把光源本身的均匀性改善之后再矫正。第二步如果光源均匀性已经调到极限还是不够就需要接受“矫正能拉平传感器和镜头但拉不平光源”的现实在算法侧对图像做二次补偿或者考虑换用更均匀的面光源/积分球光源。4.2 周期性横条纹反复出现平场矫正之后图像上还残留水平的亮暗条纹而且位置不固定随着扫描进行不断变化。这种问题的根源基本都在光源的时域波动上。前面提过线扫相机是逐行曝光的如果光源亮度在时间维度上有周期性变化每一行的曝光量都会不同。平场矫正针对的是空间固定不均匀对时域波动无能为力。常见的诱因是LED驱动电源纹波大、PWM调光频率与相机行频不匹配。当PWM频率和行频存在拍频关系时条纹会像水波一样在图像上游走。排查方法是把相机固定在一个静止场景连续采集多帧观察同一像素位置的灰度随时间的变化。如果灰度呈正弦波动基本可以断定是光源问题。解决手段优先用恒流驱动的光源或者把PWM调光改成模拟调光如果只能PWM把PWM频率设定到行频的整数倍以上比如行频20kHzPWM至少50kHz以上能把拍频影响压到肉眼不可见。还有一个简单有效的验证技巧把曝光时间调到光源波动周期的整数倍让一个曝光窗口内包含完整周期的亮暗变化也能明显减少横条纹。4.3 画面残留亮线暗线平场矫正之后图像偶尔会出现单像素宽度的亮线或暗线而且位置基本固定。这种问题往往是传感器坏点或特殊响应点导致的平场矫正的乘加运算解决不了甚至会放大。坏点在暗场和明场下表现不同。有的像素输出始终偏高矫正在暗场扣偏移时扣不干净有的像素响应曲线和其他像素不一致增益系数拉不准。遇到这种情况优先用相机自带的坏点校正功能海康相机一般有DPC坏点校正相关节点把坏点坐标标定出来之后用相邻像素插值填补。这里要提醒一点坏点校正应该在平场矫正之后做。因为平场矫正会改变每个像素的增益坏点的表现也会随之变化先做平场再做坏点标定顺序更合理。如果坏点数量少一两颗的话也可以直接在算法侧做中值滤波效果差不多。4.4 多相机拼接处出现接缝宽幅检测项目里经常用两台或多台线扫相机拼接。每台相机独立做平场矫正之后拼接区域往往还是能看到明显的明暗分界线。原因很简单每台相机的目标灰度、光源照度、矫正系数都不一样即使在同一场景下采集输出的灰度范围也会有差异。处理思路是让所有相机共用同一个明场标定基准。实际操作中把目标灰度设成完全相同的值矫正系数计算完成之后在白板下分别采集每台相机的图像统计重叠区域的灰度均值用增益微调把各相机的输出拉到一致。海康的VisionMaster算法平台里有图像拼接和亮度均衡相关工具可以把各相机的图像先做亮度匹配再输出到检测流程。还有一个容易被忽略的坑相机的白平衡参数。彩色线扫相机做矫正之前需要先把红绿蓝三个通道分别做平场矫正或者使用白平衡之后的图像帧作为输入否则拼接缝位置色差会非常明显。别问我怎么知道的这个坑我在一个纺织检测项目里踩了一整天。5 进阶动态平场与一致性管理5.1 多档增益下的矫正策略很多设备的工艺参数会切换比如白天检测一种材料用低增益晚上换另一种材料需要高增益。如果只做一组平场矫正系数切换增益档位之后图像均匀性就会漂移。我见过有些项目图省事只做一组系数结果调试员手动改增益后图像出现奇怪的明暗条纹还以为是硬件坏了。实际上增益改变后暗电流和像素响应的工作点都变了原来的偏移项和增益项不再匹配。正确的做法是给每个常用的增益档位分别做一组矫正系数。这个工作量听起来大其实可以通过脚本自动化完成上位机循环遍历增益档位逐步执行“设置参数—采集暗场—采集明场—计算系数—写入用户集—切换下一档”的流程。海康的SDK完全支持这种批处理方式写一次脚本后续每次项目都可以复用。5.2 定期重矫正与光源监测平场矫正系数不是一劳永逸的。LED光源会衰减透镜会落灰镜片可能被划伤这些都会改变成像链路的空间分布特征。等到算法误报频繁才想起来重做矫正损失已经造成了。我的建议是建立两个机制。第一定期矫正机制。根据现场环境可以设定每周或每月执行一次自动矫正产线安排在换型或者保养时间段执行。如果用的是硬件矫正功能把白板和遮光机构集成到设备里一键触发矫正操作员负担很小。第二光源衰减监测机制。用一个固定的反射率参考条贴在视场边缘每次产线启动时采集一帧参考图像如果参考条区域的灰度值比出厂基准下降了15%以上系统就提示光源衰减需要清洁或者更换。5.3 把平场矫正做成项目标准动作说了这么多最后落在项目管理上。平场矫正不是一次性的调试任务而应该作为设备交付的标准动作写进调试流程。设备装配完成后第一件事就是做平场矫正更换光源、更换镜头、改变安装高度之后第一件事还是重新矫正。交付文档里至少要有三样东西矫正记录表、系数备份文件、验证标准。矫正记录表记录矫正日期、操作人、相机序列号、光源功率、曝光、增益、行频、目标灰度系数备份文件对应每组生产配方验证标准给出具体指标比如“横向剖面线标准差小于2个灰度级”“均匀性误差小于2%”。这样设备出了问题无论是远程支持还是现场排查都能快速定位是矫正失效还是其他环节异常。最后再分享一个小技巧。如果你在现场没有标准白板又急需验证矫正效果最接近白板的替代品是干净的白色陶瓷杯或者瓷砖背面表面足够平整、漫反射特性也凑合。但注意这只是应急正式标定必须用正规白场否则系数里会夹带瓷砖表面的杂质纹理后面检测真的会被一块瓷砖坑出幻觉。我个人在实际操作中的体会是平场矫正这件事原理简单、操作不难真正的分水岭全在细节里光源均匀性有没有先确认采集参数和生产是否一致暗场有没有遮严光帧数够不够。把这些问题都做扎实了海康线扫相机出图的质量可以非常稳定后面算法调参省心太多。
返回列表