.NET 开源工业视觉系统 OpenIVS 快速搭建自动化检测平台
<h2 id="前言">前言</h2><p>随着工业4.0和智能制造的发展,工业视觉在质检、定位、识别等场景中发挥着越来越重要的作用。然而,开发一个完整的工业视觉系统往往需要集成相机控制、图像采集、图像处理、AI推理、PLC通信等多个模块,这对开发人员提出了较高的技术要求。</p>
<p>推荐一个基于 .NET 平台的开源工业视觉软件框架OpenIVS,提供完整的视觉系统开发所需的基础功能模块,帮助大家快速开发高效、稳定的工业检测系统。</p>
<h2 id="项目介绍">项目介绍</h2>
<p>OpenIVS 全称 Open Source Industrial Vision System,是一个面向工业视觉领域的开源软件框架,提供一套标准化、模块化、可扩展的视觉系统开发平台。</p>
<p>它基于 .NET 平台开发,支持与主流工业相机(如海康MVS)、图像处理库(如Halcon、OpenCV)、AI推理SDK(如深度视觉AI平台)进行集成,并提供 PLC 控制、图像采集、模型推理、结果反馈等功能模块,适用于各种自动化检测场景。</p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202505/576536-20250529102117309-891760355.jpg" width="700" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<h2 id="项目功能">项目功能</h2>
<p>OpenIVS 主要包含以下核心功能模块:</p>
<h3 id="1相机连接与图像采集">1、相机连接与图像采集</h3>
<p>支持海康MVS相机驱动;</p>
<p>可配置触发方式、曝光参数、图像保存路径;</p>
<p>支持单相机或多相机管理;</p>
<p>图像质量与存储策略可自定义。</p>
<h3 id="2ai模型推理">2、AI模型推理</h3>
<p>集成深度视觉AI平台高性能SDK;</p>
<p>支持加载多个模型并实现级联推理;</p>
<p>支持图像预处理与结果后处理;</p>
<p>模型路径可通过界面动态配置。</p>
<h3 id="3plc控制与设备逻辑">3、PLC控制与设备逻辑</h3>
<p>支持Modbus串口通信协议;</p>
<p>可设置串口参数、设备ID、寄存器地址;</p>
<p>提供位置控制、OK/NG信号反馈等基础逻辑;</p>
<p>支持扩展自定义控制动作。</p>
<h3 id="4系统配置与设置">4、系统配置与设置</h3>
<p>提供图形化设置页面,便于修改相机参数、PLC设置、模型路径;</p>
<p>支持图像保存策略(是否保存OK图或NG图);</p>
<p>可灵活调整位置序列、处理流程、图像处理算法等。</p>
<h2 id="项目特点">项目特点</h2>
<p>OpenIVS 不仅功能全面,还具备以下优势:</p>
<p><strong>模块化设计</strong></p>
<p>各功能模块(相机、AI、PLC、图像处理)高度解耦,便于独立开发、调试与替换。</p>
<p><strong>开源免费</strong></p>
<p>作为开源项目,开发者可以自由查看源码、进行二次开发,适配自身业务需求。</p>
<p><strong>易于扩展</strong></p>
<p>支持多相机、多模型、多任务并发处理,满足复杂工业场景下的定制化需求。</p>
<p><strong>跨平台兼容性好</strong></p>
<p>基于 .NET 平台,可在 Windows 上稳定运行,未来可拓展至 Linux 环境。</p>
<p><strong>实时性强、稳定性高</strong></p>
<p>通过异步处理机制和良好的资源管理,确保系统在高频率检测任务中的实时性和稳定性。</p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202505/576536-20250529102436855-1726260385.png" width="700" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<h2 id="安装需求">安装需求</h2>
<p>在使用 OpenIVS 前,需要安装以下软件:</p>
<p><strong>1、海康相机MVS</strong></p>
<p>版本:MVS_STD_4.4.0_240913.exe</p>
<p>下载地址:MVS_STD_4.4.0_240913.zip</p>
<p>用于相机连接和图像采集</p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202505/576536-20250529102456336-475754672.png" width="700" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p><strong>2、Halcon(可选)</strong></p>
<p>版本:halcon-20.11.1.0-windows.exe</p>
<p>下载地址:https://www.mvtec.com/downloads</p>
<p>如果需要使用Halcon接口进行图像处理,则需要安装</p>
<p><strong>3、深度视觉AI平台</strong></p>
<p>官方网站:https://dlcv.com.cn</p>
<p>需要安装高性能SDK套件才能加载模型进行推理</p>
<p>需要使用深度视觉AI平台训练模型</p>
<p>该SDK提供了模型推理所需的各项功能</p>
<p>参考文档:https://docs.dlcv.com.cn/deploy/csharp_sdk</p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202505/576536-20250529102510544-1912548295.png" width="700" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<h2 id="项目使用">项目使用</h2>
<h3 id="1修改plc配置">1、修改PLC配置</h3>
<p>在 ModbusManager.cs 中可以修改PLC相关配置:</p>
<p><strong>串口通信参数设置</strong></p>
<pre><code class="language-cs">_modbusApi.SetSerialPort(
settings.PortName,// 串口名称
settings.BaudRate,// 波特率
settings.DataBits,// 数据位
settings.StopBits,// 停止位
settings.Parity, // 校验位
(byte)settings.DeviceId // 设备ID
);
</code></pre>
<p>也可以在设置页面修改:</p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202505/576536-20250529102524700-1768258547.png" width="700" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p><strong>位置控制参数</strong></p>
<p>修改<code>MoveToPositionAsync</code>方法可调整位置控制逻辑</p>
<p>调整位置精度:<code>Math.Abs(currentPosition - position) < 1.0f</code></p>
<p><strong>增加其他动作</strong></p>
<p>可在ModbusManager中增加其他PLC控制动作,以满足特定需求。例如:增加 OK/NG 信号控制。</p>
<p>假设 PLC 通过写入寄存器 16 实现 OK/NG 信号控制,可以在<code>ModbusManager</code>中增加如下方法:</p>
<pre><code class="language-cs">_modbusApi.WriteSingleRegister(16, isOK);
</code></pre>
<h3 id="2修改相机配置">2、修改相机配置</h3>
<p><strong>修改相机配置</strong></p>
<p>单相机的情况下,可以在设置页面修改,包括相机名称,触发方式等:</p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202505/576536-20250529102552838-490461075.png" width="700" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>同时也可以在设置页面修改:</p>
<ul>
<li>存图路径</li>
<li>存图质量</li>
<li>是否存储OK图或NG图</li>
</ul>
<p><strong>多相机支持</strong></p>
<ul>
<li>多相机的情况下,可以在 <code>CameraInitializer.cs</code> 中修改相机连接参数:</li>
<li>当前系统使用单例模式管理相机:<code>CameraInstance.Instance</code></li>
</ul>
<p>若需支持多相机,可修改为列表管理多个相机实例</p>
<pre><code class="language-cs">// 多相机管理示例
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);
}
}
</code></pre>
<h3 id="3修改模型推理方法">3、修改模型推理方法</h3>
<p><strong>设置模型路径</strong></p>
<p>在设置页面,可以修改模型路径:</p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202505/576536-20250529102609291-911925083.png" width="700" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p><strong>自定义模型推理</strong></p>
<p>在 ModelManager.cs 中可以修改AI模型推理相关配置:</p>
<p><strong>加载多个模型</strong></p>
<pre><code class="language-cs">// 多模型管理示例
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 = new Model(path, 0);
}
}
</code></pre>
<p><strong>实现模型级联</strong></p>
<p>可修改PerformInference方法实现多模型级联推理</p>
<pre><code class="language-cs">// 级联推理示例
public string PerformCascadeInference(Bitmap image)
{
// 第一阶段:检测
var detectionResult = _models["DetModel"].InferBatch(imageList);
// 第二阶段:分割
var smallImages = CropImage(image, detectionResult);
var segmentationResult = _models["SegModel"].InferBatch(smallImages);
return segmentationResult;
}
</code></pre>
<p><strong>自定义结果处理</strong></p>
<p>可修改结果提取和处理逻辑,实现更复杂的决策规则</p>
<h3 id="4修改设备逻辑">4、修改设备逻辑</h3>
<p>简单的设备逻辑可以在设置里修改:</p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202505/576536-20250529102626127-1104973214.png" width="700" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p><strong>自定义处理逻辑</strong></p>
<p>在 <code>MainLoopManager.cs</code> 中可以修改整体处理逻辑:</p>
<p><strong>1、修改位置序列</strong></p>
<pre><code class="language-cs">// 位置序列定义可以根据需要调整
private readonly float[] _positionSequence = new float[] { 195, 305, 415, 305 };
</code></pre>
<p><strong>2、调整处理流程</strong></p>
<p>主流程在<code>RunMainLoopAsync</code>方法中定义</p>
<p>可修改移动-拍照-推理的顺序或添加额外步骤</p>
<p><strong>3、添加图像预处理</strong></p>
<p>在ProcessImageAsync方法中添加图像处理逻辑</p>
<pre><code class="language-cs">// 图像预处理示例
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);
}
}
</code></pre>
<p><strong>4、自定义后处理逻辑</strong></p>
<p>在推理结果处理后添加自定义逻辑,如结果聚合、条件判断等</p>
<pre><code class="language-cs">// 后处理逻辑示例
private bool PostProcessResult(string result)
{
// 实现自定义决策逻辑
if (result.Contains("缺陷") && _currentPositionIndex == 2)
{
// 特定位置的特定缺陷处理
return false;
}
return string.IsNullOrEmpty(result);
}
</code></pre>
<h2 id="项目源码">项目源码</h2>
<p><strong>Gitee:</strong> https://gitee.com/dl-cv/OpenIVS</p>
<h2 id="总结">总结</h2>
<p>OpenIVS 是一个功能强大、结构清晰、易于扩展的开源工业视觉系统框架。无论你是刚入门的视觉开发新手,还是有经验的工程师,都可以借助 OpenIVS 快速搭建起属于自己的工业检测系统。</p>
<p>它不仅提供了从图像采集到缺陷识别的全流程能力,还开放了丰富的配置接口和扩展点,极大地降低了开发门槛和项目周期成本。</p>
<p>以上仅展示了OpenIVS 平台的部分功能。更多实用特性和详细信息,请大家访问项目源码。</p>
<p>希望本文能为从工业视觉开发的技术人员提供有价值的参考,感谢您阅读本篇文章,也欢迎交流讨论更多关于工业视觉平台设计与落地的经验!</p>
<p><strong>关键词</strong>:OpenIVS、工业视觉、图像处理、AI推理、PLC控制、C#、.NET、相机采集、开源框架、自动化检测</p>
<h2 id="最后">最后</h2>
<p>如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。</p>
<p>也可以加入微信公众号 社区,与其他热爱技术的同行一起交流心得,共同成长!</p>
<p><img src="https://img2024.cnblogs.com/blog/576536/202505/576536-20250527195524293-1794896295.png" width="50%" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p><br><br>
来源:https://www.cnblogs.com/1312mn/p/18899053
頁:
[1]