从零打造 C# 工业视觉检测系统(一):项目全景与架构设计

从零打造 C# 工业视觉检测系统(一):项目全景与架构设计

系列标签C# WinForms 工业视觉 海康威视 Modbus OpenCV SQL

源码配套 :基于真实项目完整拆解

适合人群:有一定 C# 基础,想转型工业软件开发或机器视觉方向的工程师


一、前言

在工业 4.0 和智能制造的大背景下,机器视觉检测已经成为生产线上的"质检员"。无论是电子元器件的尺寸测量、食品包装的缺陷检测,还是汽车零部件的瑕疵识别,视觉检测系统都在以远高于人眼的精度和速度,24 小时不间断地工作。

本系列文章将基于一个真实的 C# WinForms 工业视觉检测项目,从零开始,手把手带你搭建一套完整的在线检测系统。你将学到:

  • 工业相机的选型与 SDK 开发(海康威视 MVS)
  • OpenCV 图像处理与像素级尺寸测量
  • 串口通信与 Modbus RTU 协议(PLC 剔除控制)
  • 多数据库切换架构(SQL Server / MySQL / SQLite)
  • 检测业务闭环:拍照 → 算法推理 → 判定 → 存库 → 剔除

二、什么是工业视觉检测?

工业视觉检测系统通常由以下几个核心模块组成:

复制代码
┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│  工业相机   │────▶│  算法推理   │────▶│  合格判定   │
│ (海康/大华) │     │ (AI/传统CV) │     │ (OK/NG)     │
└─────────────┘     └─────────────┘     └──────┬──────┘
                                               │
                        ┌──────────────────────┘
                        ▼
               ┌─────────────────┐
               │   PLC / 继电器   │
               │  (不合格品剔除)  │
               └─────────────────┘
                        │
                        ▼
               ┌─────────────────┐
               │   数据库 / MES   │
               │  (数据追溯分析)  │
               └─────────────────┘

典型工作流程

  1. 传感器触发,工业相机拍照
  2. 图像送入算法模块,提取特征、测量尺寸
  3. 将实测值与标准规格对比,判定 OK/NG
  4. 不合格品通过气吹/推杆等执行机构剔除
  5. 检测数据存入数据库,供后续统计分析

三、项目技术全景图

本项目是一个基于 .NET Framework 4.7.2 的 WinForms 桌面应用,完整技术栈如下:

模块 技术选型 用途
UI 框架 WinForms + SunnyUI + CSkin 工业级人机交互界面
工业相机 海康威视 MVS SDK (MvCamCtrl.Net) 图像采集,支持 2 路相机
AI 推理 ONNX Runtime + 自研 Algorithm.dll 图像测量与缺陷检测
串口通信 NModbus4 + System.IO.Ports Modbus RTU 控制 PLC 剔除
数据库 SQL Server / MySQL / SQLite 检测数据持久化与追溯
报表导出 EPPlus Excel 数据导出
配置管理 Newtonsoft.Json JSON 配置文件读写

四、源码目录结构解析

项目根目录位于 F:\工业视觉\FormUI\,核心目录结构如下:

复制代码
FormUI/
├── Program.cs                  # 程序入口
├── FormUI.csproj               # 项目文件
├── Common/                     # 公共数据模型与配置
│   ├── Product.cs              # 产品规格模型 + SlugStruct
│   ├── CameraData.cs           # 全局相机资源管理
│   ├── Config.cs               # 全局静态配置类
│   └── CreateTableSql.cs       # 数据库建表语句
├── Forms/                      # 窗体界面
│   ├── MainForm.cs             # 主窗体(Tab 容器)
│   ├── RunningForm.cs          # 检测页面(核心业务流程)
│   ├── ProductForm.cs          # 产品管理
│   ├── CameraOptionForm.cs     # 相机参数与连接
│   ├── CameraShowForm.cs       # 实时浏览
│   ├── DBOptionForm.cs         # 数据库配置
│   ├── SerialOptionForm.cs     # 串口配置
│   └── StatisticalChartsForm.cs # 历史记录与导出
├── Utils/                      # 工具类
│   ├── DllMethod.cs            # P/Invoke 调用算法 DLL
│   ├── SqlHelper.cs            # 数据库操作封装
│   ├── SerialPortHelper.cs     # 串口/Modbus 封装
│   ├── ImageUtil.cs            # 图像格式转换
│   ├── IniConfigHelper.cs      # JSON 配置读写
│   └── SQL/                    # 数据库提供者实现
│       ├── IDatabaseProvider.cs
│       ├── SqlServerProvider.cs
│       ├── MySqlProvider.cs
│       └── SqliteProvider.cs
└── ChildForms/
    └── SelectCamera.cs         # 相机选择弹窗

五、核心窗体功能一览

5.1 MainForm ------ 主控台

MainForm 是整个软件的控制中枢,采用 TabControl 作为导航容器,动态加载 7 个功能子页面:

csharp 复制代码
// MainForm.cs 核心代码
TabPage tabPage1 = new TabPage("检测");
TabPage tabPage2 = new TabPage("产品");
TabPage tabPage3 = new TabPage("相机参数");
TabPage tabPage4 = new TabPage("数据库参数");
TabPage tabPage5 = new TabPage("串口参数");
TabPage tabPage6 = new TabPage("实时浏览");
TabPage tabPage7 = new TabPage("历史记录");

LoadFormIntoTabPage(tabPage1, typeof(RunningForm));
LoadFormIntoTabPage(tabPage2, typeof(ProductForm));
// ... 以此类推

