Baumer工业相机堡盟工业相机如何通过BGAPI SDK使用DeviceEvents“设备事件”记录相机事件的各类时间(C++)

简介: Baumer工业相机堡盟工业相机如何通过BGAPI SDK使用DeviceEvents“设备事件”记录相机事件的各类时间(C++)

Baumer工业相机

Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。


Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有快速数据传输、低功耗、易于集成以及高度可扩展性等特点。

Baumer工业相机通过使用BGAPI SDK进行开发时,有时需要使用SDK的设备事件功能,因为有时时候工程技术人员需要监测和响应由相机触发的各种事件,如相机设置的变化、连接问题或图像采集的错误。


通过利用设备事件功能,开发人员可以创建全面的错误处理流程,帮助确保摄像机可靠和稳定的运行。此外,这一功能通过减少不必要的数据传输和处理,可以更有效地利用系统资源。总之,设备事件功能是提高工业相机应用性能和可靠性的重要工具。


Baumer工业相机SDK中设备事件的技术背景

Baumer工业相机SDK中的设备事件功能的技术背景取决于BGAPI SDK。然而,一般来说,设备事件功能用于捕获和响应相机上发生的事件,如图像捕获、运动检测或输入/输出信号。这些事件通常是由相机硬件或固件触发的,可用于自动化某些过程或实时触发警报。


要在工业相机SDK中实现设备事件功能,开发人员通常需要注册特定的事件,定义回调函数来处理每个事件,并设置适当的事件过滤器和事件处理规则。


这里主要描述如何在C++的平台下实现通过BGAPI SDK实现相机事件DeviceEvents功能的核心代码


代码案例分享

本文介绍使用BGAPI SDK对Baumer的工业相机进行开发时,使用通过BGAPI SDK中的相机事件Device Events来获取相机中诸多功能的状态以及时间参数等等。


