重构——工业视觉质检系统搭建与应用2
第一章 视觉的力量
第二章 课程知识篇
第三章 实操训练
3.1 产品部件外观缺陷检测
3.2 产品部件几何尺寸测量
3.3 产品部件字符与条码识别
3.4 产品部件装配检测
3.5 产品部件功能测试辅助
第四章 项目实战
4.1 3C产品工业视觉应用
4.2 汽车部件工业视觉应用
4.3 物流场景工业视觉应用
由锐软科技提供技术支持
-
+
首页
3.2 产品部件几何尺寸测量
##### [学习视频](https://b23.tv/IR9zNbv) ##### 学习目标: - 理解机器视觉在几何尺寸测量中的基本原理,包括像素标定与边缘检测等核心概念。 - 掌握搭建尺寸测量系统所需的硬件选择方法,能够针对测量精度要求配置相机和镜头。 - 学习编写图像标定和测量的代码,实现对工件长度、孔径等尺寸的自动测量。 ##### 任务成果: - 能够完成视觉测量系统的标定步骤,获得像素与实际单位的转换系数。 - 使用边缘提取算法测量零件关键尺寸,并计算是否在公差范围内,输出判定结果。 - 归纳影响测量精度的因素(如成像畸变、像素分辨率、光照条件等),提出提高测量准确度的改进方案。 #### 3.2.1 场景破解 在工业生产中,精密零件的几何尺寸(如长、宽、高以及孔径)是否符合设计规格,是质量控制的关键之一。现在让我们来看一个典型场景——使用机器视觉对精密零件的长宽高和孔径进行测量。通过视觉检测系统,我们可以实现对零件尺寸的非接触快速测量,大幅提高效率和一致性。 <center> <图片: 几何测量场景图片>  </center> 尺寸测量的核心挑战在于如何获取清晰、准确反映零件边缘的图像,并将图像中的像素距离转换为实际长度单位(毫米)。为此,我们需要解决拍摄中的对焦和光照问题,确保照片中零件边缘清晰可见;还需要引入"像素标定",即确定图像中每个像素代表实际多长距离。只有完成标定,我们才能把像素测量值换算成实际毫米尺寸,判断零件是否在公差范围内。 ```mermaid flowchart LR A[待测零件] --> B[图像采集] B --> C[像素标定] C --> D{边缘提取} D -->|成功| E[尺寸计算] D -->|失败| F[调整光学参数] E --> G{尺寸判定} G -->|合格| H[通过检验] G -->|超出公差| I[标记不良] ``` <center>  </center> <center> <图片: 尺寸测量流程图> _1747362220.jpeg) </center> 在上述流程中,首先对待测零件进行图像采集。如果采集的图像清晰,进入边缘提取环节;若边缘无法成功提取,则需要调整相机焦距、光照角度等光学参数重新拍摄。成功提取零件边缘后,我们利用标定得到的像素比例关系,将图像中的像素距离转换为实际毫米,并计算出零件的各项尺寸。最后,将测量结果与规格公差进行比较,判断零件尺寸是否合格,合格则通过,不合格则标记为不良品。 为了更直观地理解这一过程,我们可以将其类比为生活中的照片测量。想象你要测量一本书的宽度,却只能通过照片来估计。你可以在书旁边放一把刻度清晰的尺子一起拍照,这相当于提供了标定参考。拍照时要对焦准确、光线充足,以确保照片中书的边缘和尺子的刻度都清晰可辨。接着,你数一数书在照片中跨越了多少刻度(像素距离),结合尺子的实际刻度长度(像素与毫米的比值),换算出书的真实宽度,并判断是否符合你的预期。 ```mermaid flowchart LR X[书本 + 尺子] --> Y[拍照获取图像] Y --> Z{刻度清晰?} Z -->|是| M[测量像素长度] Z -->|否| N[调整拍摄重来] M --> O[换算实际尺寸] O --> P{符合预期?} P -->|是| Q[尺寸正确] P -->|否| R[需要重新调整] ``` <center>  </center> <图片: 照片测量类比流程图> 通过这个比喻可以看出,无论是工业视觉测量还是日常照片测量,核心都是:**获取清晰有参考的图像**,然后**根据参考进行测量换算**。掌握了这两个要点,就为实现精密零件的视觉尺寸测量打下了基础。 #### 3.2.2 系统搭建 ##### (1)硬件配置 要搭建一个尺寸测量的视觉系统,我们需要根据测量精度要求选择合适的硬件。首先,相机的分辨率需要足够高,以确保小尺寸差异也能体现在像素层面;镜头方面,尽量选择畸变小的定焦镜头(若要求极高精度,可考虑远心镜头,以减少视差影响)。光源则应提供均匀、稳定的照明。例如,针对平面零件的外形尺寸测量,可以使用**背光源**获得零件清晰的轮廓;对于带孔的零件,也可以采用背光使孔呈现黑色轮廓,方便测量直径。此外,在反光较强的金属零件上测量尺寸时,可考虑使用偏振片滤镜减少眩光对边缘检测的干扰。 在本项目中,我们的测量对象为一个中等大小的精密零件,包含若干通孔。经过讨论,我们拟定如下硬件方案: 1. **工业相机**:500万像素黑白相机,确保测量精度(每像素约对应0.01mm)。 2. **镜头**:25mm定焦镜头,畸变小,视野覆盖整个零件。 3. **光源**:高亮度LED背光源,在零件下方提供轮廓照明;同时顶部辅以环形光,避免零件表面反光影响边缘提取。 4. **滤镜**:在镜头前安装偏振滤光片(若零件表面反光明显,旋转偏振片角度以减弱高光区域)。 5. **安装平台**:铝合金框架固定相机与光源,保持相机光轴垂直于零件表面,减少透视畸变。 <center> <图片: 尺寸测量硬件配置示意图> _1747362240.jpeg) </center> ##### (2)设备调试步骤 硬件搭建完成后,我们按照以下步骤进行设备调试和图像采集: 1. **相机安装与对焦**:将相机固定在支架上方,使镜头光轴正对待测零件。调整相机高度和镜头焦距,使相机视野刚好覆盖整个零件并保证图像清晰。可借助对焦辅助工具或观察图像清晰度,直到零件边缘锐利分明。 <图片: 零件对焦清晰示例图> 2. **光源调整**:开启背光源,使零件呈现黑色轮廓、背景高亮的图像效果;调节背光亮度,保证零件轮廓清晰且无过曝。然后打开环形顶光,微调角度和强度,让零件表面基本均匀受光但不过度影响边缘轮廓的对比度。如果有偏振片,缓慢旋转滤镜,观察图像上高光区域亮度变化,直到反光减少到最低。 <图片: 背光与环形光组合照明效果图> 3. **像素标定**:在镜头和光源调整完成后,在视野中放入一个**已知尺寸**的标定物(例如一把刻度尺或标准长度块规)。采集一张带有标定物的图像,使用软件测量标定物在图像中的像素长度,并将其与实际物理长度对比计算出"毫米/像素"的换算比例。例如,如果尺子上10mm对应图像上1000像素,那么每像素代表0.01mm。记录此标定结果,作为后续尺寸计算的依据。 <center> <图片: 标定尺拍摄及像素标定示意图> _1747362248.jpeg) </center> 5. **测试拍摄**:移除标定物,放置实际待测零件。采集测试图像并检查质量: * 零件完整地出现在画面中,边缘清晰。 * 背景光照均匀,无明显明暗不均。 * 没有显著反光或阴影干扰测量区域。 * 图像分辨率和对比度足以看清孔洞等细节。 如果发现问题(如边缘模糊或局部过暗),可适当重新调整对焦或光源,然后再次采集图像。 <图片: 高质量测试图像示例> 6. **安全检查**:确认设备布线和光源温度安全无误后,锁定相机和光源的位置,为批量测量做好准备。 7. **批量采集**:在上述参数固定的前提下,编写或使用相机采集程序,批量拍摄多张零件图像,以验证系统稳定性。若每张图像的清晰度和亮度一致,则说明硬件调试达标,可以进入软件测量阶段。 <center> <图片: 批量采集图像序列示例> _1747362255.jpeg) </center> 完成上述步骤后,我们应该已经获得了一组高质量的零件图像,以及相应的像素标定系数。接下来,我们将把视觉信号转化为可分析的数字信息,进入软件算法的实现部分。 ##### (3)软件开发与算法实现 在软件层面,我们需要编写算法读取图像并计算尺寸。主要流程为:**图像预处理 → 边缘提取 → 尺寸计算 → 结果输出**。 我们可以利用OpenCV库来完成大部分工作。例如,使用Canny算子进行边缘检测,结合霍夫变换检测直线和圆以提取零件的边界和孔径,然后根据像素标定系数计算实际尺寸。下面给出了一个核心函数`measure_dimensions()`的示例代码,实现对输入图像的尺寸测量: ```python import cv2 import numpy as np def measure_dimensions(image_path, mm_per_pixel): """ 读取图像,提取零件轮廓和关键尺寸,并转换为实际毫米值。 参数: image_path: 图像文件路径。 mm_per_pixel: 每个像素对应的毫米长度(标定所得)。 返回: dimensions: 包含测量结果的字典,例如{"width_mm": ..., "height_mm": ..., "hole_diameter_mm": ...}。 """ # 1. 读取图像并转换为灰度 image = cv2.imread(image_path) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 2. 图像预处理:模糊去噪和二值化 blurred = cv2.GaussianBlur(gray, (5, 5), 0) _, binary = cv2.threshold(blurred, 128, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) <图片: 零件图像二值化效果图> # 3. 边缘提取:使用Canny算法 edges = cv2.Canny(binary, 50, 150) <图片: Canny边缘检测效果图> # 4. 轮廓查找:找到所有轮廓 contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) dimensions = {} if contours: # 假设最大轮廓为零件外边框 main_contour = max(contours, key=cv2.contourArea) x, y, w, h = cv2.boundingRect(main_contour) # 计算长和宽(像素),转换为毫米 dimensions["width_mm"] = round(w * mm_per_pixel, 3) dimensions["height_mm"] = round(h * mm_per_pixel, 3) # 寻找圆形孔的轮廓(假设孔比外形轮廓小) hole_contours = [cnt for cnt in contours if cnt is not main_contour] hole_diams = [] for cnt in hole_contours: ((cx, cy), radius) = cv2.minEnclosingCircle(cnt) diameter_px = radius * 2 hole_diams.append(round(diameter_px * mm_per_pixel, 3)) if hole_diams: # 记录平均孔径或列表 dimensions["hole_diameter_mm"] = hole_diams if len(hole_diams) > 1 else hole_diams[0] # 5. 返回测量结果 return dimensions # 示例使用 result = measure_dimensions("part_sample.jpg", mm_per_pixel=0.01) print("测量结果:", result) <图片: part_sample.jpg 示例 (用于尺寸测量)> <图片: 零件尺寸自动测量与标注结果图> ``` <center> _1747362293.jpeg) _1747362297.jpeg) </center> 上述代码首先对输入图像进行灰度转换和模糊,以降低噪声,然后用自适应阈值将图像二值化,使零件呈黑色、背景为白色(通过`THRESH_BINARY_INV`取反实现背光轮廓的正确呈现)。接着使用Canny算法获取边缘,再通过`findContours`获取轮廓列表。我们选取面积最大的轮廓作为零件的外边界,并用`boundingRect`简易计算零件的轴对齐边界框,从而得到零件的宽度和高度(像素)。乘以标定的毫米每像素系数,即可得到实际尺寸。同样,对于内部的孔,我们遍历其他较小轮廓,利用`minEnclosingCircle`求出每个轮廓的外接圆直径(像素),再换算成孔径毫米值。最后将结果组织成字典返回。 需要注意的是,以上算法假定零件在图像中与相机视角正交且没有明显旋转(宽高轴与图像边框对齐)。如果零件有角度偏转,我们可以改用`minAreaRect`获取最小外接矩形,以获得旋转情况下的长宽。此外,为了提高孔径测量的准确性,可以采用霍夫圆检测(`cv2.HoughCircles`)进行圆形检测,这在孔边缘模糊时可能更稳健。实际工程中,还可以通过亚像素边缘检测等高级技巧进一步提升测量精度。 #### 3.2.3 技能图谱 ```mermaid mindmap root((几何尺寸测量技能)) (设备操作技能) [相机高分辨率选型] [镜头焦距与畸变控制] [光源均匀照明布置] [标定板/尺的使用] (图像处理技能) [阈值分割与二值化] [边缘提取(Canny算法)] [轮廓与形状分析] [霍夫直线/圆检测] (Python编程技能) [OpenCV图像读取与处理] [像素距离计算方法] [尺寸换算与单位转换] [结果数据记录与输出] ``` <center>  </center> <图片: 几何尺寸测量技能图谱> 上述技能图谱展示了完成尺寸测量所需的关键能力节点。在设备操作方面,要求我们能够合理**选择并调试相机和光学元件**,包括选择合适分辨率的相机、匹配低畸变镜头,以及设计均匀的照明方案。同时,我们需要掌握标定工具的使用方法,为视觉测量建立尺度基准。在图像处理方面,需要运用**阈值分割**将目标从背景中提取、使用**Canny算子**进行边缘检测、利用轮廓分析或霍夫变换提取感兴趣的几何形状(如直线边缘或圆孔)。最后,Python编程技能则保证我们能将上述算法融会贯通——使用OpenCV等库读取和处理图像,编写代码计算像素距离并换算实际尺寸,妥善组织测量结果数据并输出,为后续的判定或存储做好准备。 #### 3.2.4 典型应用 * **轴承零件外径与厚度测量** * 利用背光成像获取轴承套圈的清晰轮廓。通过边缘检测获得外径轮廓,计算直径像素值,再根据标定系数换算出实际外径尺寸。 * 对于厚度(高度)的检测,可结合双相机或激光传感器实现,此处主要关注平面内尺寸。 * 典型应用于轴承套件生产中对套圈直径、公差进行100%在线测量,精度可达0.01mm。 * **冲压板材孔径和间距测量** * 采用顶部环形光配合背光,既保证板材外形轮廓清晰,又使冲压孔内部不出现强反光。通过霍夫圆检测找到多个孔的像素直径,并计算孔中心位置坐标。 * 进一步计算相邻孔中心之间的像素距离,以评估孔间距是否符合设计图纸要求,再换算成实际距离。 * 广泛用于汽车钣金件、机械冲压件的孔位尺寸在线检查,替代人工抽检,提高效率。 * **电子连接器引脚间距测量** * 放大镜头下获取连接器引脚的正面图像,利用高亮同轴光照明减少引脚阴影。通过图像二值化和形态学处理分离各引脚,然后计算相邻引脚边缘之间的像素距离。 * 转换为实际间距,判断是否在允差范围内,可及时发现引脚弯曲、偏移等装配问题。 * 常见于PCB板上排针、IC引脚的自动化检验,保障电子元件封装的一致性。 > 思考与练习: > > 1. 如果一个零件上有多个孔需要同时测量孔径,该如何在软件算法上实现对所有孔洞的尺寸识别?可以尝试设计遍历轮廓或基于形状特征分类的方法。 > 2. 当待测工件并非平放正对相机,而是有一定倾斜或旋转时,该如何处理才能保证测量准确?提示:可考虑引入图像校正(如透视变换)或在标定时包含角度因素。
ent
2025年5月20日 14:20
转发文档
收藏文档
上一篇
下一篇
AI问答
手机扫码
复制链接
手机扫一扫转发分享
复制链接
AIChat
代码在线测试
AI问答
你好,我是AI阅读助手,我可以回答与文档内容相关的内容,帮助你快速理解文档,以下是我归纳的几个核心问题,可供您参考:
发送
输入
运行
输出
Markdown文件
分享
链接
类型
密码
更新密码