视觉系统的模块集成方式,核心矛盾是:相机品牌、算法库、通信协议各不相同,如何让它们在一个系统里“即插即用”。目前工业界成熟的方案是插件化架构 + 依赖注入 + 统一接口抽象,用接口隔离差异,用反射动态加载实现“换硬件不改代码”。
插件化架构:把差异封装在 DLL 里
插件化是最彻底的解耦方式。核心思路是:主程序只依赖接口,不依赖任何具体实现。相机驱动、算法模块各自编译成独立的 DLL,主程序运行时动态加载。
一个工业视觉平台的实现方式很典型:定义统一的ICamera接口,包含Connect、Grab、StopGrab等通用方法,屏蔽底层海康 SDK 的MV_CC_*、Basler pylon 或大恒 SDK 的差异。相机工厂CameraFactory通过Assembly.LoadFrom扫描指定目录下的 DLL,按类型名实例化对象。接入一个新相机品牌时,只需按约定编写一个实现ICamera的 DLL 放入目录,平台自动识别,主程序一行不改。
算法模块同理。Dora 视觉集成系统基于接口抽象视觉算法模块,支持 Halcon、OpenCVSharp 等算法库的动态加载,通过配置文件切换算法实现(缺陷检测、定位、测量),满足不同场景需求。
依赖注入:在 .NET 生态中优雅装配
EMBL 汉堡的 TINE Smart Video Plug-in System 提供了一个参考实现:用.NET 内置的依赖注入模式,把 OpenCV、ML.NET 以及不同厂商的相机 API 连接成一个单一应用。这种做法把“谁依赖谁”的控制权从编译期转移到了运行期,让跨平台、跨 SDK 的集成变得可控。
海康 VisionMaster 的 WPF 二次开发模板也采用了类似的架构:所有核心业务(IVmService、IInspectionRepository、IEventBus)均通过接口交互,统一在组合根AppServices.cs装配,再由App.xaml.cs注入主窗口。这种“组合根”模式让依赖关系集中可见,便于维护和测试。
案例分析:视觉对位系统的模块集成
一个 WPF + OpenCV 的视觉对位运动控制系统展示了模块化的实战价值。项目将整个系统拆分为图像处理工具、流程配置引擎、二维码识别、文字识别等独立模块,用户可以“随意配置执行流程”。这种设计让新检测任务的开发周期从 3 天压缩到 1 天,流程节点复用率超过 80%。
模块化的另一个收益是测试和调试的便利性。虚拟相机功能允许在没有真实设备的情况下,用本地图片模拟采集流程,极大提升了开发效率。故障注入面板可以一键触发 PLC 断线、相机离线、模型损坏等异常场景,验证系统的容错能力。
集成的三个关键约束
接口设计要“薄”。ICamera接口只暴露Connect、Grab、StopGrab这类通用方法,不要把某个品牌特有的参数塞进去。品牌特有功能通过扩展接口或配置对象处理。
资源释放要彻底。插件化架构中,DLL 动态加载会占用非托管资源。窗口关闭时必须主动StopGrab、Disconnect并Dispose相机对象,防止内存泄漏。
配置要外置。相机参数、标定数据、算法配置以 JSON 形式存储,便于版本控制和迁移。换型时只改配置文件,不改代码。
一句话总结
模块集成的本质是用接口定义契约,用插件实现隔离,用依赖注入完成装配。相机换品牌只加一个 DLL,算法换库只改配置,通信换协议只换实现类——主程序永远是“空壳”,能力全部来自运行时加载的插件。