C# Winform框架视觉程序中,如何用多态方法实现对海康和Basler相机的调用

17小时前发布
0 0 0

C# Winform框架视觉程序中,如何用多态方法实现对海康和Basler相机的调用

前言一、整体实现思路介绍二、相机基类函数1.1 MyBaseCamera.cs
三、相机类函数1.1 海康相机类函数1.1.1 MyHKCamera.cs1.1.2 MyHKCamera2.cs1.1.3 软触发和回调函数关系1.1.4 硬触发和回调函数关系
2.2 Basler相机类函数2.2.1 MyBaslerCamera.cs2.2.2 MyBaslerCamera2.cs

四、外部函数怎样去调用封装好的相机类1.1 Cam类2.2 Data_Global类

前言

在工业视觉项目落地过程中,相机选型常因场景需求(如分辨率、帧率、接口类型)或成本预算,涉及海康、Basler 等不同品牌设备。而不同品牌相机的 SDK 接口、控制逻辑差异显著 —— 例如海康依赖MvCamCtrl.NET库管理 GigE/USB 设备,Basler 则需通过Pylon SDK实现采集,若直接在算法代码中嵌入各品牌控制逻辑,会导致代码耦合度高、维护困难(如新增相机品牌需大规模修改原有代码),且难以适配多相机协同的自动化场景(如多工位同步采集)。

为解决这一痛点,本方案基于 C# 多态特性,通过 “抽象基类 + 具体实现类” 的设计,将相机的共性功能(如连接 / 断开、触发控制、参数配置)封装为统一接口,再针对海康、Basler 分别实现差异化逻辑。最终达成 “上层调用无感知、底层替换低成本” 的效果,支持软触发 / 硬触发两种采集模式,且可直接对接视觉算法(如康耐视 VisionPro),大幅提升代码复用性与项目扩展性。

一、整体实现思路介绍

1、不同品牌的相机控制方法不一样,代码单独封装成一个类,这里列举了两类相机,一类是海康相机,另一类是Basler相机,把海康相机封装后放在MyHKCamera 组件中,把Basler相机封装后代码放在BaslerCamera组件中

2、相机共有的控制部分,封装成基类,放在Common组件中

3、Common组件中有相机的基类MyBaseCamera

4、MyHKCamera 组件中有海康相机MyHKCamera类,为了代码功能更清晰,MyHKCamera类分别用了MyHKCamera.cs、MyHKCamera2.cs两个文件进行封装

5、同样BaslerCamera组件中有MyBaslerCamera类,MyBaslerCamera类分别用MyBaslerCamera.cs、MyBaslerCamera2.cs两个文件进行封装,结构如下:
C# Winform框架视觉程序中,如何用多态方法实现对海康和Basler相机的调用

二、相机基类函数

1.1 MyBaseCamera.cs

1、结构图如下:cs文件中包含

相机触发枚举相机基本参数类相机基类

C# Winform框架视觉程序中,如何用多态方法实现对海康和Basler相机的调用
2、MyCameraInfo类
C# Winform框架视觉程序中,如何用多态方法实现对海康和Basler相机的调用
注意MyCameraInfo类的构造函数,需要传入相机的名称,比如下图海康相机名称就是字符串“1”,目的是让实际连接的物理相机和软件相机对应上去
C# Winform框架视觉程序中,如何用多态方法实现对海康和Basler相机的调用
3、MyBaseCamera 是抽象基类,用于统一管理相机设备的基础功能。它通过抽象方法定义了相机操作的标准接口,同时实现了一些通用逻辑,方便子类(如具体相机型号的实现类)继承和扩展
C# Winform框架视觉程序中,如何用多态方法实现对海康和Basler相机的调用
C# Winform框架视觉程序中,如何用多态方法实现对海康和Basler相机的调用

三、相机类函数

1.1 海康相机类函数

1.1.1 MyHKCamera.cs

