资讯动态

基于BLOB分析的机器视觉多圆定位与运动控制实现

发布时间:2026/10/17 14:24:01 来源:尧图企业网站定制
做视觉引导这些年我越发觉得一个道理产线上真正扛大梁的往往不是那些听起来高大上的算法而是朴实但可靠的经典方法。这个系列走到第三篇我来拆一个特别常见的需求——基于BLOB分析的多圆定位跑在机器视觉运动控制一体机上。所谓多圆定位就是相机拍一张图把画面里多个圆形目标同时识别出来输出每个圆的圆心坐标和半径再换算成物理坐标交给运动控制去执行抓取、对位或偏差补偿。产线上这种工位多得是电路板Mark点对位、多孔法兰盘找正、药瓶盖抓取、手机中框贴合防偏圆是最高频的目标形状。这篇文章适合正在做设备集成、视觉调试或者运动控制联调的工程师也适合刚接触一体机、想快速跑通一个小项目的朋友。我不打算只贴参数和代码更想把每一步的取舍逻辑、现场容易翻车的点都交代清楚。1. 项目拆解多圆定位到底要解决什么问题1.1 为什么单圆识别不够用多圆才是产线常态单圆识别很简单图像里找一个圆边缘拟合出圆心坐标就完事了。但产线几乎不会给这么温柔的任务。以多孔法兰盘为例工件上少则四五个、多则十几个孔相机视野里同时出现一堆圆形目标有些带螺纹、倒角、氧化皮有些互相挨得很近。你需要做的不是找出“一个圆的中心”而是给每个目标独立输出坐标彼此不能串位顺序还要稳定。这才是多圆定位的真正难点它本质上是个“目标分裂逐个测量”的问题。你先把一堆像素分清楚哪个圆属于谁再去测量每一个圆。BLOB分析正好擅长这个——它天然就是把二值图像分裂成独立连通域的方法每个连通域对应一个潜在目标。这个思路比直接做全图边缘检测或者模板匹配要干净得多。在实际项目里多圆定位的输出一般有两种用法。一种是纯粹的测量型比如检查圆孔的位置偏差是否超差这时关心的是每个孔的坐标与理论值之差。另一种是引导型比如机械手抓取圆形工件前拍照算出工件中心相对基准位置的偏差把偏差送给运动控制卡补偿。本篇文章主要讲的是引导型但前面的BLOB流程两种场景完全共享。1.2 为什么选BLOB分析而不是Hough变换或模板匹配很多人一提到找圆第一反应是Hough梯度法。单独识别一个圆、半径范围明确、对精度要求不高的场合Hough确实能用。但放到多圆定位场景Hough有几个让人头疼的点参数多需要指定半径搜索范围和累加器阈值计算量大在一体机这种CPU不算富余的平台上图形分辨率稍高就容易卡顿对噪声敏感图像里出现弧形边缘、反光斑时很容易在非目标位置产生大量虚假圆的累加峰值。模板匹配也不好使。圆的特征太单一模板匹配在几何变化缩放、旋转面前很脆弱而且画面里有多个相似目标时需要额外的抑制逻辑匹配分数阈值调起来也很费劲。换句话说用模板匹配来认圆属于杀鸡用牛刀还容易误伤。BLOB分析的价值在于计算量低、特征维度丰富、参数直观。一个连通域能同时给出面积、周长、质心、外接矩形、圆度、长宽比等一堆特征每个特征都能当筛选条件。这对多圆场景太友好了——面积筛掉小噪点圆度筛掉形状不对的异物外接矩形长宽比筛掉条状划痕。而且这些运算都是像素计数级别一体机的算力完全跑得动。我自己做这类项目时只要目标是近似实心的二值化区域默认首选都是BLOB分析不会先绕去试Hough。2. 核心原理BLOB分析的完整技术链路2.1 二值化整个流程的真正命门BLOB分析的第一步是把灰度图变成二值图。这一步做不好后面全是白费功夫——二值化的质量直接决定连通域分割的准确性。常见的做法有两种。第一种是固定阈值你把灰度阈值写死比如大于128设为白。这种做法在环境光稳定、工件外观一致的场合能用但一遇到反光、光照波动就容易翻车。第二种是自动阈值典型代表就是大津法OTSU。它的原理是遍历所有可能阈值找到一个让前景和背景类间方差最大的分割点。对于工件和背景灰度差异明显、直方图呈双峰的图像大津法效果相当稳。我遇到过不少现场环境光不可控的情况此时全局阈值依旧不够用就得考虑局部自适应阈值或者分区处理。局部阈值会在图像每个小窗口内独立计算阈值能扛光照不均但计算量更大更容易把小噪声引入前景。所以我的习惯是先尽量从光源和遮光结构上保证成像稳定把图像喂得“干净”而不是指望算法去硬扛恶劣的成像条件。二值化的细节直接影响后面测量准确性这里尤其要注意目标边缘的灰度过渡。理想状态下圆边缘在二值图里是锐利的但现实中边缘往往占据几个像素的灰度渐变区。阈值取得偏高圆会比实际偏小阈值取得偏低圆会比实际偏大。这在粗定位里无所谓但在精度要求到零点几毫米的对位场景里就非常致命。所以做BLOB之前先打开灰度直方图看一眼确认目标和背景确实分得开。2.2 连通域标记怎么把一块像素变成一个目标二值化之后图像就是一堆白块块和黑块块接下来要判断哪些白像素属于同一个目标。这就是连通域标记算法的工作。所谓连通一般有两种定义4邻接连通上下左右和8邻接连通再加上四个对角。对圆形目标来说8邻接更常用因为圆的边缘是对角相接的可能性存在用4邻接容易把同一个圆拆成两半。经典的两遍扫描算法思路并不复杂第一次扫描图像给每个前景像素赋一个临时标签同时记录哪些标签是等价的第二次扫描再把等价标签合并成最终编号。这一步完成后每个连通区域就拥有了唯一编号之后统计面积、质心、周长这些特征就只是对单个标签的像素集合做累加运算。这里有个值得说的点面积就是像素个数质心是所有像素坐标的平均值即一阶矩除以零阶矩。对标准圆来说质心和圆心基本重合但实际工件往往带倒角、毛刺甚至局部残缺导致质心偏离真实圆心。这也是为什么做完BLOB粗定位后我通常还会做一步亚像素边缘拟合来精确定位圆心后面会展开讲。2.3 圆度筛选与亚像素精定位从“像圆”到“圆心准”拿到一批连通域后要用特征把不是圆的剔掉。最关键的指标是圆度计算公式是圆度 4π × 面积 / 周长²一个标准圆形这个值等于1正方形大约是0.785三角形更低。所以可以根据圆度阈值来过滤我一般习惯先设0.8根据现场情况上下微调。要注意离散化误差数字图像的圆在低分辨率下圆度也会略低于1所以阈值不建议设得太苛刻否则真圆反而会被误杀。除了圆度面积范围是另一个重要过滤器。面积直接对应物理尺寸如果一个圆孔直径是5mm换算成像素面积是3000左右那么可以设面积范围200至5000把细小的灰尘噪点和巨大异物挡在门外。再加上圆形目标的外接矩形长宽比通常接近1这个条件还能顺手滤掉条形划痕。但BLOB分析给的是像素级质心很多高精度对位场景零点几个像素都伤不起。这时候我会在筛选完的每个连通域上提取边缘点再做最小二乘圆形拟合得到亚像素级别更准确的圆心坐标和半径。最小二乘拟合的好处是让所有边缘点共同决定结果个别噪点对圆心影响有限。如果现场有反光造成的偶发离群点还可以先用RANSAC剔除再做一次纯拟合效果更稳。3. 一体机实操流程从图像到坐标再到运动控制3.1 动手之前的坐标系与标定任何视觉引导项目第一步都不是调图像而是先把坐标系理的清清楚楚。一体机里相机看到的坐标是像素坐标单位像素运动控制用的是物理坐标单位毫米两者之间的换算关系必须提前标定好。最常用的标定方法是九点标定。准备一张带特征点的标定板或者干脆用一个高精度的十字靶标让运动轴带着靶标走九个已知位置相机对应记录九个像素坐标用这九组数据拟合出一个3×3的单应矩阵。之后任意一个像素点都能通过这个矩阵快速映射成物理坐标。如果镜头畸变比较明显还可以用更密集的点阵做多项式校正但大多数中小视野场合九点标定已经够用。还要搞清楚“眼在手外”和“眼在手上”的区别。眼在手外相机固定安装机械手或工作台运动视觉先算偏差再补偿。这套关系相对简单标定一次基本固定。眼在手上相机装在机械手末端跟着手移动标定关系更复杂但灵活。多圆定位最常见的布置是固定安装的相机从上往下拍即眼在手外下面讲的偏差补偿逻辑也是基于这种布置。3.2 例程主流程与核心代码拆解把整个流程串起来主流程是这样的图像采集、ROI裁剪、灰度化、滤波、二值化、形态学处理、连通域标记、特征筛选、亚像素圆拟合、坐标变换输出。下面是一段类Python风格的SDK封装示意实际在国产品牌一体机上API命名大同小异逻辑可直接迁移# 机器视觉运动控制一体机BLOB多圆定位示意 img camera.grab() # 采集一次图像 roi (300, 200, 1200, 900) # ROI把工件框进去 crop img.crop(roi) # 裁剪减少无关区域干扰 gray crop.to_gray() # 彩色图转灰度 blur median_filter(gray, size3) # 中值滤波去孤立噪点 binary threshold_otsu(blur) # 大津法自动阈值二值化 binary morph_open(binary, kernel3) # 开运算打掉小碎块 blobs label_connected(binary, min_area300, max_area15000) results [] for blob in blobs: roundness 4 * PI * blob.area / (blob.perimeter ** 2) if roundness 0.80: # 圆度不达标跳过 continue if blob.height / blob.width 0.9 or blob.height / blob.width 1.1: continue # 外接矩形长宽比接近1才保留 px, py blob.centroid # 质心作为粗定位 cx, cy, r fit_circle(blob.contour) # 亚像素最小二乘拟合 wx, wy homography_map(cx, cy, H) # 像素坐标 - 物理坐标 results.append((wx, wy, r))这段代码有几个容易被新手忽略的地方。ROI裁剪不是可选项一定要做。视野里可能同时存在其他工件边缘、螺栓、工件夹具ROI越小误检源越少处理速度也越快。中值滤波对去除椒盐噪点非常高效但注意核不能太大3就够了核太大了会把细小目标的边缘磨圆。开运算同样是去打小碎噪点的它不会让合格的圆产生太大变形现场实测效果不错。形态学处理要克制。有些工程师一看到二值图不干净就连续开操作闭操作结果圆边缘磨得圆滚滚面积、圆度全部失真。形态学操作能少用就少用把精力放在调整光源和相机参数上才是正路。3.3 视觉结果如何变成运动补偿多圆定位的最终目的不是输出一屏坐标就完事而是让运动系统动起来。典型的引导逻辑是先在基准位置拍一次照片记录每个圆的基准坐标然后后续每来一个工件拍一次计算当前坐标与基准坐标的偏差。以XY平台修正为例视觉算出一个圆的偏差ΔX、ΔY先判断偏差是否在允许范围内比如±2mm超范围直接报警不执行补偿。这是非常重要的一条安全逻辑——视觉偶尔会出错直接让运动轴带着大偏差冲过去可能撞坏治具。在容忍范围内就把偏差转换成运动控制卡的坐标增量执行相对移动。对于平移式补偿一个圆的偏差就够了如果要修正旋转角度至少需要两个圆通过两圆心连线的角度差来算旋转量这也是多圆定位在角度纠偏上的应用扩展本系列后续可以单独展开。一体机上视觉和运动控制之间的配合方式是另一个关键点。做联调时我习惯采用“运动到位触发拍照”的模式即运动轴到达拍照位后输出一个硬触发信号相机立刻抓拍避免因为运动振动导致图像模糊或位置抖动。软触发适合调试阶段批量产线还是硬触发可靠。3.4 光源和成像参数的配套调试没有好图像算法就是无米之炊。多圆定位的目标类型不同光源选择差异很大。表面是打孔检测的比如法兰盘圆孔、背光板孔径用背光源效果极好。背光从工件背面打过来孔的位置会形成高对比度的亮斑二值化极其干净圆度和面积都很稳定。表面是反光较强的金属件、经过氧化处理的圆环用低角度环形光更能把边缘轮廓勾出来。低角度光打上去圆的外边缘会形成一圈亮边内边缘则有阴影整体轮廓感很强。相机曝光和增益也要固定。自动曝光在产线上是灾难因为不同批次工件的反光程度不同自动曝光会让亮度忽高忽低二值化的阈值跟着漂移圆的大小和位置自然就不稳定。我把曝光、增益、光源亮度全部手动固定并保存成配方参数。如果产品规格切换直接加载对应配方不要指望现场操作员能调明白这些图像参数。4. 现场常见问题与排查技巧实录4.1 问题速查表下面这张表我整理自几个实际项目的踩坑记录基本涵盖了BLOB多圆定位最常见的现场问题现象可能原因排查思路与解决办法输出一堆乱七八糟的碎圆图像噪点多、二值化阈值过低看二值图确认噪点来源调高阈值加开运算或面积下限过滤圆中间漏检空缺号圆盘区域与背景灰度差太小换光源方向或改用背光拉高对比度对局部区域单独设阈值相邻两圆粘连变成一个连通域两圆之间灰度太接近或圆本身被过度放大降低曝光避免亮斑扩大检查形态学是否用过头必要时用距离变换配合分水岭分割圆心坐标偏得很稳定但不准标定矩阵不准相机安装有角度重新做九点标定检查相机和移动面是否平行查看镜头畸变增加畸变校正反光工件偶尔出现位置漂移反光导致边缘出现伪边缘点用偏振片消除镜面反光拟合前加离群点剔除改用多帧平均程序跑得慢节拍跟不上ROI太大、分辨率过高、形态学核太大缩ROI降采样把尺寸滤波放到连通域标记阶段输出的圆顺序不稳定未做顺序排序按X坐标排序或按Y坐标排序后输出给每个圆固定编号便于后续追数据4.2 值得反复琢磨的几条实战经验先说结论光源和成像的重要性再怎么强调都不过分。我见过太多人抱着算法使劲调参最后发现换个光源角度问题立刻消失。正确顺序永远是先管好打光、曝光、焦距再回头检查BLOB参数。图像干净BLOB参数只需要粗筛图像脏参数再精细也是苟延残喘。第二条经验是一定要保留“看二值图”的调试习惯。调试BLOB分析时把每一张经过二值化和形态学处理的中间结果实时显示出来看目标区域是不是干净完整的圆。这比盯着最终输出坐标猜原因高效得多。很多一体机SDK里有图像监视窗口调试阶段一定要用好。第三条经验是关于参数配方的管理。现场设备投入使用后环境光、产品批次、设备机械状态都会缓慢变化。把所有视觉参数、运动补偿参数存成配方文件配上版本号。今天调试好的参数明天验收又要改改来改去忘了原值这种情况我见过太多次。没有配方管理返工是迟早的事。第四条经验多圆定位的圆顺序问题。如果你把结果直接送给下游PLC顺序不一致就是事故。无论算法内部怎么遍历连通域最后输出列表一定要做一次稳定的排序比如按左上角坐标先X后Y排。排序这种事写代码的时候几分钟现场调试却能省下大半天。结尾这套基于BLOB分析的多圆定位例程我前前后后改过好几个版本最深的体会是经典方法不代表低级它只是把该做的每一步都做得清清楚楚。二值化把目标拎出来连通域把目标分开特征筛选把假目标剔掉亚像素拟合把精度补上标定矩阵把坐标靠拢运动补偿把动作闭环。每一步单独看都不复杂串在一起就是一个可靠的多圆定位方案。最后再分享一个小技巧如果现场有多个相近的工件不要只调一套参数硬通吃给每种工件建立独立配方里面有独立的ROI、阈值、面积范围、圆度阈值和标定切换。切换时一键加载互不干扰。这套思路我屡试不爽推荐你也试试。后续有机会我再把多圆加角度纠偏、以及配合机械手的手眼标定展开写写。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