当前位置: 首页 > article >正文

.NET 开源工业视觉系统 OpenIVS 快速搭建自动化检测平台

前言

随着工业4.0和智能制造的发展,工业视觉在质检、定位、识别等场景中发挥着越来越重要的作用。然而,开发一个完整的工业视觉系统往往需要集成相机控制、图像采集、图像处理、AI推理、PLC通信等多个模块,这对开发人员提出了较高的技术要求。

推荐一个基于 .NET 平台的开源工业视觉软件框架OpenIVS,提供完整的视觉系统开发所需的基础功能模块,帮助大家快速开发高效、稳定的工业检测系统。

项目介绍

OpenIVS 全称 Open Source Industrial Vision System,是一个面向工业视觉领域的开源软件框架,提供一套标准化、模块化、可扩展的视觉系统开发平台。

它基于 .NET 平台开发,支持与主流工业相机(如海康MVS)、图像处理库(如Halcon、OpenCV)、AI推理SDK(如深度视觉AI平台)进行集成,并提供 PLC 控制、图像采集、模型推理、结果反馈等功能模块,适用于各种自动化检测场景。

项目功能

OpenIVS 主要包含以下核心功能模块:

1、相机连接与图像采集

支持海康MVS相机驱动;

可配置触发方式、曝光参数、图像保存路径;

支持单相机或多相机管理;

图像质量与存储策略可自定义。

2、AI模型推理

集成深度视觉AI平台高性能SDK;

支持加载多个模型并实现级联推理;

支持图像预处理与结果后处理;

模型路径可通过界面动态配置。

3、PLC控制与设备逻辑

支持Modbus串口通信协议;

可设置串口参数、设备ID、寄存器地址;

提供位置控制、OK/NG信号反馈等基础逻辑;

支持扩展自定义控制动作。

4、系统配置与设置

提供图形化设置页面,便于修改相机参数、PLC设置、模型路径;

支持图像保存策略(是否保存OK图或NG图);

可灵活调整位置序列、处理流程、图像处理算法等。

项目特点

OpenIVS 不仅功能全面,还具备以下优势:

模块化设计

各功能模块(相机、AI、PLC、图像处理)高度解耦,便于独立开发、调试与替换。

开源免费

作为开源项目,开发者可以自由查看源码、进行二次开发,适配自身业务需求。

易于扩展

支持多相机、多模型、多任务并发处理,满足复杂工业场景下的定制化需求。

跨平台兼容性好

基于 .NET 平台,可在 Windows 上稳定运行,未来可拓展至 Linux 环境。

实时性强、稳定性高

通过异步处理机制和良好的资源管理,确保系统在高频率检测任务中的实时性和稳定性。

安装需求

在使用 OpenIVS 前,需要安装以下软件:

1、海康相机MVS

版本:MVS_STD_4.4.0_240913.exe

下载地址:MVS_STD_4.4.0_240913.zip

用于相机连接和图像采集

2、Halcon(可选)

版本:halcon-20.11.1.0-windows.exe

下载地址:Download Area: MVTec Software

如果需要使用Halcon接口进行图像处理,则需要安装

3、深度视觉AI平台

官方网站:https://dlcv.com.cn

需要安装高性能SDK套件才能加载模型进行推理

需要使用深度视觉AI平台训练模型

该SDK提供了模型推理所需的各项功能

参考文档:高性能SDK套件 - C#接口 | 深度视觉

项目使用

1、修改PLC配置

在 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);

2、修改相机配置

修改相机配置

单相机的情况下,可以在设置页面修改,包括相机名称,触发方式等:

同时也可以在设置页面修改:

  • 存图路径
  • 存图质量
  • 是否存储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);}
}

3、修改模型推理方法

设置模型路径

在设置页面,可以修改模型路径:

自定义模型推理

在 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;
}

自定义结果处理

可修改结果提取和处理逻辑,实现更复杂的决策规则

4、修改设备逻辑

简单的设备逻辑可以在设置里修改:

自定义处理逻辑

在 MainLoopManager.cs 中可以修改整体处理逻辑:

1、修改位置序列

// 位置序列定义可以根据需要调整
private readonly float[] _positionSequence = new float[] { 195, 305, 415, 305 };

2、调整处理流程

主流程在RunMainLoopAsync方法中定义

可修改移动-拍照-推理的顺序或添加额外步骤

3、添加图像预处理

