Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。
Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有快速数据传输、低功耗、易于集成以及高度可扩展性等特点。
Baumer工业相机由于其性能和质量的优越和稳定,常用于高速同步采集领域,通常使用各种图像算法来提高其捕获的图像的质量。
Baumer工业相机的BGAPI SDK是Baumer公司开发的针对其相机产品系列的一套软件开发工具包。该SDK提供了一组API,使开发人员可以编写专业应用程序,从而控制、捕获、处理和显示Baumer相机的图像和数据。BGAPI SDK支持多种编程语言,包括C++、C#、Visual Basic、LabVIEW、Matlab等,并提供了大量示例代码和文档,以帮助用户轻松上手,快速完成应用程序的开发。
BGAPI SDK提供了丰富的功能,可以控制Baumer相机的所有参数,包括曝光时间、增益、白平衡、触发模式等,以及支持各种数据格式,例如Raw、BMP、JPG等,同时还提供了实时显示、数据采集、图像处理等功能,为开发人员提供了高度定制化的解决方案。此外,BGAPI SDK还支持多相机系统的开发,并可支持各种计算机操作系统,如Windows、Linux、Mac OS等。
Baumer工业相机图像时间戳是指在采集图像时,相机会为每个图像产生一个时间戳。它记录了图像采集的精确时间,以毫秒或微秒为单位,并用于相机控制系统中的各种应用。
本文介绍的使用BGAPI SDK获取工业相机采集图像对应的图像时间戳,从而可以快速计算相应的运行时间进行相应的使用。
下面介绍在C++里Baumer工业相机如何使用BGAPISDK获取时间戳计算相机运行时间以及时间差的方式
代码如下(示例):
#include
#include
#include
#include
#include
#include
#include
#include "bgapi2_genicam/bgapi2_genicam.hpp"
#include
核心代码如下所示:
//图像回调函数
//==================
void BGAPI2CALL BufferHandler( void * callBackOwner, Buffer * pBufferFilled )
{
CGigeDemoDlg* pDlg = (CGigeDemoDlg*)callBackOwner;
unsigned char* imagebuffer = NULL;
USES_CONVERSION;
try
{
if(pBufferFilled == NULL)
{
}
else if(pBufferFilled->GetIsIncomplete() == true)
{
// queue buffer again
pBufferFilled->QueueBuffer();
}
else
{
pDlg->FrameID= pBufferFilled->GetFrameID(); //获取当前图像FrameID显示帧率
int frameid1 = pBufferFilled->GetFrameID();
int width = 0, height = 0;
width = (int)pBufferFilled->GetWidth();height = (int)pBufferFilled->GetHeight(); //获取当前图像像素长宽
CString PixelFormat1 = (CString)pBufferFilled->GetPixelFormat(); //获取当前图像像素格式
imagebuffer = (BYTE*)((bo_int64)pBufferFilled->GetMemPtr()+pBufferFilled->GetImageOffset());//获取当前图像数据
// 将相机时间戳转换为Unix时间戳
long timestamp = pBufferFilled->GetTimeStamp();
UnixTimestamp Timestamp = convertCameraTimestampToUnixTimestamp(timestamp );
// queue buffer again
pBufferFilled->QueueBuffer();
}
}
catch (BGAPI2::Exceptions::IException& ex)
{
CString str;
str.Format(_T("ExceptionType:%s! ErrorDescription:%s in function:%s"),ex.GetType(),ex.GetErrorDescription(),ex.GetFunctionName());
}
}
// 定义相机时间戳类型
typedef long long CameraTimestamp;
// 定义Unix时间戳类型
typedef long long UnixTimestamp;
// 获取当前Unix时间戳
UnixTimestamp getUnixTimestamp()
{
return chrono::duration_cast<chrono::milliseconds>( chrono::system_clock::now().time_since_epoch() ).count();
}
// 将相机时间戳转换为Unix时间戳
UnixTimestamp convertCameraTimestampToUnixTimestamp(CameraTimestamp cameraTimestamp)
{
// 计算Unix时间戳与相机时间戳的差值
UnixTimestamp unixTimestamp = getUnixTimestamp();
CameraTimestamp cameraTimeDiff = unixTimestamp * 1000 - cameraTimestamp;
// 计算转换后的Unix时间戳
UnixTimestamp convertedUnixTimestamp = unixTimestamp - cameraTimeDiff / 1000;
return convertedUnixTimestamp;
}
从上面的测试验证,可以看出相机的图像时间戳为相机启动后的时间计数,最小单位为纳秒,时间精度非常高,可以用在一些高速高精度的领域。
工业相机图像时间戳的优势包括:
精准性:相机图像时间戳可以提供非常精确的时间测量,以微秒或毫秒为单位。这使得相机图像时间戳非常适合需要高精度的应用,例如时间同步或数据匹配。
可靠性:相机图像时间戳不受环境(例如温度、湿度)或外部干扰的影响。此外,相机图像时间戳是由硬件采集的,因此它比由软件生成的时间戳更可靠。
可用性:相机图像时间戳可用于不同的应用,例如时间同步、数据处理和数据匹配。它可以帮助用户在不同领域中实现各种应用。
方便性:工业相机通常将时间戳直接嵌入图像中,因此无需用户额外安装或配置时间戳设备。这使得工业相机的图像时间戳非常方便和易于使用。
多功能性:相机图像时间戳可以用于还原采集过程中丢失的数据,或者用于将相机图像和其他传感器数据进行匹配。它可以帮助用户更好地理解和处理数据。
综上所述,工业相机图像时间戳具有很多优点。它可以提供高精度、可靠性和方便性,并且可以用于不同的应用,有助于用户更好地理解和处理数据。
通常,相机图像时间戳可以用于以下应用:
时间同步:在某些应用中,需要对多个相机进行同步,以确保其采集的图像时间戳是一致的。在这种情况下,相机图像时间戳可以用于同步多个相机之间的时间。
数据处理:在大多数情况下,工业相机图像采集是以连续帧的形式进行的。如果时间戳被记录并存储,那么就可以使用时间戳来检查帧是否被正确地采集,或者是否有帧率估计错误。
数据匹配:在某些应用程序中,需要将相机采集的图像与其他传感器数据进行匹配。例如,在机器人导航中,相机图像的时间戳可以与GPS或惯性导航系统的数据进行匹配,以便更准确地定位机器人。
总之,相机图像时间戳是工业相机控制系统中的重要组成部分。它可以帮助用户在不同领域中实现各种应用,例如时间同步、数据处理和数据的匹配。