C#笔记 关于采集卡
周更!节日快乐!
1. 参数
1.1 CAM file
CAM file是文件扩展名为.cam的可读ASCII文件,包含了参数列表,比如:AcquisitionMode,TrigMode等。通过McSetParamStr方法将Camfile加载到通道:
McSetParamStr(MyChannelMyChannel, MC_CamFile , "VCC VCC-870A_P15RA");
1.2 channel
通道是摄像头、帧捕获器和主机PC内存之间的采集路径。通道由三部分组成:
1. 负责图像捕获的相机。
2. 帧捕获器负责图像的采集和传输。
3. 用于在主机PC中存储图像的内存缓冲区。
通道可以被设置为以下四种状态之一:
Name | Meaning |
Orphan | 没有与之关联的抓取器。因此不可能立即获取图像。但是通道存在,其所有参数都可以自由设置或获取。 |
Idle |
当通道处于空闲状态时,它有一个与之关联的抓取器。因此,可以立即进行图像采集。在此状态下,MultiCam可能会自动将抓取器资源重新分配给另一个通道。 |
Ready |
当通道处于就绪状态时,它有一个与之关联的抓取器。因此,可以立即进行图像采集。在此状态下,MultiCam无法自动将抓取器资源重新分配给另一个通道。 |
Active | 当通道处于活动状态时,它有一个与其相关联的抓取器,并执行图像采集序列。在此状态下,MultiCam无法自动将抓取器资源重新分配给另一个通道。 |
代码示例:
1.3 surface
surface是一个缓冲区,用户应用程序可以在其中找到要分析的采集图像。内存缓冲区由称为surface的MultiCam对象表示。surface可以由Multicam自动创建,也可以由用户手动创建。抓取器通过DMA机制自动将采集的图像传输到目标surface。通道可以有一个或多个surface(默认为4)。根据surface的数量,定义了单缓冲和多缓冲。
Surface state | Meaning |
FREE | 自由表面能够无条件地从抓取器接收图像数据。 |
FILLING |
目前正在从抓取器接收图像数据,或准备接收数据。一个cluster中应该都有一个FILLING状态的Surface。 |
FILLED | 已完成从抓取器接收图像数据,已准备好进行处理。 |
PROCESSING |
PROCESSING状态的Surface正在被处理器处理。 |
RESERVED | 从标准状态转换机制中删除。 |
代码示例:
一组surface称为cluster,一个通道只能有一个cluster。cluster的状态有OFF,READY(在获取图像但没有surface处于PROCESSING),BUSY(有surface处于PROCESSING),UNAVAILABLE(不能获取图像)
Single Buffering
Dual Buffering
Triple Buffering
1.4 Multicam Signaling
信号是由通道生成的与用户应用程序交互的事件。
Frame Trigger Violation | |
Start Exposure | 该信号在帧曝光条件开始时发出。 |
End Exposure | 该信号在帧曝光条件结束时发出。 |
Surface Filled | 当目标cluster的Surface 进入Filled状态时,会发出此信号。 |
Surface Processing | 当目标cluster的Surface 进入Processing状态时,会发出此信号。 |
Cluster Unavailable | |
Acquisition failure (**) | |
Start of Acquisition Sequence |
|
End of Acquisition Sequence | |
End of Channel Activity |
有三种机制可以访问它们:
1. 涉及在出现预定义信号时自动调用的用户编写的函数。(callback)
2. 允许线程等待预定义信号出现的专用机制。
3. 涉及标准Windows等待函数的用户定义机制。
使用callback的步骤:
1. 默认情况下,禁用所有信号。SignalEnable参数用于设置它。
2. 注册回调函数
3. 在回调函数中,使用包含触发事件信息的PMCSIGNALINFO捕获事件。
示例:
1.5 Trigger
触发事件由TrigMode和NextTrigMode参数进行设置。
1.5.1 初始触发事件:
- 连续:将ChannelState设为Active后立即启动,NextTrigMode为REPEAT
- 硬触发
- 软触发:将ForceTrig参数设置为TRIG
- 结合触发
1.5.2 触发事件的结束
可以通过EndTrigMode结束采集阶段:
1)帧、页或行计数器到期时,采集序列自动终止。(AUTO)
2)当检测到硬件端触发线的有效转换时,采集序列终止(HARD)
或者通过BreakEffect参数直接终止channel的活动状态:
1)在slice/phase/sequence结束后再停止采集(FINISH)
2)立刻停止(ABORT)
1.6 Acquisition Mode
- VIDEO模式用于从标准区域扫描摄像机记录多个视频序列。ActivityLength指定通道活动周期内的序列数。
- SNAPSHOT模式用于从区域扫描相机获取快照图像。唯一序列能够在信道活动周期内获取SeqLength_Fr帧。
- PAGE模式用于从线扫描相机获取离散对象的图像。每一页由连续的行组成;页面长度(以行表示)由PageLength\u Ln指定。单个序列能够在通道活动周期内获取SeqLength_Pg页面。
- WEB模式用于从线扫描相机获取连续对象(如网络)的图像。在信道活动周期内,可使用单个序列获取连续行的SeqLength_。序列被划分为连续的相位,每个相位获取PageLength\u Ln行。如果SeqLength_Ln不是PageLength_Ln的倍数,则在最后阶段会部分填充surface。序列和第一采集阶段根据触发模式启动。后续采集阶段自动启动,无任何线路损耗。BreakEffect指定用户中断时的行为。
1.7 Exception
异常通过异常代码或Windows异常进行管理。ErrorHandling参数设置错误管理行为,有4个可能的值。
- None 没有异常时为MC_OK或者0,有异常时函数会返回MCSTATUS类型的值。
-
MSGBOX 没有异常时为MC_OK或者0,有异常会显示对话框
- Exception
- MSGException
2. Demo
2.1 打开driver
// Open MultiCam driver MC.OpenDriver();
2.2 创建channel
// Create a channel and associate it with the first connector on the first board MC.Create("CHANNEL", out channel); MC.SetParam(channel, "DriverIndex", 0);
2.3 相机参数设置
// Choose the CAM file MC.SetParam(channel, "CamFile", "1000m_P50RG"); // Choose the camera expose duration MC.SetParam(channel, "Expose_us", 20000); // Choose the pixel color format MC.SetParam(channel, "ColorFormat", "Y8");
2.4 触发模式更改
//Set the acquisition mode to Snapshot MC.SetParam(channel, "AcquisitionMode", "SNAPSHOT"); // Choose the way the first acquisition is triggered MC.SetParam(channel, "TrigMode", "COMBINED"); // Choose the triggering mode for subsequent acquisitions MC.SetParam(channel, "NextTrigMode", "COMBINED");
2.5 事件触发
2.5.1 注册回调函数
// Register the callback function multiCamCallback = new MC.CALLBACK(MultiCamCallback); MC.RegisterCallback(channel, multiCamCallback, channel);
2.5.2 开启信号
// Enable the signals corresponding to the callback functions MC.SetParam(channel, MC.SignalEnable + MC.SIG_SURFACE_PROCESSING, "ON"); MC.SetParam(channel, MC.SignalEnable + MC.SIG_ACQUISITION_FAILURE, "ON");
2.5.3 判断接收到的信号
如果接收到的是MC.SIG_SURFACE_PROCESSING,调用ProcessingCallback获取图片的数据,将图片数据转换为bitmap。如果接收到的是MC.SIG_ACQUISITION_FAILURE,调用AcqFailureCallback输出"Acquisition Failure"。
private void MultiCamCallback(ref MC.SIGNALINFO signalInfo) { switch(signalInfo.Signal) { case MC.SIG_SURFACE_PROCESSING: ProcessingCallback(signalInfo); break; case MC.SIG_ACQUISITION_FAILURE: AcqFailureCallback(signalInfo); break; default: throw new Euresys.MultiCamException("Unknown signal"); } }
2.6 channel状态置为READY
// Prepare the channel in order to minimize the acquisition sequence startup latency MC.SetParam(channel, "ChannelState", "READY");
3. 测试程序的编写
触发模式就用默认的连续触发。
将camfile的加载显示在界面上。
Demo界面只有Go和stop还有状态条,增加按钮打开/关闭相机和开始/停止采集。
曝光开始事件触发,帧开始count++;surface_processing事件触发,采图count++;获取失败事件触发,丢失帧count++。
代码绝对是运行不起来的,毕竟我是一个采集卡都没见过的人,纸上谈兵罢了哈哈哈