在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);}
}

4、自定义后处理逻辑

在推理结果处理后添加自定义逻辑,如结果聚合、条件判断等

// 后处理逻辑示例
private bool PostProcessResult(string result)
{// 实现自定义决策逻辑if (result.Contains("缺陷") && _currentPositionIndex == 2){// 特定位置的特定缺陷处理return false;}return string.IsNullOrEmpty(result);
}

 

相关文章:

.NET 开源工业视觉系统 OpenIVS 快速搭建自动化检测平台

前言 随着工业4.0和智能制造的发展&#xff0c;工业视觉在质检、定位、识别等场景中发挥着越来越重要的作用。然而&#xff0c;开发一个完整的工业视觉系统往往需要集成相机控制、图像采集、图像处理、AI推理、PLC通信等多个模块&#xff0c;这对开发人员提出了较高的技术要求…...

从0到1掌握Kotlin高阶函数:开启Android开发新境界!

简介 在当今的Android开发领域,Kotlin已成为开发者们的首选编程语言。其高阶函数特性更是为代码的编写带来了极大的灵活性和简洁性。本文将深入探讨Kotlin中的高阶函数,从基础概念到实际应用,结合详细的代码示例和mermaid图表,为你呈现一个全面且深入的学习指南。无论你是…...

【OSS】 前端如何直接上传到OSS 上返回https链接,如果做到OSS图片资源加密访问

使用阿里云OSS&#xff08;对象存储服务&#xff09;进行前端直接上传并返回HTTPS链接&#xff0c;同时实现图片资源的加密访问&#xff0c;可以通过以下步骤实现&#xff1a; 前端直接上传到OSS并返回HTTPS链接 设置OSS Bucket&#xff1a; 确保你的OSS Bucket已创建&#xf…...

AI智能分析网关V4室内消防逃生通道占用检测算法打造住宅/商业/工业园区等场景应用方案

一、方案背景​ 火灾严重威胁生命财产安全&#xff0c;消防逃生通道畅通是人员疏散的关键。但现实中通道被占用、堵塞现象频发&#xff0c;传统人工巡查监管效率低、不及时。AI智能分析网关V4结合消防逃生通道占用算法&#xff0c;以强大的图像识别和数据分析能力&#xff0c;…...

商城前端监控体系搭建:基于 Sentry + Lighthouse + ELK 的全链路监控实践

在电商行业&#xff0c;用户体验直接关乎转化率和用户留存。一个页面加载延迟1秒可能导致7%的订单流失&#xff0c;一次未捕获的前端错误可能引发用户信任危机。如何构建一套高效的前端监控体系&#xff0c;实现错误实时追踪、性能深度优化与数据可视化分析&#xff1f;本文将揭…...

Kotlin 中的数据类型有隐式转换吗?为什么?

在 Kotlin 中&#xff0c;基本数据类型没有隐式转换。主要出于安全性和明确性的考虑。 1 Kotlin 的显式类型转换规则 Kotlin 要求开发者显式调用转换函数进行类型转换&#xff0c; 例如&#xff1a; val a: Int 10 val b: Long a.toLong() // 必须显式调用 toLong() // 错…...

基于 HTTP 的邮件认证深入解读 ngx_mail_auth_http_module