启动时自动完成两件事:

  1. 数据库连接 :根据 config.json 中的配置自动连接数据库
  2. 串口连接:自动打开串口,准备与 PLC 通信

5.2 RunningForm ------ 检测核心

这是整个系统最重要的页面。点击"开始检测"后,后台启动一个 Task 循环:

  1. 调用 DllMethod.start() 执行算法推理
  2. 获取产品实测长度、宽度及合格状态
  3. 更新界面统计(总数、合格数、不合格数、合格率)
  4. 将记录存入数据库
  5. 若不合格,通过串口发送剔除指令

5.3 CameraOptionForm ------ 相机管理

支持最多 2 台相机的连接与断开:

  • 正面相机(Camera 0):用于主要检测
  • 背面相机(Camera 1):辅助或备用

提供实时预览、比例尺标定等功能。


六、数据库表结构设计

系统使用两张核心表:

6.1 Product(产品规格表)

存储每种产品的检测标准:

字段 说明
product_name 产品名称
product_type 类型(0=矩形,1=圆形等)
product_length 标准长度
length_up_offset 长度上偏差
length_down_offset 长度下偏差
product_width 标准宽度
width_up_offset 宽度上偏差
width_down_offset 宽度下偏差
delay_time 剔除延时(秒)
hold_time 剔除保持时间(秒)

6.2 Slug(检测记录表)

存储每一次检测的原始数据:

字段 说明
slug_name 产品名称
slug_type 产品类型
slug_length 实测长度
slug_width 实测宽度
is_qualified 是否合格(0/1)
create_time 检测时间

七、开发环境搭建

7.1 必备工具

  • Visual Studio 2022(社区版即可)
  • .NET Framework 4.7.2 目标包
  • 海康威视 MVS 机器视觉软件(用于相机驱动和客户端调试)
  • SSMS / Navicat(数据库管理工具)

7.2 项目运行步骤

  1. 克隆源码到本地
  2. 使用 VS 打开 工业视觉检测.sln
  3. 通过 NuGet 还原包(已包含 SunnyUI、EPPlus、NModbus4 等)
  4. 确保已安装海康 MVS 驱动,相机能被 MVS 客户端识别
  5. 修改 config.json 配置数据库和串口参数
  6. F5 运行项目

八、系列文章路线图

本系列共分为 15 篇文章,由浅入深,完整覆盖项目所有技术点:

篇号 主题 核心内容
01 项目全景与架构设计 你已经在这里 👆
02 WinForms 主界面与 SunnyUI TabControl、子窗体嵌入、自适应布局
03 单例/工厂模式与 JSON 配置 架构设计、全局配置、多数据库切换
04 海康 MVS SDK 与相机枚举 工业相机选型、设备发现、列表展示
05 相机连接、取流与实时预览 IntPtr 图像转换、双路显示、内存优化
06 OpenCV 图像处理与比例尺标定 像素操作、BGR 通道、像素→物理尺寸
07 串口通信 SerialPort 封装 RS232/485、HEX 收发、调试工具
08 Modbus RTU 与 PLC 剔除控制 NModbus4、寄存器读写、剔除时序
09 多数据库切换架构 工厂模式、ADO.NET、连接池
10 检测记录入库与 Excel 导出 分页查询、EPPlus、SQL 注入防范
11 Task 异步编程与实时性保障 Invoke、CancellationToken、死锁预防
12 P/Invoke 调用 C++ 算法 DLL DllImport、结构体内存对齐、ONNX
13 检测业务完整闭环 RunningForm 主循环、数据流串联
14 异常处理与性能优化 全局异常、日志系统、内存泄漏排查
15 打包部署与进阶展望 Inno Setup、MES 对接、架构升级

九、总结

本文作为系列开篇,介绍了工业视觉检测的应用场景、本项目的技术全景图、源码目录结构以及核心功能模块。从下一篇开始,我们将正式进入代码实战,手把手搭建 WinForms 主界面框架

思考题

工业视觉检测系统与普通消费级相机应用相比,在软件设计上有哪些特殊要求?(提示:考虑实时性、稳定性、硬件兼容性)


下篇预告:《从零打造 C# 工业视觉检测系统(二):WinForms 主界面架构与 SunnyUI 实战》

欢迎点赞、收藏、关注,你的支持是我持续输出的动力!

相关推荐
牡丹雅忻13 小时前
AES 加密模式演进:从 ECB、CBC 到 GCM 的 C# 深度实践
java·开发语言·c#
脚踏实地皮皮晨3 小时前
002002002_DepandencyObject类2
开发语言·windows·算法·c#·visual studio
YUS云生4 小时前
大模型学习·第41天:LangChain进阶——提示词模板与Chain链式调用
学习·langchain·c#
SunnyDays10116 小时前
C# 加密和解密 PDF:设置密码、AES 加密及操作权限
pdf·c#·加密 pdf·解除 pdf 密码·pdf 权限设置·pdf 文档安全
布鲁飞丝7 小时前
对 .NET线程 异常退出引发程序崩溃的反思
数据库·c#·.net
SamChan907 小时前
WebSocket实现PDF翻译进度实时推送:Go后端+React前端的完整方案
前端·websocket·pdf·c#·react·机器翻译
geovindu8 小时前
CSharp: LogHelper
开发语言·后端·c#·.net
caishenzhibiao8 小时前
顺势捕猎者副图 同花顺期货通指标
java·c语言·c#
明如正午10 小时前
【C#】LINQ_HashSet_BitField解析
c#·linq