OpenCV 圆形检测
OpenCV 圆形检测HoughCircles、轮廓与尺寸标定萨达大 · 06-02 · 孔径、O 型圈、垫片圆度视觉工位里「测圆」极其常见密封圈外径、轴承滚道、针孔、反光柱面在顶光下呈亮边圆。OpenCV 提供霍夫圆变换 HoughCircles与轮廓拟合 minEnclosingCircle两条路线。前者对边缘清晰、背景干净的圆稳定后者适合不规则 blob 再近似圆。本文讲预处理、参数整定、像素直径转毫米标定并给出 WinForms 测量显示代码与 FAQ。一、两种思路怎么选方法适用弱点HoughCircles标准圆、边缘完整参数敏感多圆时需限制半径范围轮廓 最小外接圆阈值分割后的区域分割失败则全崩需稳定打光产线节拍快时萨达大常组合高斯模糊 → Canny 边缘 → HoughCircles再用圆心与半径容差做 OK/NG。需要 sub-pixel 精度时在 Hough 结果附近做边缘点拟合圆几何最小二乘可再提一点精度。二、HoughCircles 示例usingOpenCvSharp;publicstaticCircleSegment[]DetectCircles(Matbgr,doubledp1.2,doubleminDist50){usingvargraynewMat();Cv2.CvtColor(bgr,gray,ColorConversionCodes.BGR2GRAY);Cv2.GaussianBlur(gray,gray,newSize(9,9),2,2);// param1: Canny 高阈值param2: 累加器阈值越小圆越多误检也多varcirclesCv2.HoughCircles(gray,HoughModes.Gradient,dp:dp,minDist:minDist,param1:100,param2:30,minRadius:20,maxRadius:200);returncircles??Array.EmptyCircleSegment();}绘制结果publicstaticvoidDrawCircles(Matbgr,CircleSegment[]circles){foreach(varcincircles){varcenternewPoint((int)c.Center.X,(int)c.Center.Y);intradius(int)c.Radius;Cv2.Circle(bgr,center,radius,Scalar.Red,2);Cv2.Circle(bgr,center,3,Scalar.Lime,-1);}}调参口诀圆检不出 → 略降param2或放宽minRadius/maxRadius误检多 → 提高param2、增大minDist、加强高斯 blur。现场用TrackBar绑参数操作员看着画面调比你在办公室猜强。三、轮廓法与圆度publicstatic(Point2f center,floatradius)?FindCircleByContour(Matbgr){usingvargraynewMat();Cv2.CvtColor(bgr,gray,ColorConversionCodes.BGR2GRAY);Cv2.Threshold(gray,gray,0,255,ThresholdTypes.Binary|ThresholdTypes.Otsu);Cv2.FindContours(gray,outPoint[][]contours,out_,RetrievalModes.External,ContourApproximationModes.ApproxSimple);if(contours.Length0)returnnull;varmaxcontours.OrderByDescending(cCv2.ContourArea(c)).First();Cv2.MinEnclosingCircle(max,outPoint2fcenter,outfloatradius);doubleareaCv2.ContourArea(max);doublecircularity4*Math.PI*area/(Cv2.ArcLength(max,true)*Cv2.ArcLength(max,true));if(circularity0.85)returnnull;// 圆度过滤return(center,radius);}圆度接近 1 表示形状更接近正圆可筛掉椭圆或缺角。四、测量与标定像素 → 毫米视觉测量本质是像素当量用标准件 gauge 圆孔、标定板圆点已知直径D_mm测得像素直径D_px则k D_mm / D_px。后续d_mm radius_px * 2 * k。publicsealedclassPixelCalibration{publicdoubleMmPerPixel{get;privateset;}0.05;// 默认值必须标定后覆盖publicvoidCalibrateByKnownDiameter(doublediameterMm,doublediameterPx){if(diameterPx0)thrownewArgumentOutOfRangeException(nameof(diameterPx));MmPerPixeldiameterMm/diameterPx;}publicdoublePxToMm(doublepx)px*MmPerPixel;}标定注意相机与工件距离固定、镜头畸变广角边缘圆会偏。高精度用棋盘格CalibrateCamera做畸变校正后再测一般密封圈工位 ±0.05mm 有时只标定中心 ROI 即可。标定数据写入device.json见 07 章配置管理。五、WinForms 测量界面要点显示圆心坐标、半径像素、换算毫米、OK/NG 与上下限。允许鼠标点选多个检出圆中的「目标圆」距图像中心最近或半径最大规则。保存 NG 原图到按日期分文件夹文件名带 SN 与时间戳。publicboolJudgeDiameter(doublemm,doublenom,doubletol)Math.Abs(mm-nom)tol;六、与 PLC 尺寸站联动判定结果写 Modbus 寄存器测量值 float 占两个寄存器、OK 线圈、NG 代码。视觉测量耗时不稳定时PLC 侧用握手信号PLC 给触发PC 完成后给完成位避免 PLC 固定延时等不到。七、FAQQ1Hough 检出很多假圆限制半径范围ROI提高 param2换更均匀打光。Q2同一圆半径帧间跳动时间滤波滑动平均或只对触发帧单次测量不跟预览帧。Q3黑色圆孔在白色底检不出反转阈值或 Canny 前 CLAHE。Q4标定后仍超差检查治具高度温漂镜头松动用标准件每班首件复检标定。Q5与 03 章完整项目关系圆检测是工位算法插件之一统一进 InspectionPipeline。八、小结与延伸掌握 HoughCircles 与轮廓圆度过滤再配合PixelCalibration就能把「看见圆」变成「合格尺寸」。下一篇03 视觉检测完整项目会把读码、测圆、模板匹配串成 OK/NG 流水线并谈统计与 MES 钩子。导航上一篇01-OpenCV二维码识别下一篇03-视觉检测完整项目萨达大 · 圆检参数请随样件存档换产品要重新整定 min/maxRadius 与容差九、预处理链详细说明萨达大在金属圆孔工位常用BGR → 灰度 → 双边滤波保边去噪→ Canny。金属反光带可在偏振片 低角度暗场之间取舍。若背景纹理复杂先 ROI 再 Hough累加器空间小、速度快。多圆排序规则要明确按半径降序取最大圆作为产品外径还是按与模板圆心距离最近。文档写进 SOP否则换班操作员各判各的。十、标定板与首件流程每班开机放标准环规测三次取平均更新MmPerPixel或仅校验偏差在 1% 内。超差则清洁镜头、检查光源亮度、重新标定。Winter 车间温差大时上午下午各检一次标准件数据写日志方便追溯「某时段尺寸漂移」是否温控问题。十一、代码结构建议ICircleInspector接口Inspect(Mat) - InspectionResult实现类HoughCircleInspector、ContourCircleInspector。WinForms 只依赖接口A/B 测算法不炸 UI。单元测试用保存的 PNG 断言半径像素在 ±2 内。十二、性能1280×720 单帧 Hough 在 i5 工控机约十毫秒级整线多工位请避免同进程四路同时 Hough可排队或独立进程。OpenCL 在 OpenCvSharp 里启用门槛高多数产线 CPU 够用。以上内容为圆形检测常见工程化补充配合索引与下一章完整项目阅读效果更佳。感谢收藏支持。十三、椭圆与误检区分若产品本身是椭圆某些密封圈压缩状态圆度阈值要放宽或改测长轴短轴。Hough 对椭圆会给出多个假圆心此时应改fitEllipse输出(center, axes, angle)再换算等效直径。萨达大建议算法选型写在《视觉工艺卡》里与机械设计、质量部一起签版避免软件背锅。十四、图像坐标与机械坐标机械手吸嘴补偿有时要「圆心偏移 ΔX ΔY」。视觉给出像素偏移乘以标定矩阵正交简化时即 MmPerPixel发给机器人。旋转角度若需要用椭圆拟合或两圆心连线。坐标系方向图像 Y 向下与 PLC 毫米坐标要一次定义清楚现场少踩坑。十五、历史数据与 SPC尺寸测量值写入 CSV 或数据库后可对接 05 章报表与 SPC 图。视觉站 NG 率突增时先查光源老化、再查镜头脏污、最后查算法参数被误改——ConfigManager 加配置变更日志07 章。十六、与二维码工位组合同一产品先读码再测圆SN 与尺寸绑定入库追溯时才能定位「哪一件超差」。Pipeline 顺序、超时与互锁在 03 章展开。十七、OpenCvSharp 版本差异HoughCircles返回值类型在不同 OpenCvSharp 版本可能是CircleSegment[]或Vec3f[]以你项目 IntelliSense 为准迁移版本时编译期就能发现。运行时行为变化用样图回归测试。十八、操作员界面文案NG 原因分枚举未找到圆、圆度不足、直径超上限、直径超下限、标定失效。不要只显示 NG否则产线只会反复重拍。Good 工位软件体现专业度。十九、镜头与景深小光圈景深大但进光少需补光大光圈亮但景深小治具高度波动导致模糊。读码与测圆共用相机时曝光妥协点要实测必要时拆双相机工位。二十、完结圆形检测章节到此请进入完整项目篇串联业务。若需萨达大补充某行业样例如医疗瓶盖可评论区说明工况与节拍。二十一、补充练习建议读者用三个不同半径的硬币在桌面拍十张图记录 param2 与检出率关系形成表格贴到项目 Wiki。团队新人培训时用同一套图考试比背 API 更有效。测圆模块上线前由质量部用检具复核至少三十件对比视觉与物理测量差值分布确认 Cpk 满足客户协议后再批量生产。