一、模块启用与示例配置 mail {server {listen 143; # IMAPprotocol imap;auth_http http://auth.local/auth;# 可选&#xff1a;传递客户端证书给认证服务auth_http_pass_client_cert on;auth_http_timeout 5s;auth_http_header X-Auth-Key "shared_se…...

关于无法下载Qt离线安装包的说明

不知道出于什么原因考虑&#xff0c;Qt官方目前不提供离线的安装包下载&#xff0c;意味着网上各种文章提供的各种下载地址都失效了&#xff0c;会提示Download from your IP address is not allowed&#xff0c;当然目前可以在线安装&#xff0c;但是据说只提供了从5.15开始的…...

Java开发经验——阿里巴巴编码规范实践解析4

摘要 本文主要介绍了阿里巴巴编码规范中关于日志处理的相关实践解析。强调了使用日志框架&#xff08;如 SLF4J、JCL&#xff09;而非直接使用日志系统&#xff08;如 Log4j、Logback&#xff09;的 API 的重要性&#xff0c;包括解耦日志实现、统一日志调用方式等好处。同时&…...

HTML应用指南:利用GET请求获取全国捞王锅物料理门店位置信息

随着新零售业态的快速发展&#xff0c;门店位置信息的获取变得越来越重要。作为知名中式餐饮品牌之一&#xff0c;捞王锅物料理自2009年创立以来&#xff0c;始终致力于为消费者提供高品质的锅物料理与贴心的服务体验。经过多年的发展&#xff0c;捞王在全国范围内不断拓展门店…...

算法日记32:埃式筛、gcd和lcm、快速幂、乘法逆元

一、埃式筛&#xff08;计算质数&#xff09; 1.1、概念 1.1.1、在传统的计算质数中&#xff0c;我们采用单点判断&#xff0c;即判断(2~sqrt(n))是否存在不合法元素&#xff0c;若存在则判否&#xff0c;否则判是 1.1.2、假设&#xff0c;此时我们需要求1~1000的所有质数&am…...

黑马点评-分布式锁Lua脚本

文章目录 分布式锁Redis setnxredis锁误删Lua脚本 分布式锁 当我们的项目服务器不只是一台&#xff08;单体&#xff09;&#xff0c;而是部署在多态服务器上&#xff08;集群/分布式&#xff09;&#xff0c;同样会出现线程安全问题。不同服务器内部有不同的JVM&#xff0c;每…...

P7-大规模语言模型分布式训练与微调框架调研文档

1. 引言 随着大语言模型&#xff08;LLMs&#xff09;在自然语言处理&#xff08;NLP&#xff09;、对话系统、文本生成等领域的广泛应用&#xff0c;分布式训练和高效微调技术成为提升模型性能和部署效率的关键。分布式训练框架如 Megatron-LM 和 DeepSpeed 针对超大规模模型…...

机械师安装ubantu双系统:三、GPT分区安装Ubantu

目录 一、查看磁盘格式 二、安装ubantu 参考链接&#xff1a; GPT分区安装Ubuntu_哔哩哔哩_bilibili 一、查看磁盘格式 右击左边灰色区域&#xff0c;点击属性 二、安装ubantu 插入磁盘&#xff0c;重启系统&#xff0c;狂按F7&#xff08;具体我也忘了&#xff09;&#…...

ORM++ 封装实战指南:安全高效的 C++ MySQL 数据库操作

ORM 封装实战指南&#xff1a;安全高效的 C MySQL 数据库操作 一、环境准备 1.1 依赖安装 # Ubuntu/Debian sudo apt-get install libmysqlclient-dev # CentOS sudo yum install mysql-devel# 编译时链接库 (-I 指定头文件路径 -L 指定库路径) g main.cpp -stdc17 -I/usr/i…...

kafka学习笔记(三、消费者Consumer使用教程——从指定位置消费)

1.简介 Kafka的poll()方法消费无法精准的掌握其消费的起始位置&#xff0c;auto.offset.reset参数也只能在比较粗粒度的指定消费方式。更细粒度的消费方式kafka提供了seek()方法可以指定位移消费允许消费者从特定位置&#xff08;如固定偏移量、时间戳或分区首尾&#xff09;开…...

【后端高阶面经:架构篇】46、分布式架构:如何应对高并发的用户请求

一、架构设计原则:构建可扩展的系统基石 在分布式系统中,高并发场景对架构设计提出了极高要求。 分层解耦与模块化是应对复杂业务的核心策略,通过将系统划分为客户端、CDN/边缘节点、API网关、微服务集群、缓存层和数据库层等多个层次,实现各模块的独立演进与维护。 1.1 …...

网络编程学习笔记——TCP网络编程

文章目录 1、socket()函数2、bind()函数3、listen()4、accept()5、connect()6、send()/write()7、recv()/read()8、套接字的关闭9、TCP循环服务器模型10、TCP多线程服务器11、TCP多进程并发服务器 网络编程常用函数 socket() 创建套接字bind() 绑定本机地址和端口connect() …...

Vue+element-ui,实现表格渲染缩略图,鼠标悬浮缩略图放大,点击缩略图播放视频(一)

Vueelement-ui&#xff0c;实现表格渲染缩略图&#xff0c;鼠标悬浮缩略图放大&#xff0c;点击缩略图播放视频 前言整体代码预览图具体分析基础结构主要标签作用videoel-popover 前言 如标题&#xff0c;需要实现这样的业务 此处文章所实现的&#xff0c;是静态视频资源。 注…...

day13 leetcode-hot100-22(链表1)

160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 1.哈希集合HashSet 思路 &#xff08;1&#xff09;将A链的所有数据存储到HashSet中。 &#xff08;2&#xff09;遍历B链&#xff0c;找到是否在A中存在。 具体代码 /*** Definition for singly-linked list.* pu…...

【Oracle】DQL语言

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. DQL概述1.1 什么是DQL&#xff1f;1.2 DQL的核心功能 2. SELECT语句基础2.1 基本语法结构2.2 最简单的查询2.3 DISTINCT去重 3. WHERE条件筛选3.1 基本条件运算符3.2 逻辑运算符组合3.3 高级条件筛选 4. 排序…...

HUAWEI华为MateBook D 14 2021款i5,i7集显非触屏(NBD-WXX9,NbD-WFH9)原装出厂Win10系统

适用型号&#xff1a;NbD-WFH9、NbD-WFE9A、NbD-WDH9B、NbD-WFE9、 链接&#xff1a;https://pan.baidu.com/s/1qTCbaQQa8xqLR-4Ooe3ytg?pwdvr7t 提取码&#xff1a;vr7t 华为原厂WIN系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office…...

【STIP】安全Transformer推理协议

Secure Transformer Inference Protocol 论文地址&#xff1a;https://arxiv.org/abs/2312.00025 摘要 模型参数和用户数据的安全性对于基于 Transformer 的服务&#xff08;例如 ChatGPT&#xff09;至关重要。虽然最近在安全两方协议方面取得的进步成功地解决了服务 Transf…...

leetcode hot100刷题日记——27.对称二叉树

方法一&#xff1a;递归法 class Solution { public:bool check(TreeNode *left,TreeNode *right){//左子树和右子树的节点同时是空的是对称的if(leftnullptr&&rightnullptr){return true;}if(leftnullptr||rightnullptr){return false;}//检查左右子树的值相不相等&a…...

高考加油(Python+HTML)

前言 询问DeepSeek根据自己所学到的知识来生成多个可执行的代码&#xff0c;为高考学子加油。最开始生成的都会有点小问题&#xff0c;还是需要自己调试一遍&#xff0c;下面就是完整的代码&#xff0c;当然了最后几天也不会有多少人看&#xff0c;都在专心的备考。 Python励…...

贪心算法应用:Ford-Fulkerson最大流问题详解

Java中的贪心算法应用:Ford-Fulkerson最大流问题详解 1. 最大流问题概述 最大流问题(Maximum Flow Problem)是图论中的一个经典问题,旨在找到一个从源节点(source)到汇节点(sink)的最大流量。Ford-Fulkerson方法是解决最大流问题的经典算法之一,它属于贪心算法的范畴…...

UE5 Niagara 如何让四元数进行旋转

Axis Angle中&#xff0c;X,Y,Z分别为旋转的轴向&#xff0c;W为旋转的角度&#xff0c;在这里旋转角度不需要除以2&#xff0c;因为里面已经除了&#xff0c;再将计算好的四元数与要进行旋转的四元数进行相乘&#xff0c;结果就是按照原来的角度绕着某一轴向旋转了某一角度...

从“黑箱”到透明化:MES如何重构生产执行全流程?

引言 在传统制造企业中&#xff0c;生产执行环节常面临“计划混乱、进度难控、异常频发、数据滞后”的困境。人工派工效率低下、物料错配频发、质量追溯困难等问题&#xff0c;直接导致交付延期、成本攀升、客户流失。深蓝易网MES系统以全流程数字化管理为核心&#xff0c;通过…...

探索Linux互斥:线程安全与资源共享

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 互斥是并发编程中避免竞争条件和保护共享资源的核心技术。通过使用锁或信号量等机制&#xff0c;能够确保多线程或多进程环境下对共享资源的安全访问&#xff0c;避免数据不一致、死锁等问题。 竞争条件 竞…...

JWT安全:假密钥.【签名随便写实现越权绕过.】

JWT安全&#xff1a;假密钥【签名随便写实现越权绕过.】 JSON Web 令牌 (JWT)是一种在系统之间发送加密签名 JSON 数据的标准化格式。理论上&#xff0c;它们可以包含任何类型的数据&#xff0c;但最常用于在身份验证、会话处理和访问控制机制中发送有关用户的信息(“声明”)。…...