1、这段代码是一个基于海康相机 SDK(MvCamCtrl.NET)封装的相机控制类 MyHKCamera,继承自 MyBaseCamera,实现了对海康相机的连接、配置、采集等核心功能。
2、注意构造函数:通过构造函数接收相机信息对象 MyCameraInfo,并传递给基类
C# Winform框架视觉程序中,如何用多态方法实现对海康和Basler相机的调用

1.1.2 MyHKCamera2.cs

1、这段代码是 MyHKCamera 类的补充实现,核心聚焦于海康相机图像数据的回调处理、像素格式转换、内存管理,并集成了康耐视(Cognex)VisionPro 视觉库用于图像数据封装

2、代码回调函数中的CogImage8Grey、CogImage8Root 是康耐视 VisionPro 的核心图像类,用于后续视觉算法(如边缘检测、模板匹配)。若无需使用 VisionPro,可替换为.NET 原生 Bitmap 类(需注意数据格式转换,如将灰度数据复制到 Bitmap 的像素数组
C# Winform框架视觉程序中,如何用多态方法实现对海康和Basler相机的调用

C# Winform框架视觉程序中,如何用多态方法实现对海康和Basler相机的调用

1.1.3 软触发和回调函数关系

TriggerSoftware() 和 ImageCallbackFunc 之间的关联是通过相机驱动和底层硬件交互实现的,本质上是 “命令触发 – 事件响应” 的异步交互模式,具体流程如下:

1、前期准备:注册回调函数
MyHKCamera.cs代码中


nRet = m_pCamera.MV_CC_RegisterImageCallBackEx_NET(ImageCallback, IntPtr.Zero); 

注册了回调函数,作用是将 ImageCallbackFunc 函数 “注册” 到相机驱动中,告诉驱动:“当你采集到图像后,就自动调用这个函数来处理数据”

2、触发与采集的中间过程
当调用 TriggerSoftware() 后,中间经历了以下步骤:

步骤 1:发送触发命令

TriggerSoftware() 中的 MV_CC_SetCommandValue_NET(“TriggerSoftware”) 会通过相机 SDK(软件开发工具包)向相机硬件发送一个 “软件触发” 的指令(通常是通过 USB / 网口等物理接口)。

步骤 2:相机硬件执行采集

相机收到触发指令后,会执行实际的图像采集(感光元件曝光、读取像素数据等硬件操作),这个过程由相机固件(内置程序)独立完成,不需要 CPU 干预。

步骤 3:数据传输到主机

相机采集完成后,会将原始图像数据(二进制像素值)通过物理接口传输到计算机内存中(通常是一块由驱动管理的缓冲区)。

步骤 4:驱动调用回调函数

相机驱动检测到新图像数据已传输完成后,会自动查找之前注册的回调函数(ImageCallbackFunc),并将以下参数传入该函数:

图像数据的内存地址(pData)

图像信息(宽、高、帧率等,pFrameInfo)

用户自定义参数(pUser,这里为IntPtr.Zero)

3.、本质:异步回调机制
两者的关联不是直接的函数调用,而是通过驱动层的事件通知实现的:

TriggerSoftware() 只负责 “发号施令”,之后就结束了,不会等待图像采集完成。相机采集和数据传输是异步进行的(和主线程并行)。当数据准备好后,驱动会 “反向调用” 提前注册好的 ImageCallbackFunc,完成数据处理。

这种模式类似:你(TriggerSoftware())向快递柜(相机)发送 “开门放快递” 的指令,快递柜完成操作后,会自动调用预设的通知函数(ImageCallbackFunc)告诉你 “快递已放入,请来处理”。

1.1.4 硬触发和回调函数关系

1、硬触发的作用
硬触发是通过外部物理信号(如 IO 口电平变化、脉冲信号)来触发相机采集图像,通常用于需要与外部设备(如传送带、机械臂)同步的场景(例如:传送带运动到特定位置时,传感器发送信号触发相机拍照)。

触发信号流程:
外部设备(如传感器)→ 相机IO接口 → 相机硬件 → 启动图像采集

2、回调函数的角色
当硬触发信号触发相机完成图像采集后,相机驱动会像处理软件触发一样,自动调用预先注册的回调函数(如之前的 ImageCallbackFunc),将采集到的图像数据传递给回调函数进行处理(如转码、显示、分析等)。

回调函数的触发时机:
硬触发信号 → 相机采集完成 → 驱动调用回调函数 → 处理图像

3、与软件触发的对比
软件触发:通过代码主动调用 TriggerSoftware() 触发采集,最终也会通过回调函数处理图像。
硬触发:由外部硬件信号触发采集,同样依赖回调函数处理结果,只是触发的 “源头” 不同(外部信号 vs 代码命令)。

总结:

硬触发和回调函数是因果关联:硬触发是 “因”(启动图像采集),回调函数是 “果”(处理采集结果)。无论触发方式是软件还是硬件,相机采集到图像后,都会通过回调函数完成后续处理,这是相机 SDK 普遍采用的异步处理模式。

2.2 Basler相机类函数

Basler相机的调用原理和海康相机类似,不再多做讲述,当然,如果要调用其他品牌相机,也可以按这种方式继续封装

2.2.1 MyBaslerCamera.cs

C# Winform框架视觉程序中,如何用多态方法实现对海康和Basler相机的调用

2.2.2 MyBaslerCamera2.cs

C# Winform框架视觉程序中,如何用多态方法实现对海康和Basler相机的调用

四、外部函数怎样去调用封装好的相机类

这里以调用海康相机为例:

1.1 Cam类

外部写一个Cam类,该类里面有一个public MyBaseCamera baseCamera基类相机的成员变化和public MyCameraInfo caminfo;相机信息类的成员变量, 有一个初始化方法public void Load(int index, string strPro)

1、caminfo = new MyCameraInfo(index.ToString());得到一个MyCameraInfo 的实例对象

2、 public MyBaseCamera baseCamera; baseCamera 变量的声明必须为 MyBaseCamera 类型(而非 MyHKCamera),否则无法体现多态特性(若声明为 MyHKCamera baseCamera,则失去了抽象类统一接口的意义)

3、baseCamera = new MyHKCamera(caminfo); 将caminfo实列对象传给MyHKCamera的构造函数:

第一步:调用父类(MyBaseCamera)的构造函数

MyHKCamera类 通过 : base(cameraInfo) 隐式调用了父类构造(代码中 public MyHKCamera(MyCameraInfo cameraInfo) : base(cameraInfo) { }),最终将 caminfo 传入父类,完成相机配置的初始化

第二步:初始化 MyHKCamera 自身的成员

MyHKCamera 作为海康相机的具体实现,会初始化 SDK 相关的核心成员(如代码中隐含的 m_pCamera 对象,即海康 SDK 的 MyCamera 实例,用于后续调用相机硬件接口)。
C# Winform框架视觉程序中,如何用多态方法实现对海康和Basler相机的调用

4、如果未来需要替换相机品牌(如从海康换成Basler),只需新增一个 MyBaseCamera 类继承 MyBaseCamera 并实现抽象方法,无需修改 baseCamera 的调用逻辑,只需将实例化代码改为 baseCamera = new MyBaslerCamera(caminfo); 即可,符合 “开闭原则”(对扩展开放,对修改关闭)。

5、Cam类中有AcqCamera()方法,该方法返回相机采集的图像
C# Winform框架视觉程序中,如何用多态方法实现对海康和Basler相机的调用

2.2 Data_Global类

外部再写一个全局类Data_Global

1、用数组方式定义多个Can相机类
C# Winform框架视觉程序中,如何用多态方法实现对海康和Basler相机的调用
2、实例化所有相机
C# Winform框架视觉程序中,如何用多态方法实现对海康和Basler相机的调用
3、获取相机采集的图片
C# Winform框架视觉程序中,如何用多态方法实现对海康和Basler相机的调用

以上是使用态方法实现对海康和Basler相机的调用过程解析,文档中用到的封装库已上传,需要的可自行下载!

© 版权声明

相关文章

没有相关内容!

暂无评论

none
暂无评论...