Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。
Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有快速数据传输、低功耗、易于集成以及高度可扩展性等特点。
Baumer工业相机通过使用BGAPI SDK进行开发时,有时需要使用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++环境开启相机连接相机后通过注册事件函数获取快门开启和关闭的测试代码的核心代码,如下所示:
下面的代码用来演示设备事件的步骤,步骤如下所示。
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中的设备事件功能可用于实时检查相机状态并向家庭主人发送安全警报,警告他们如有必要采取措施。