从零打造 C# 工业视觉检测系统(一):项目全景与架构设计
系列标签 :
C#WinForms工业视觉海康威视ModbusOpenCVSQL源码配套 :基于真实项目完整拆解
适合人群:有一定 C# 基础,想转型工业软件开发或机器视觉方向的工程师
一、前言
在工业 4.0 和智能制造的大背景下,机器视觉检测已经成为生产线上的"质检员"。无论是电子元器件的尺寸测量、食品包装的缺陷检测,还是汽车零部件的瑕疵识别,视觉检测系统都在以远高于人眼的精度和速度,24 小时不间断地工作。
本系列文章将基于一个真实的 C# WinForms 工业视觉检测项目,从零开始,手把手带你搭建一套完整的在线检测系统。你将学到:
- 工业相机的选型与 SDK 开发(海康威视 MVS)
- OpenCV 图像处理与像素级尺寸测量
- 串口通信与 Modbus RTU 协议(PLC 剔除控制)
- 多数据库切换架构(SQL Server / MySQL / SQLite)
- 检测业务闭环:拍照 → 算法推理 → 判定 → 存库 → 剔除
二、什么是工业视觉检测?
工业视觉检测系统通常由以下几个核心模块组成:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 工业相机 │────▶│ 算法推理 │────▶│ 合格判定 │
│ (海康/大华) │ │ (AI/传统CV) │ │ (OK/NG) │
└─────────────┘ └─────────────┘ └──────┬──────┘
│
┌──────────────────────┘
▼
┌─────────────────┐
│ PLC / 继电器 │
│ (不合格品剔除) │
└─────────────────┘
│
▼
┌─────────────────┐
│ 数据库 / MES │
│ (数据追溯分析) │
└─────────────────┘
典型工作流程:
- 传感器触发,工业相机拍照
- 图像送入算法模块,提取特征、测量尺寸
- 将实测值与标准规格对比,判定 OK/NG
- 不合格品通过气吹/推杆等执行机构剔除
- 检测数据存入数据库,供后续统计分析
三、项目技术全景图
本项目是一个基于 .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));
// ... 以此类推
启动时自动完成两件事:
- 数据库连接 :根据
config.json中的配置自动连接数据库 - 串口连接:自动打开串口,准备与 PLC 通信
5.2 RunningForm ------ 检测核心
这是整个系统最重要的页面。点击"开始检测"后,后台启动一个 Task 循环:
- 调用
DllMethod.start()执行算法推理 - 获取产品实测长度、宽度及合格状态
- 更新界面统计(总数、合格数、不合格数、合格率)
- 将记录存入数据库
- 若不合格,通过串口发送剔除指令
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 项目运行步骤
- 克隆源码到本地
- 使用 VS 打开
工业视觉检测.sln - 通过 NuGet 还原包(已包含 SunnyUI、EPPlus、NModbus4 等)
- 确保已安装海康 MVS 驱动,相机能被 MVS 客户端识别
- 修改
config.json配置数据库和串口参数 - 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 实战》
欢迎点赞、收藏、关注,你的支持是我持续输出的动力!