有关于Baumer工业相机堡盟工业相机如何通过BGAPI SDK使用DeviceEvents“设备事件”记录相机事件的各类时间(C#)的介绍,之前已经有相关的技术博客可以参考:


Baumer工业相机堡盟工业相机如何通过BGAPI SDK使用DeviceEvents“设备事件”记录相机事件的各类时间(C#)


简单介绍下设备事件。比如它可以用于传输发生的事件(如ExposureStart, ExposureEnd)发送到软件中去。

1、每个事件都有一个时间戳(64位),它包含事件发生的准确时间。事件发生的准确时间。

2、每个事件都可以被单独激活和停用。


例如,在相机中设置设备事件 "ExposureStart "和 “ExposureEnd” 从 "关闭 "到 “开启”。

注意:在一些相机中可能会使用过时的术语 “GigEVisionEvent”,而不是 “On"或者"Off”。


如下为核心代码实现步骤:


第一步:开启相机事件获取相机事件的类型和名称

C++环境下获取相机事件中快门开启和关闭的时间核心代码如下所示:

// 选择相机事件为快门开启和关闭事件
pDevice->GetRemoteNode("EventSelector")->SetValue("ExposureStart");
pDevice->GetRemoteNode("EventNotification")->SetValue("On"); 
pDevice->GetRemoteNode("EventSelector")->SetValue("ExposureEnd");
pDevice->GetRemoteNode("EventNotification")->SetValue("On");
// 列出所有的事件和它们的状态
BGAPI2::NodeMap * nmEventList;
nmEventList = pDevice->GetRemoteNode("EventSelector")->GetEnumNodeList();
std::cout << "EventListCount: " << nmEventList->GetNodeCount() << std::endl;
BGAPI2::String sEventItem;
for(bo_uint64 i = 0; i < nmEventList->GetNodeCount(); i++)
{
std::cout << i << ": ";
sEventItem = nmEventList->GetNodeByIndex(i)->GetValue();
std::cout << sEventItem << " ";
// 检查它们的状态是开启还是关闭
pDevice->GetRemoteNode("EventSelector")->SetValue(sEventItem);
std::cout << pDevice->GetRemoteNode("EventNotification")->GetValue();
std::cout << std::endl;
}
// 设置相机事件模式为轮询模式
pDevice->RegisterDeviceEvent(BGAPI2::Events::EVENTMODE_POLLING);
BGAPI2::Events::EventMode currentEventMode = pDevice->GetEventMode();
BGAPI2::String sCurrentEventMode = "";
switch(currentEventMode)
{
case BGAPI2::Events::EVENTMODE_POLLING:
 sCurrentEventMode = "EVENTMODE_POLLING";
 break;
case BGAPI2::Events::EVENTMODE_DISABLED:
 sCurrentEventMode = "EVENTMODE_DISABLED";
 break;
case BGAPI2::Events::EVENTMODE_EVENT_HANDLER:
 sCurrentEventMode = "EVENTMODE_EVENT_HANDLER";
 break;
default:
 sCurrentEventMode = "EVENTMODE_UNKNOWN";
}
std::cout << "Register Event Mode to: " << sCurrentEventMode << std::endl;
TriggerSource = Software
TriggerMode = On
// 开启软件触发模式
pDevice->GetRemoteNode("TriggerSource")->SetString("Software");
std::cout << "TriggerSource: " 
 << pDevice->GetRemoteNode("TriggerSource")->GetString() 
 << std::endl;
pDevice->GetRemoteNode("TriggerMode")->SetString("On");
std::cout<<"TriggerMode: "
 <<pDevice->GetRemoteNode("TriggerMode)->GetString() 
 << std::endl;

上述测试结果如下显示:

Device Events
#############
EventSelector: ExposureStart
EventNotification: On
EventSelector: ExposureEnd
EventNotification: On
EventSelector list count: 29
 0: Action1 Off
 1: EventDiscarded Off
 2: EventLost Off
 3: ExposureEnd On
 4: ExposureStart On
 5: FrameEnd Off
 6: FrameStart Off
 7: GigEVisionError Off
 8: GigEVisionHeartbeatTimeOut Off
 9: Line0FallingEdge Off
 10: Line0RisingEdge Off
 11: Line1FallingEdge Off
 12: Line1RisingEdge Off
 13: Line2FallingEdge Off
 14: Line2RisingEdge Off
 15: Line3FallingEdge Off
 16: Line3RisingEdge Off
 17: PrimaryApplicationSwitch Off
 26: TriggerOverlapped Off
 27: TriggerReady Off
 28: TriggerSkipped Off
Register Event Mode to: EVENTMODE_POLLING

第二步:通过相机事件获取测试快门开启和关闭的时间

下面为在在C++环境开启相机连接相机后通过注册事件函数获取快门开启和关闭的测试代码的核心代码,如下所示:


下面的代码用来演示设备事件的步骤,步骤如下所示。


获取摄像机的TimestampTickFrequency,作为EventTimestamp的参考。

设置曝光时间。

进行软件触发。

等待事件ExposureStart。

等待Event ExposureEnd。

计算ExposureEnd和ExposureStart的时间差。

等待图像

BGAPI2::Buffer * pBufferFilled = NULL;
bo_double fExposureValue = 20000;
bo_double fTimestampTickFrequency = 1.0;
bo_double fTimestampExposureStart = 0.0;
bo_double fTimestampExposureEnd = 0.0;
bo_double fTimestampDiff = 0.0;
BGAPI2::Events::DeviceEvent* pdEvent = new BGAPI2::Events::DeviceEvent();
// 1. TIMESTAMP TICK FREQUENCY
if(pDevice->GetRemoteNodeList()->GetNodePresent("GevTimestampTickFrequency"))
{
 fTimestampTickFrequency = (bo_double)pDevice->GetRemoteNode
 ("GevTimestampTickFrequency")->GetInt();
}
else
{
 fTimestampTickFrequency = 1000000000.0;
}
// 2. SET EXPOSURE TIME
pDevice->GetRemoteNode("ExposureTime")->SetDouble(fExposureValue);
std::cout << "Set Exposure to: ";
std::cout << pDevice->GetRemoteNode("ExposureTime")->GetDouble();
std::cout << " [usec]" << std::endl;
// 3. DO SOFTWARE TRIGGER
std::cout << "Execute TriggerSoftware " << std::endl;
pDevice->GetRemoteNode("TriggerSoftware")->Execute();
// 4. WAIT FOR EVENT EXPOSURE START
if(pDevice->GetDeviceEvent(pdEvent, 1000) == true)
{
fTimestampExposureStart = (bo_double)pdEvent->GetTimeStamp() / fTimestampTickFrequency;
fTimestampExposureStart = fTimestampExposureStart * 1000000.0;
std::cout << "EventID " << pdEvent->GetId() << " " << pdEvent->GetName();
std::cout << " Timestamp " << fTimestampExposureStart << " [usec]" << std::endl;
}
else
{
std::cout << "Error: GetDeviceEvent Timeout after 1000 msec" << std::endl;
}
// 5. WAIT FOR EVENT EXPOSURE END
if(pDevice->GetDeviceEvent(pdEvent, 1000) == true)
{
fTimestampExposureEnd = (bo_double)pdEvent->GetTimeStamp() / fTimestampTickFrequency;
fTimestampExposureEnd = fTimestampExposureEnd * 1000000.0;
std::cout << "EventID " << pdEvent->GetId() << " " << pdEvent->GetName();
std::cout << " Timestamp " << fTimestampExposureEnd << " [usec]" << std::endl;
}
else
{
std::cout << "Error: GetDeviceEvent Timeout after 1000 msec" << std::endl;
}
// 6. CALCULATE TIME DIFFERENCE EXPOSURE END - START
fTimestampDiff = fTimestampExposureEnd - fTimestampExposureStart;
std::cout << "Timestamp ExposureEnd - ExposureStart: " << fTimestampDiff << " [usec]";
std::cout << std::endl;
// 7. WAIT FOR IMAGE BUFFER IS FILLED
pBufferFilled = pDataStream->GetFilledBuffer(1000);
if(pBufferFilled == NULL)
{
std::cout << "Error: Buffer Timeout after 1000 msec" << std::endl;
}
else
{
std::cout << "Image " << pBufferFilled->GetFrameID() << " received" << std::endl;
pBufferFilled->QueueBuffer();
}
// 注销事件函数
pDevice->UnregisterDeviceEvent();
currentEventMode = pDevice->GetEventMode();
delete pdEvent;
// 关闭相机设备事件中的快门事件
pDevice->GetRemoteNode("EventSelector")->SetValue("ExposureStart");
pDevice->GetRemoteNode("EventNotification")->SetValue("Off"); 
pDevice->GetRemoteNode("EventSelector")->SetValue("ExposureEnd");
pDevice->GetRemoteNode("EventNotification")->SetValue("Off");
pDevice->GetRemoteNode("TriggerMode")->SetValue("Off");

上述测试结果如下显示:

CAPTURE IMAGES BY SOFTWARE TRIGGER
##################################
 Set Exposure to: 20000 [usec]
 Execute TriggerSoftware 1
 EventID 900C ExposureStart Timestamp 4221120870.1 [usec]
 EventID 900D ExposureEnd Timestamp 4221140870.1 [usec]
 Timestamp ExposureEnd - ExposureStart: 20000.1 [usec]
 Image 1 received in memory address 0000000004900040
 Set Exposure to: 30000 [usec]
 Execute TriggerSoftware 2
 EventID 900C ExposureStart Timestamp 4221182258.8 [usec]
 EventID 900D ExposureEnd Timestamp 4221212258.9 [usec]
 Timestamp ExposureEnd - ExposureStart: 30000.1 [usec]
 Image 2 received in memory address 0000000004C90040
 Set Exposure to: 40000 [usec]
 Execute TriggerSoftware 3
 EventID 900C ExposureStart Timestamp 4221262062.4 [usec]
 EventID 900D ExposureEnd Timestamp 4221302062.5 [usec]
 Timestamp ExposureEnd - ExposureStart: 40000.1 [usec]
 Image 3 received in memory address 0000000005020040

工业相机SDK中的设备事件功能的优点

实时监控: 设备事件功能允许你实时监控设备事件。这意味着当设备事件发生时,您可以收到即时通知,例如当相机断开连接或有新设备连接时。


效率: 通过设备事件功能,你可以将某些通常需要人工干预的任务自动化。例如,你可以在相机连接时自动开始录像,在相机断开连接时停止录像。


提高可靠性: 通过监控设备事件,你可以快速检测和解决可能影响摄像机性能的问题。这可以帮助提高你的相机系统的可靠性,减少停机时间。


灵活性: 设备事件功能可以定制,以满足您的具体需求。您可以选择监测哪些事件以及如何应对这些事件,使您对相机系统有更大的灵活性和控制力。


总的来说,使用工业相机SDK中的设备事件功能可以帮助您优化相机系统的性能,提高工作流程的效率。


工业相机SDK中的设备事件功能的的行业应用

制造业:工业相机可用于自动化生产线上的物品检测和质量控制。使用SDK中的设备事件功能,可以定期检查相机运行情况并发送警报,以便在出现故障或需要维护时进行快速响应。


医疗保健:医疗设备通常需要及时检测和反馈数据。使用工业相机SDK中的设备事件功能,可以在检测过程中检查相机的状态并及时警报医疗工作人员。


零售业:工业相机可以用于零售业的商品管理和库存控制。使用SDK中的设备事件功能,可以提醒库存管理员及时补充缺货商品。


智能家居:工业相机可以用于智能家居系统中的安全和监测设施。SDK中的设备事件功能可用于实时检查相机状态并向家庭主人发送安全警报,警告他们如有必要采取措施。

目录
相关文章
|
7月前
|
监控 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
95 0
|
7月前
|
数据采集 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用Force IP强制修改网口IP功能(C++)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用Force IP强制修改网口IP功能(C++)
66 0
|
7月前
|
数据采集 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用ForceIP强制修改网口IP功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用ForceIP强制修改网口IP功能(C#)
63 0
|
4月前
|
数据采集 开发工具 Python
海康威视工业相机SDK+Python+PyQt开发数据采集系统(支持软件触发、编码器触发)
该系统基于海康威视工业相机SDK,使用Python与PyQt开发,支持Gige与USB相机设备的搜索及双相机同时显示。系统提供软件触发与编码器触发模式,并可在数据采集过程中实时保存图像。此外,用户可以调节曝光时间和增益,并进行信息输入,这些信息将被保存至配置文件以便下次自动加载。参数调节与实时预览等功能进一步增强了系统的实用性。
321 1
|
7月前
|
监控 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C++)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C++)
85 0
|
1月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
51 2
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
104 5
|
1月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
92 4
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
111 4
|
2月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
32 4