重构——工业视觉质检系统搭建与应用
第一章 视觉的力量
第二章 课程知识篇
第三章 实操训练
3.1 产品部件外观缺陷检测
3.2 产品部件几何尺寸测量
3.3 产品部件字符与条码识别
3.4 产品部件装配检测
3.5 产品部件功能测试辅助
第四章 项目实战
4.1 3C产品工业视觉应用
4.2 汽车部件工业视觉应用
4.3 物流场景工业视觉应用
由锐软科技提供技术支持
-
+
首页
3.1 产品部件外观缺陷检测
##### 学习目标: - 理解工业产品表面缺陷检测的基本流程,包括图像采集、预处理和缺陷判别。 - 学会根据缺陷类型选择合适的相机、镜头和光源搭配,提高图像中缺陷的可见性。 - 掌握使用简单图像处理算法(如阈值分割、边缘检测)识别划痕缺陷的基本编程方法。 ##### 任务成果: - 能独立搭建用于表面划痕检测的基本视觉硬件系统,并调整设备获得清晰缺陷图像。 - 完成一段划痕检测的示例代码,实现对测试图像中划痕缺陷的识别和标记。 - 总结不同硬件配置对缺陷检测效果的影响,并针对给定场景选择最佳方案。 #### 3.1.1 场景破解 <center> <video width="200" controls> <source src="https://entsz-1300636955.cos.ap-guangzhou.myqcloud.com/101file/%E4%BB%80%E4%B9%88%E6%98%AF%E7%BC%BA%E9%99%B7%E6%A3%80%E6%B5%8B.mp4"> </video> 缺陷检测短视频讲解 </center> 在掌握基础理论后,让我们通过一个典型工业案例开启实践之旅——金属板划痕检测。在工业生产中,金属板表面的划痕检测是一个常见且关键的质量控制环节。通过视觉检测系统,我们可以快速、准确地识别出表面的各类缺陷,确保产品质量。 ```mermaid flowchart LR A[金属板来料] --> B[图像采集] B --> C{预处理} C -->|通过| D[缺陷检测] C -->|不通过| E[重新调整参数] D --> F{判定结果} F -->|合格| G[合格品分拣] F -->|不合格| H[不良品标记] ``` <center>  </center> 在该场景中,金属来料部分我们不需要过多关心,但在实际工厂环境,这是非常重要的一环。现在我们直接从图像采集部分开始分析。 图像采集的核心在于根据产品、物料特性,以及我们所需要识别的缺陷,精确的拍摄出符合需求的照片。这要求我们掌握物料所具备的各种特征,比如形状、材料的不同可能导致的结果。同时也要求我们掌握硬件设备的性能极限以及功能边界,比如不同的镜头所能拍摄出的照片、不同光源所能照射出物料不同的特征等。 预处理以及缺陷检测环节就主要是软件层面的工作。 预处理就好像检测系统的"美颜滤镜",通过图像处理,让我们需要识别的缺陷部分更加明显,并尽量过滤噪声。就好比P图,我们希望只保留人脸的五官,并去除皮肤上的痘痘。其中五官可以类比为"需要识别的缺陷",而痘痘便是"噪声"。 <center>  </center> 经过预处理后,我们有了一副"五官明确,没有痘痘"的照片。但这个照片可能会存在几个问题。比如少个鼻子或嘴巴,又或者脸部皮肤磨皮磨太过,导致人脸看起来有点假。这时候我们就需要把图片给朋友看看,分辨下图片中人脸的好坏。如果人脸清楚,痘痘也去除干净了,就通过进入下一步,发朋友圈(缺陷检测)。如果朋友觉得不好,我们就得把图片拿去重新调整P图参数。 <center>  </center> 经过漫长的重新P图操作,终于到了展示成果的一环(实际工程中的预处理速度非常快)。也就是发在朋友圈内让大家看看,如果点赞的人够多,说明这个图很好看。它就有资格保留下来,也就是成为了合格品。但假如过了很久仍然无人问津,说明图片是可能存在问题的。所以我们需要把照片下架,也就不良品下架。 <center>  </center> ```mermaid flowchart LR A[自拍原图] --> B[导入修图软件] B --> C{美颜处理} C -->|通过| D[发布朋友圈] C -->|不通过| E[重新调整滤镜] D --> F{点赞反馈} F -->|好评如潮| G[保留美照] F -->|无人问津| H[删除重拍] ``` 通过以上类比,我们更容易理解划痕检测的完整流程:采集清晰图像 → 图像预处理 → 缺陷检测 → 结果判定。接下来,我们将亲自动手搭建检测系统的硬件,并编写相应的软件代码来实现对金属板划痕的自动检测。 #### 3.1.2 系统搭建 <center>  </center> ##### (1)硬件配置 进行划痕检测,首先需要搭建适当的图像采集硬件。传统上,工业相机加镜头、光源的组合较为繁琐,需要针对不同场景反复调试。而如今已有高度集成的视觉检测套件,使用起来更为简便。本实训提供了一套集成化设备,包含相机、镜头、光源和支架,类似我们用手机替代单反相机拍照:虽然专业度稍逊,但胜在操作简单、易于上手。 任务:根据3.1节场景要求,选择合适的硬件组合方案。下面提供多种相机、镜头和光源配置,请同学们自行搭配、调试,并通过观察拍摄效果选择最佳方案。最后,每位同学需要阐述自己选择该方案的理由。 可选硬件组件(根据课程实际设备可做调整): 1. 相机分辨率:200万像素、400万像素、800万像素。 <图片: 不同分辨率工业相机示例> 2. 镜头焦距:12 mm、24 mm、35 mm、50 mm、80 mm 定焦镜头。 <图片: 不同焦距工业镜头示例> 3. 光源类型:LED点光源、LED条形光、环形均匀光源等。 <图片: 不同类型工业光源示例> > **引导性思考**:划痕通常较细小,您认为应该优先选择高像素还是低像素相机?不同焦距的镜头对视野范围和细节清晰度有何影响?尝试考虑这些问题并选择硬件组合。 > > 完成第一次硬件组合选择后,我们将更换检测场景,再次进行选择练习。 > 例如:将被测物体材质由金属换成玻璃,或者拉远相机与物体之间的距离。同学们需针对新情况重新搭配相机、镜头和光源,并解释调整的原因。通过多场景对比,加深对硬件选型原则的理解。 假定本次金属板划痕检测,指导教师推荐的参考方案(供学生对比自己的配置)如下: 1. 工业相机:200万像素工业相机(满足检测精度且处理速度快)。 2. 镜头:12 mm定焦镜头(视野覆盖整个金属板,保证一定清晰度)。 3. 光源:45度斜射的LED条形光源,两侧对称布置(在金属表面形成侧向照明,以凸显划痕纹理)。 4. 检测平台:铝合金型材工作台(稳定固定被测金属板的位置)。 <center>  </center> 完成硬件搭建后,我们需要将实际物体的影像成功转化为数字图像输入计算机,才能开展后续的软件检测。下面进入设备调试,以确保相机和光源协同工作达到最佳成像效果。 ##### (2)设备调试步骤 1. 相机安装 - 将相机固定在支架上,保持与检测平面垂直 <图片: 相机支架安装示意图> - 调整高度至400mm(可根据实际视野需求微调) <图片: 高度调节刻度特写> - 连接电源线和数据线(USB3.0接口) <图片: 接口连接示意图> - 设备调试前安全检查清单: ✅ 支架固定螺丝是否拧紧 ✅ 数据线是否防缠绕 ✅ 急停按钮功能测试 <图片: 安全检查清单示意图> <center>  </center> 2. 光源布置 - 在相机两侧各安装一组LED条形光源 <图片: 光源安装位置示意图> - 光源与水平面呈45度角 <图片: 角度测量仪使用示例> - 光照均匀性测试: ```python # 均匀性测试代码片段 def check_illumination(image): gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) std_dev = np.std(gray) return std_dev < 15 # 标准差小于15为合格 ``` <图片: 光照均匀性测试效果对比图> 3. 连接相机并参数设置 - 相机连接步骤: 1. 通过USB3.0接口连接相机到电脑 2. 打开相机配套软件(如MVS) 3. 在设备列表中选择并打开相机 4. 检查连接状态指示灯 <center>  </center> - 相机参数配置: 1. 曝光时间调节(推荐范围15-25ms) - 过暗时适当增加曝光时间 - 过亮时适当减少曝光时间 <图片: 曝光时间设置界面截图>  </center> 2. 增益设置(推荐0-10db) - 增益越大,噪点越多 - 建议优先调节曝光,增益作为备选 <图片: 增益调节界面> - 光源亮度调节(PWM调光示意图) - 通过控制器调节占空比 - 建议从50%开始逐步调整 <图片: 光源控制器操作面板> - 对焦辅助工具使用: ```python # 对焦辅助函数 def focus_assist(image): edges = cv2.Laplacian(image, cv2.CV_64F).var() return edges > 100 # 边缘清晰度阈值 ``` <图片: 对焦测试标靶图> 4. 拍摄图像 - 图像采集参数设置: 1. 设置相机IP <center>  </center> - 采集步骤: 1. 点击"开始采集"按钮 2. 调整工件位置至视野中心 3. 点击"软触发"按钮进行拍摄 4. 检查图像质量: - 亮度适中 - 对比度清晰 - 无运动模糊 - 工件完整在视野内 5. 将合格图像保存至指定文件夹 <center>  </center> 5. 安全操作规范 - 紧急停止按钮位置示意图 <图片: 设备急停按钮位置特写> - 防护装置检查清单: ✅ 光幕传感器功能正常 ✅ 安全门互锁装置有效 ✅ 接地电阻 < 4Ω <图片: 防护装置示意图> ##### (3)进行照片采集 <图片:满足课题要求的图片> 通过使用配套软件,成功捕捉符合要求的图片,并存储在电脑中 - 获得关键道具<照片URL> ##### (4)建立Python基本环境(需要根据具体课程需求调整,IDE推荐VSCode,待填入图片数据) 1. 安装Python - 访问Python官网(https://www.python.org)下载最新版本 - 运行安装程序,注意勾选"Add Python to PATH" <图片: Python安装程序截图-勾选Add to PATH> - 打开命令提示符,输入"python --version"验证安装 <图片: 命令行验证Python安装成功截图> 2. 安装必要的库 打开命令提示符,依次输入以下命令: ``` pip install opencv-python # 图像处理库 pip install numpy # 数值计算库 pip install matplotlib # 绘图库 ``` <图片: pip安装库成功截图> 3. 创建工作目录 - 新建文件夹"metal_inspection" - 在该文件夹下创建以下文件结构: ``` metal_inspection/ ├── images/ # 存放测试图片 ├── results/ # 存放检测结果 └── main.py # 主程序文件 ``` <图片: 项目文件夹结构截图> 4. 验证环境 在main.py中输入以下代码测试环境: ```python import cv2 import numpy as np import matplotlib.pyplot as plt print("OpenCV version:", cv2.__version__) print("NumPy version:", np.__version__) print("环境配置成功!") ``` <图片: VSCode中运行测试代码成功截图> ##### (5)编写照片识别算法 每个函数都可以在网页上搭配一组test数据,并让学生点击查看函数运行效果;根据test出来的图像告知特点 ```python def load_and_preprocess(image_path): """ 读取图像并进行预处理,包括灰度转换、高斯滤波和自适应阈值分割 Args: image_path (str): 输入图像的文件路径 Returns: tuple: 包含三个元素: - img (ndarray): 原始BGR彩色图像 - gray (ndarray): 灰度图像 - thresh (ndarray): 二值化后的阈值图像 Raises: Exception: 当无法读取图像时抛出异常 """ # 读取图像 img = cv2.imread(image_path) if img is None: raise Exception("无法读取图像") # 转换为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 高斯滤波去噪 blurred = cv2.GaussianBlur(gray, (5, 5), 0) # 自适应阈值分割 ← 排除噪点引起的误检 thresh = cv2.adaptiveThreshold( blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2 ) return img, gray, thresh def detect_defects(thresh): """ 检测图像中的缺陷,通过轮廓检测识别可能的缺陷区域 Args: thresh (ndarray): 二值化后的阈值图像 Returns: list: 包含检测到的缺陷信息的字典列表,每个字典包含: - position (tuple): 缺陷位置的(x, y)坐标 - size (tuple): 缺陷区域的(宽, 高) - area (float): 缺陷区域的面积 """ # 寻找轮廓 contours, _ = cv2.findContours( thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE ) defects = [] for contour in contours: # 计算轮廓面积 area = cv2.contourArea(contour) # 过滤小面积噪声 if area > 50: # 可调整阈值 # 获取缺陷位置和尺寸 x, y, w, h = cv2.boundingRect(contour) defects.append({ 'position': (x, y), 'size': (w, h), 'area': area }) return defects def mark_defects(image, defects): """ 在原始图像上标注检测到的缺陷 Args: image (ndarray): 原始BGR彩色图像 defects (list): 缺陷信息列表,每个元素为包含position、size和area的字典 ndarray: 标注了缺陷的图像副本,包含红色矩形框和面积标注 """ marked_img = image.copy() for defect in defects: x, y = defect['position'] w, h = defect['size'] # 绘制矩形框 cv2.rectangle( marked_img, (x, y), (x + w, y + h), (0, 0, 255), # 红色 2 ) # 添加面积标注 cv2.putText( marked_img, f'Area: {defect["area"]:.0f}', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1 ) return marked_img def main(): """ 主程序入口,协调整个缺陷检测流程 流程包括: 1. 读取和预处理图像 2. 检测缺陷 3. 标注结果 4. 保存结果图像 5. 打印检测统计信息 输入: 从images/test.jpg读取测试图像 输出: - 在results/result.jpg保存标注后的结果图像 - 在控制台打印检测到的缺陷统计信息 Raises: Exception: 当处理过程中出现错误时抛出异常 """ # 设置输入输出路径 image_path = "images/test.jpg" result_path = "results/result.jpg" try: # 读取和预处理 original, gray, thresh = load_and_preprocess(image_path) # 检测缺陷 defects = detect_defects(thresh) # 标注结果 result = mark_defects(original, defects) # 保存结果 cv2.imwrite(result_path, result) # 打印检测结果 print(f"检测到 {len(defects)} 个缺陷") for i, defect in enumerate(defects, 1): print(f"缺陷 {i}:") print(f"- 位置: {defect['position']}") print(f"- 尺寸: {defect['size']}") print(f"- 面积: {defect['area']:.0f}") except Exception as e: print(f"错误: {str(e)}") if __name__ == "__main__": main() ``` ###### 练习: 1. 假如images文件下有很多张图片,比如 image_1.jpg ~ image_100.jpg, 该如何对这些图片进行批量运算? 2. 假如在`load_and_preprocess`中,把灰值化的代码去掉,最终结果会发生什么,为什么会这样? 3. 如果需要同时检测不同类型的缺陷(如划痕、凹坑、污渍等),`detect_defects`函数需要如何修改? 4. 尝试调整area阈值参数(50→30),观察检测结果变化,思考如何平衡误检与漏检? ###### 解答: 1. 批量处理多张图片: 使用os.listdir()或glob.glob("images/*.jpg")获取所有图片路径 用循环遍历每个图片路径,复用现有的处理函数 可以将结果保存到字典或列表中统一输出统计信息 2. 去掉灰值化的影响: 如果去掉灰值化,后续的二值化处理将直接作用于彩色图像 这会导致阈值分割效果变差,因为RGB三个通道的像素值会互相干扰 最终会降低缺陷检测的准确率,产生更多误检 3. 检测不同类型缺陷: 需要修改detect_defects函数,为每种缺陷类型设计专门的检测算法 可以使用字典存储不同类型的检测结果 每种缺陷使用不同的图像处理参数和判定标准 最后返回包含多种缺陷信息的综合结果 4. ... #### 3.1.3 技能图谱 ```mermaid mindmap root((工业视觉检测技能)) (设备操作技能) [相机安装与调试] [光源布置与调节] [参数优化配置] (图像采集技能) [取像参数设置] [图像质量评估] [实时监控调整] (Python编写技能) (环境配置) [Python安装与配置] [OpenCV等库的安装] [开发环境搭建] (图像处理算法) [图像预处理] [缺陷检测算法编写] [结果标注与输出] (代码组织能力) [函数模块化设计] [异常处理机制] [代码注释规范] ``` <center>  </center> #### 3.1.4 典型应用 - 金属板表面划痕检测 - 通过高对比度光源照明,突出金属表面的划痕和凹痕 - 使用边缘检测和形态学处理识别线性缺陷 - 根据缺陷长度、宽度等特征进行分类判定 - 常见应用:汽车车身板材、金属零件表面检测 - PCB板焊点检查 - 采用环形光源,避免焊点反光干扰 - 结合灰度分析和轮廓特征检测焊点质量 - 判断焊点的大小、形状、位置是否合格 - 主要应用于电子产品制造中的PCB板质检 - 手机后盖外观检验 - 多角度布光,解决玻璃/金属表面反光问题 - 综合运用缺陷检测和尺寸测量算法 - 检测划痕、污渍、气泡等多种缺陷 - 广泛应用于手机、平板等3C产品的外观检测
ent
2025年5月20日 14:19
转发文档
收藏文档
上一篇
下一篇
AI问答
手机扫码
复制链接
手机扫一扫转发分享
复制链接
AIChat
代码在线测试
AI问答
你好,我是AI阅读助手,我可以回答与文档内容相关的内容,帮助你快速理解文档,以下是我归纳的几个核心问题,可供您参考:
发送
输入
运行
输出
Markdown文件
分享
链接
类型
密码
更新密码