OpenIVS 的全称是 Open Source Industrial Vision System,即开源工业视觉系统。它是一个开源的工业视觉软件框架,帮助你快速完成工业视觉检测项目。
OpenIVS 是一个基于 .NET 平台的工业视觉软件框架,提供了相机连接、图像采集、图像处理、模型推理、PLC控制等功能。你可以使用 OpenIVS 快速搭建一个工业视觉检测系统,实现自动化检测、缺陷识别等功能。
在使用 OpenIVS 前,需要安装以下软件:
- 海康相机MVS
- 版本:MVS_STD_4.4.0_240913.exe
- 下载地址:MVS_STD_4.4.0_240913.zip
- 用于相机连接和图像采集
-
Halcon(可选)
- 版本:halcon-20.11.1.0-windows.exe
- 下载地址:https://www.mvtec.com/downloads
- 如果需要使用Halcon接口进行图像处理,则需要安装
-
深度视觉AI平台
- 官方网站:https://dlcv.com.cn
- 需要安装高性能SDK套件才能加载模型进行推理
- 您需要使用深度视觉AI平台训练模型
- 该SDK提供了模型推理所需的各项功能
- 参考文档:https://docs.dlcv.com.cn/deploy/csharp_sdk
在 ModbusManager.cs 中可以修改PLC相关配置:
_modbusApi.SetSerialPort(
settings.PortName, // 串口名称
settings.BaudRate, // 波特率
settings.DataBits, // 数据位
settings.StopBits, // 停止位
settings.Parity, // 校验位
(byte)settings.DeviceId // 设备ID
);
也可以在设置页面修改:
- 修改
MoveToPositionAsync
方法可调整位置控制逻辑 - 调整位置精度:
Math.Abs(currentPosition - position) < 1.0f
可在ModbusManager
中增加其他PLC控制动作,以满足特定需求。例如:增加 OK/NG 信号控制。
假设 PLC 通过写入寄存器 16 实现 OK/NG 信号控制,可以在ModbusManager
中增加如下方法:
_modbusApi.WriteSingleRegister(16, isOK);
单相机的情况下,可以在设置页面修改,包括相机名称,触发方式等:
同时也可以在设置页面修改:
- 存图路径
- 存图质量
- 是否存储OK图或NG图
多相机的情况下,可以在 CameraInitializer.cs 中修改相机连接参数:
- 当前系统使用单例模式管理相机:
CameraInstance.Instance
- 若需支持多相机,可修改为列表管理多个相机实例
// 多相机管理示例
private List<CameraManager> _cameraManagers = new List<CameraManager>();
// 初始化多个相机
public void InitializeMultipleCameras(Settings settings)
{
foreach (var cameraConfig in settings.CameraConfigs)
{
var cameraManager = new CameraManager();
// 设置相机参数
_cameraManagers.Add(cameraManager);
}
}
在设置页面,可以修改模型路径:
在 ModelManager.cs 中可以修改AI模型推理相关配置:
-
加载多个模型
// 多模型管理示例 private Dictionary<string, Model> _models = new Dictionary<string, Model>(); // 加载多个模型 public void LoadModels(List<string> modelPaths) { foreach (var path in modelPaths) { string modelName = Path.GetFileNameWithoutExtension(path); _models[modelName] = new Model(path, 0); } }
-
实现模型级联
- 可修改
PerformInference
方法实现多模型级联推理
// 级联推理示例 public string PerformCascadeInference(Bitmap image) { // 第一阶段:检测 var detectionResult = _models["DetModel"].InferBatch(imageList); // 第二阶段:分割 var smallImages = CropImage(image, detectionResult); var segmentationResult = _models["SegModel"].InferBatch(smallImages); return segmentationResult; }
- 可修改
-
自定义结果处理
- 可修改结果提取和处理逻辑,实现更复杂的决策规则
简单的设备逻辑可以在设置里修改:
在 MainLoopManager.cs 中可以修改整体处理逻辑:
-
修改位置序列
// 位置序列定义可以根据需要调整 private readonly float[] _positionSequence = new float[] { 195, 305, 415, 305 };
-
调整处理流程
- 主流程在
RunMainLoopAsync
方法中定义 - 可修改移动-拍照-推理的顺序或添加额外步骤
- 主流程在
-
添加图像预处理
- 在
ProcessImageAsync
方法中添加图像处理逻辑
// 图像预处理示例 private Bitmap PreprocessImage(Bitmap image) { using (var mat = BitmapConverter.ToMat(image)) { // 添加预处理步骤,如二值化等 Cv2.CvtColor(mat, mat, ColorConversionCodes.BGR2GRAY); Cv2.Threshold(mat, mat, 128, 255, ThresholdTypes.Binary); return BitmapConverter.ToBitmap(mat); } }
- 在
-
自定义后处理逻辑
- 在推理结果处理后添加自定义逻辑,如结果聚合、条件判断等
// 后处理逻辑示例 private bool PostProcessResult(string result) { // 实现自定义决策逻辑 if (result.Contains("缺陷") && _currentPositionIndex == 2) { // 特定位置的特定缺陷处理 return false; } return string.IsNullOrEmpty(result); }