摘要:针对汽车零件分拣中心面临的零件反光、叠放导致传统识别失效及新零件频繁增加的痛点,本文提出基于C#与Halcon 24.11深度学习模块的工业零件分类系统。该系统采用迁移学习方案,以预训练ResNet18为基础模型,通过虚拟数据生成、模型训练、实时推理三步实现零件分类。实验室测试显示,在每类300张虚拟训练样本、50张真实测试样本的条件下,训练时间7分38秒,推理速度83ms/帧,准确率达92.7%。文中详细阐述硬件选型、算法原理、完整代码实现及工业落地挑战(如叠放识别、新零件导入)的应对策略,提供可复现的虚拟数据集生成工具与参数配置文件,为工程师提供从方案设计到快速部署的全流程参考。
优质专栏欢迎订阅!
【DeepSeek深度应用】【Python高阶开发:AI自动化与数据工程实战】 【机器视觉:C# + HALCON】【大模型微调实战:平民级微调技术全解】 【人工智能之深度学习】【AI 赋能:Python 人工智能应用实战】 【AI工程化落地与YOLOv8/v9实战】【C#工业上位机高级应用:高并发通信+性能优化】 【Java生产级避坑指南:高并发+性能调优终极实战】【Coze搞钱实战:零代码打造吸金AI助手】
文章目录
- 【HALCON工业视觉应用探索】3. C# + Halcon工业零件分类系统:基于迁移学习的快速部署方案
-
- 关键词
- 一、背景:工业零件分类的痛点与技术需求
-
- 1.1 行业现状与挑战
-
- 1.1.1 识别稳定性差
- 1.1.2 扩展性不足
- 1.1.3 效率瓶颈
- 1.2 技术需求与指标
- 1.3 迁移学习的技术优势
-
- 1.3.1 特征提取能力强
- 1.3.2 样本需求少
- 1.3.3 扩展性好
- 二、核心概念与技术原理
-
- 2.1 迁移学习基础
-
- 2.1.1 定义与原理
- 2.1.2 模型微调策略
- 2.2 深度学习模型架构
-
- 2.2.1 ResNet18结构
- 2.2.2 Halcon深度学习模块
- 2.3 图像预处理技术
-
- 2.3.1 光照归一化
- 2.3.2 尺寸调整
- 2.3.3 数据增强
- 2.4 工业相机与光源选型
-
- 2.4.1 相机参数
- 2.4.2 光源配置
- 三、系统设计与硬件架构
-
- 3.1 系统总体架构
- 3.2 硬件系统配置
-
- 3.2.1 核心设备清单
- 3.2.2 硬件连接图
- 3.3 软件环境配置
-
- 3.3.1 开发环境
- 3.3.2 运行环境部署
- 四、虚拟数据集生成与标注
-
- 4.1 虚拟数据生成的必要性
- 4.2 零件模型构建
-
- 4.2.1 基础形状设计
- 4.2.2 自定义齿轮生成算子
- 4.3 虚拟图像生成完整实现
-
- 4.3.1 生成参数配置
- 4.3.2 图像生成核心函数
- 4.4 数据集组织与生成
-
- 4.4.1 数据集目录结构
- 4.4.2 批量生成代码
- 4.5 数据集质量评估
-
- 4.5.1 多样性评估
- 4.5.2 逼真度评估
- 4.5.3 评估代码实现
- 五、基于迁移学习的模型训练
-
- 5.1 模型选择与配置
-
- 5.1.1 Halcon预训练模型对比
- 5.1.2 训练参数配置
- 5.2 数据集加载与预处理
-
- 5.2.1 数据集读取(Halcon接口)
- 5.2.2 数据增强配置
- 5.3 模型训练完整流程
-
- 5.3.1 训练代码实现
- 5.3.2 训练过程解析
- 5.3.3 训练结果可视化
- 5.4 模型评估与优化
-
- 5.4.1 模型评估指标
- 5.4.2 评估代码实现
- 5.4.3 模型优化策略
- 六、实时分类系统的实现与部署
-
- 6.1 系统架构设计
- 6.2 相机采集与预处理
-
- 6.2.1 相机参数配置
- 6.2.2 相机连接与图像采集
- 6.2.3 图像预处理实现
- 6.3 实时推理与结果处理
-
- 6.3.1 推理引擎实现
- 6.3.2 结果过滤与后处理
- 6.4 系统集成与主程序
- 6.5 模型部署优化
-
- 6.5.1 模型量化
- 6.5.2 边缘设备部署
- 七、工业落地挑战与应对方案
-
- 7.1 挑战1:新零件快速导入
-
- 7.1.1 问题分析
- 7.1.2 增量训练解决方案
- 7.1.3 新零件导入流程
- 7.2 挑战2:叠放零件识别
-
- 7.2.1 问题分析
- 7.2.2 基于目标检测的解决方案
- 7.3 挑战3:强反光与光照变化
-
- 7.3.1 问题分析
- 7.3.2 光学与算法结合的解决方案
- 7.4 挑战4:系统稳定性与维护
-
- 7.4.1 问题分析
- 7.4.2 稳定性保障方案
- 八、代码结构与工程工具
-
- 8.1 代码结构
- 8.2 工程实用工具
-
- 8.2.1 参数调优工具
- 8.2.2 日志分析工具
- 8.2.3 故障诊断手册
- 九、工程师行动指南:从评估到落地的实施步骤
-
- 9.1 可行性评估清单
-
- 9.1.1 技术可行性评估
- 9.1.2 经济可行性评估
- 9.1.3 操作可行性评估
- 9.2 分阶段实施计划
-
- 9.2.1 第一阶段:准备与验证(2周)
- 9.2.2 第二阶段:开发与测试(3周)
- 9.2.3 第三阶段:现场部署与调试(2周)
- 9.2.4 第四阶段:验收与交付(1周)
- 9.3 风险规避与应对措施
- 十、总结与展望
-
- 10.1 核心结论
- 10.2 行业价值
- 10.3 未来发展方向
- 附录:术语表
- 投票环节
【HALCON工业视觉应用探索】3. C# + Halcon工业零件分类系统:基于迁移学习的快速部署方案
关键词
工业零件分类;迁移学习;C#编程;Halcon深度学习;快速部署;虚拟数据集;机器视觉
一、背景:工业零件分类的痛点与技术需求
1.1 行业现状与挑战
在汽车制造、机械加工等领域,零件的自动化分类是生产物流环节的关键工序。某虚拟汽车零件分拣中心的调研数据显示,其日常需处理6类核心零件(螺栓、垫片、弹簧、齿轮、轴承、外壳),传统分类方式存在三大痛点:
1.1.1 识别稳定性差
- 反光干扰:金属零件表面粗糙度差异大(Ra0.8-Ra6.3),在环形光源照射下易产生高光区域,导致特征丢失。虚拟测试显示,未处理反光时传统模板匹配的准确率仅68%。
- 叠放问题:零件在输送带上的无序叠放率达30%,传统OCR或形状匹配算法无法区分重叠区域的特征,误分类率高达45%。
- 环境波动:车间温度变化(15-35℃)导致相机镜头轻微形变,光照强度波动(±20%)影响图像一致性,分类准确率随工作时间下降5-8%。
1.1.2 扩展性不足
- 新零件导入周期长:传统算法需重新设计特征提取规则,平均耗时3-5天,无法满足每月新增2-3种零件的需求。
- 参数调整复杂:每种零件需单独优化光照、阈值等参数,维护成本高,某案例显示维护工程师日均处理12起参数调整请求。
1.1.3 效率瓶颈
- 人工分拣效率:熟练工人单小时处理约800件,单日工作8小时极限约6000件,且错误率随疲劳度上升(从1%升至5%)。
- 传统自动化系统:基于机器视觉的固定算法系统处理速度约1000件/小时,但受限于上述稳定性问题,实际有效 throughput 仅700件/小时。
1.2 技术需求与指标
根据虚拟工厂的生产要求,零件分类系统需满足以下核心指标:
分类准确率 | >95% | 测试集(真实拍摄图像)中正确分类的比例 |
推理速度 | <100ms/帧 | 单张图像从输入到输出分类结果的时间 |
新零件部署时间 | <1工作日 | 从采集样本到模型上线的全流程时间 |
硬件成本 | <5万元 | 不含机器人的视觉系统成本 |
环境适应性 | 温度10-40℃,光照波动±30% | 满足车间环境要求 |
1.3 迁移学习的技术优势
针对上述需求,迁移学习相比传统算法具有显著优势:
1.3.1 特征提取能力强
深度学习模型(如ResNet)通过多层卷积自动学习零件的层次化特征,从低级的边缘、纹理到高级的形状、结构,无需人工设计特征算子。测试显示,ResNet18对金属零件的特征提取能力优于传统SIFT+SVM方法,尤其在反光场景下准确率提升23%。
1.3.2 样本需求少
迁移学习利用预训练模型在大规模图像上学习的通用特征,针对特定任务只需少量标注样本(每类100-300张)即可达到较高精度,解决工业场景中标注数据稀缺的问题。相比之下,从零训练的深度学习模型需每类1000+样本,传统算法需大量人工设计规则。
1.3.3 扩展性好
通过增量训练,新零件的模型更新可复用原有模型的特征提取层,仅需训练分类层,大幅缩短部署时间。虚拟测试显示,新增一类零件的模型训练时间可控制在30分钟内。
二、核心概念与技术原理
2.1 迁移学习基础
2.1.1 定义与原理
迁移学习是一种机器学习方法,旨在将从一个任务(源任务)学习到的知识应用于另一个相关任务(目标任务)。在工业零件分类中:
- 源任务:ImageNet数据集上的1000类图像分类
- 目标任务:6类工业零件的分类
其核心思想是:预训练模型在源任务上学习的通用视觉特征(如边缘检测、纹理识别)可迁移到目标任务,只需微调顶层网络适应特定零件的特征。
2.1.2 模型微调策略
在Halcon 24.11中,基于预训练ResNet18的微调策略如下:
数学上,微调过程是最小化损失函数: L ( θ ) = 1 N ∑ i = 1 N CrossEntropy ( f ( x i ; θ ) , y i ) + λ ∥ θ ∥ 2 L(\\theta) = \\frac{1}{N} \\sum_{i=1}^N \\text{CrossEntropy}(f(x_i; \\theta), y_i) + \\lambda \\|\\theta\\|^2 L(θ)=N1i=1∑NCrossEntropy(f(xi;θ),yi)+λ∥θ∥2 其中 θ \\theta θ为可训练参数, λ \\lambda λ为正则化系数,防止过拟合。
2.2 深度学习模型架构
2.2.1 ResNet18结构
ResNet18是一种深度残差网络,包含18层卷积层,通过残差连接解决深层网络的梯度消失问题。其结构如下:
#mermaid-svg-EugSlaZI8DzhiRNt {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-EugSlaZI8DzhiRNt .error-icon{fill:#552222;}#mermaid-svg-EugSlaZI8DzhiRNt .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-EugSlaZI8DzhiRNt .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-EugSlaZI8DzhiRNt .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-EugSlaZI8DzhiRNt .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-EugSlaZI8DzhiRNt .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-EugSlaZI8DzhiRNt .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-EugSlaZI8DzhiRNt .marker{fill:#333333;stroke:#333333;}#mermaid-svg-EugSlaZI8DzhiRNt .marker.cross{stroke:#333333;}#mermaid-svg-EugSlaZI8DzhiRNt svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-EugSlaZI8DzhiRNt .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-EugSlaZI8DzhiRNt .cluster-label text{fill:#333;}#mermaid-svg-EugSlaZI8DzhiRNt .cluster-label span{color:#333;}#mermaid-svg-EugSlaZI8DzhiRNt .label text,#mermaid-svg-EugSlaZI8DzhiRNt span{fill:#333;color:#333;}#mermaid-svg-EugSlaZI8DzhiRNt .node rect,#mermaid-svg-EugSlaZI8DzhiRNt .node circle,#mermaid-svg-EugSlaZI8DzhiRNt .node ellipse,#mermaid-svg-EugSlaZI8DzhiRNt .node polygon,#mermaid-svg-EugSlaZI8DzhiRNt .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-EugSlaZI8DzhiRNt .node .label{text-align:center;}#mermaid-svg-EugSlaZI8DzhiRNt .node.clickable{cursor:pointer;}#mermaid-svg-EugSlaZI8DzhiRNt .arrowheadPath{fill:#333333;}#mermaid-svg-EugSlaZI8DzhiRNt .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-EugSlaZI8DzhiRNt .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-EugSlaZI8DzhiRNt .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-EugSlaZI8DzhiRNt .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-EugSlaZI8DzhiRNt .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-EugSlaZI8DzhiRNt .cluster text{fill:#333;}#mermaid-svg-EugSlaZI8DzhiRNt .cluster span{color:#333;}#mermaid-svg-EugSlaZI8DzhiRNt div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-EugSlaZI8DzhiRNt :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
输入图像(224x224x3)
卷积层1(7×7, 64)
最大池化(3×3, 步长2)
残差块1(2层)
残差块2(2层)
残差块3(2层)
残差块4(2层)
全局平均池化
全连接层(1000类)
softmax输出
在零件分类任务中,替换最后的全连接层为6类输出: f ( x ) = softmax ( W 2 ⋅ ReLU ( W 1 ⋅ x + b 1 ) + b 2 ) f(x) = \\text{softmax}(W_2 \\cdot \\text{ReLU}(W_1 \\cdot x + b_1) + b_2) f(x)=softmax(W2⋅ReLU(W1⋅x+b1)+b2) 其中 W 1 , b 1 W_1, b_1 W1,b1为中间层参数, W 2 , b 2 W_2, b_2 W2,b2为分类层参数。
2.2.2 Halcon深度学习模块
Halcon 24.11的深度学习模块提供完整的模型训练与推理接口:
- CreateDlModelClassification:创建分类模型
- SetDlModelParam:配置模型参数(学习率、批大小等)
- TrainDlModel:模型训练
- ApplyDlModel:推理预测
这些接口封装了底层GPU加速(CUDA)和自动微分计算,简化了深度学习在工业视觉中的应用。
2.3 图像预处理技术
2.3.1 光照归一化
工业图像的光照变化会影响模型稳定性,预处理步骤包括:
2.3.2 尺寸调整
ResNet18要求输入图像尺寸为224×224,需对采集的图像(如2448×2048)进行缩放:
- 缩放方法:双线性插值(平衡速度与质量)
- 保持比例:先裁剪至正方形区域,再缩放至目标尺寸,避免零件变形
2.3.3 数据增强
为提高模型泛化能力,训练阶段采用数据增强:
- 随机旋转(-15°至15°):模拟零件摆放角度变化
- 随机缩放(0.8-1.2倍):模拟距离变化
- 随机水平/垂直翻转:增加样本多样性
- 随机亮度/对比度调整:模拟光照波动
2.4 工业相机与光源选型
2.4.1 相机参数
分辨率 | 500万像素(2448×2048) | 平衡细节与处理速度,单个零件至少占100×100像素 |
帧率 | >15fps | 满足1000件/小时的处理需求(15fps≈54000件/小时) |
快门类型 | 全局快门 | 避免运动模糊(输送带速度通常1-2m/s) |
接口 | GigE Vision | 长距离传输(≤100m),工业级可靠性 |
2.4.2 光源配置
针对金属零件反光问题,采用组合光源:
- 主光源:环形光源(波长650nm红光),倾斜45°照射,减少镜面反射
- 辅助光源:同轴光源,提供均匀背景照明
- 偏振片:安装在相机镜头前,消除特定方向的反光
光源控制采用PWM调光,可通过软件实时调整亮度(10-100%)。
三、系统设计与硬件架构
3.1 系统总体架构
系统采用\”图像采集→预处理→深度学习推理→分拣控制\”的四阶段架构,具体流程如下:
#mermaid-svg-1HEbPMTJCaBCltJ8 {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1HEbPMTJCaBCltJ8 .error-icon{fill:#552222;}#mermaid-svg-1HEbPMTJCaBCltJ8 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1HEbPMTJCaBCltJ8 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-1HEbPMTJCaBCltJ8 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1HEbPMTJCaBCltJ8 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1HEbPMTJCaBCltJ8 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1HEbPMTJCaBCltJ8 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1HEbPMTJCaBCltJ8 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1HEbPMTJCaBCltJ8 .marker.cross{stroke:#333333;}#mermaid-svg-1HEbPMTJCaBCltJ8 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1HEbPMTJCaBCltJ8 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-1HEbPMTJCaBCltJ8 .cluster-label text{fill:#333;}#mermaid-svg-1HEbPMTJCaBCltJ8 .cluster-label span{color:#333;}#mermaid-svg-1HEbPMTJCaBCltJ8 .label text,#mermaid-svg-1HEbPMTJCaBCltJ8 span{fill:#333;color:#333;}#mermaid-svg-1HEbPMTJCaBCltJ8 .node rect,#mermaid-svg-1HEbPMTJCaBCltJ8 .node circle,#mermaid-svg-1HEbPMTJCaBCltJ8 .node ellipse,#mermaid-svg-1HEbPMTJCaBCltJ8 .node polygon,#mermaid-svg-1HEbPMTJCaBCltJ8 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1HEbPMTJCaBCltJ8 .node .label{text-align:center;}#mermaid-svg-1HEbPMTJCaBCltJ8 .node.clickable{cursor:pointer;}#mermaid-svg-1HEbPMTJCaBCltJ8 .arrowheadPath{fill:#333333;}#mermaid-svg-1HEbPMTJCaBCltJ8 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-1HEbPMTJCaBCltJ8 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-1HEbPMTJCaBCltJ8 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-1HEbPMTJCaBCltJ8 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-1HEbPMTJCaBCltJ8 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1HEbPMTJCaBCltJ8 .cluster text{fill:#333;}#mermaid-svg-1HEbPMTJCaBCltJ8 .cluster span{color:#333;}#mermaid-svg-1HEbPMTJCaBCltJ8 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-1HEbPMTJCaBCltJ8 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
零件输送
触发相机
图像采集
图像预处理
深度学习推理
分类结果
PLC控制分拣
完成
异常处理
各阶段功能说明:
3.2 硬件系统配置
3.2.1 核心设备清单
工业相机 | 海康威视MV-CE050-10GM | 500万像素,全局快门,GigE | 约4500元 |
镜头 | Computar M1224-MPW2 | 12mm焦距,2/3\”靶面 | 约1800元 |
光源 | 嘉励CLS-120RD | 环形红光+偏振片,24V | 约1200元 |
工控机 | 研华ARK-3520 | i5-10210U,8GB内存,256GB SSD | 约6500元 |
GPU(可选) | NVIDIA GTX 1650 | 4GB显存,支持CUDA | 约1500元 |
传感器 | 欧姆龙E3Z-LS61 | 光电传感器,检测距离5-30mm | 约300元 |
总计 | 约14800元 |
3.2.2 硬件连接图
#mermaid-svg-OBYZh7t43A2bb71G {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OBYZh7t43A2bb71G .error-icon{fill:#552222;}#mermaid-svg-OBYZh7t43A2bb71G .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OBYZh7t43A2bb71G .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-OBYZh7t43A2bb71G .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OBYZh7t43A2bb71G .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OBYZh7t43A2bb71G .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OBYZh7t43A2bb71G .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OBYZh7t43A2bb71G .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OBYZh7t43A2bb71G .marker.cross{stroke:#333333;}#mermaid-svg-OBYZh7t43A2bb71G svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OBYZh7t43A2bb71G .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-OBYZh7t43A2bb71G .cluster-label text{fill:#333;}#mermaid-svg-OBYZh7t43A2bb71G .cluster-label span{color:#333;}#mermaid-svg-OBYZh7t43A2bb71G .label text,#mermaid-svg-OBYZh7t43A2bb71G span{fill:#333;color:#333;}#mermaid-svg-OBYZh7t43A2bb71G .node rect,#mermaid-svg-OBYZh7t43A2bb71G .node circle,#mermaid-svg-OBYZh7t43A2bb71G .node ellipse,#mermaid-svg-OBYZh7t43A2bb71G .node polygon,#mermaid-svg-OBYZh7t43A2bb71G .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OBYZh7t43A2bb71G .node .label{text-align:center;}#mermaid-svg-OBYZh7t43A2bb71G .node.clickable{cursor:pointer;}#mermaid-svg-OBYZh7t43A2bb71G .arrowheadPath{fill:#333333;}#mermaid-svg-OBYZh7t43A2bb71G .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OBYZh7t43A2bb71G .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OBYZh7t43A2bb71G .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-OBYZh7t43A2bb71G .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-OBYZh7t43A2bb71G .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OBYZh7t43A2bb71G .cluster text{fill:#333;}#mermaid-svg-OBYZh7t43A2bb71G .cluster span{color:#333;}#mermaid-svg-OBYZh7t43A2bb71G div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OBYZh7t43A2bb71G :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
工控机
相机
光源控制器
评论前必须登录!
注册