Baumer工业相机堡盟相机BGAPI SDK如何实现显示相机帧率和网口数据通量(C++)

简介: Baumer工业相机堡盟相机BGAPI SDK如何实现显示相机帧率和网口数据通量(C++)

项目场景:

Baumer工业相机堡盟相机传统开发包BGAPI SDK进行工业视觉软件整合时,常常需要将SDK中一些功能整合到图像处理软件中,方便项目的推进使用;


注意:本文是基于Baumer的BGAPI SDK的基础上使用C++语言来实现相机帧率和网口数据通量的实时显示。


问题描述

在项目的图像处理任务中,有时需要将相机的帧率实时显示在图像处理软件的界面上。


但是Baumer BGAPI SDK上没有直接显示帧率的方法函数,这就需要小伙伴们结合SDK自己去写一个了


实现方法步骤1:确认帧率信息

基本上所有的相机图像数据都有一个FrameID,从开启采集后不断增加,一般情况下都是根据FrameID来计算当前相机的实时帧率。


首先,FrameID一般出现在相机图像的回调函数里,先定义全局变量FrameID去获取相机的FrameID。


FrameID在回调函数的代码如下所示

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显示帧率                                             
        }
    }
  catch (BGAPI2::Exceptions::IException& ex)
  {
  CString str;
  str.Format(_T("ExceptionType:%s! ErrorDescription:%s in function:%s"),ex.GetType(),ex.GetErrorDescription(),ex.GetFunctionName());  
  }

实现方法步骤2:定义显示线程

2、在头文件里定义一个线程去显示对应帧率的变化。

static UINT ShowFrame_hThread1(LPVOID pParam);//该线程的调用函数 
void SetShowFrame();//在这个函数中编写该线程需要完成的任务


实现方法步骤3:实现线程方法

3、实现定义的线程方法,通过每秒的计算方式实时计算出相机的图像采集速度帧率


代码如下所示:

UINT CGigeDemoDlg::ShowFrame_hThread1(LPVOID pParam)
{
  CGigeDemoDlg *dlg = (CGigeDemoDlg *)pParam;
  dlg->SetShowFrame();
  return 0;
}
void CGigeDemoDlg::SetShowFrame()
{
  try
  {
  while (m_bRun0)
  {
    if(FrameID>0)
    {
    double CurFrameID1 = FrameID;
    Sleep(1000);
    double CurFrameID2 = FrameID;
    double CalFrameID =(CurFrameID2-CurFrameID1)*1 ;
    //ShowFrame_hThread1->g_criticalsection.Lock(); //边界锁锁定
     同步锁中间可添加需要保护的操作代码,如操作txt文档读、看、写时等。
    //ShowFrame_hThread1->g_criticalsection.Unlock();//边界锁解除
    if(m_pDataStream!=NULL)
    {
      try
      {
      BGAPI2::NodeMap* pDataStreamNodeList = m_pDataStream->GetNodeList();
      if (m_pDataStream->GetTLType() == "GEV") 
      {
        float m_CurStreamBitrateDouble = pDataStreamNodeList->GetNode("Bitrate")->GetDouble();
        m_CurStreamBitrate.Format(_T("%.2f"),m_CurStreamBitrateDouble);
        GetDlgItem(IDC_STCURBITRATE)->SetWindowText(m_CurStreamBitrate+_T(" MBit/s")); //获取网口数据量并显示出来
      }
      }
      catch (CMemoryException* e)
      {}
    }
    CString CurFameratestr;
    CurFameratestr.Format(_T("%.1f"),CalFrameID);                  //获取帧率并显示出来
    m_Cursetframe = CurFameratestr;
    GetDlgItem(IDC_STCURFRAME)->SetWindowText(CurFameratestr);
    }
  }
  }
  catch (int e)
  {
  MessageBox(_T("Camera SetShowimage Error"));
  }
}

实现方法步骤4:启动线程

4、在相机的启动时同时启动该线程


代码如下所示:


void CGigeDemoDlg::OnBnClickedBtnplay()
{
  // TODO: 在此添加控件通知处理程序代码
  USES_CONVERSION;
  if(m_pDevice != NULL)
  {
  try
  {
    m_pDevice->GetRemoteNode("TriggerMode")->SetString("Off"); //关闭触发模式,进入自由采集图片流模式
    m_pDevice->GetRemoteNode("AcquisitionStart")->Execute();
    #pragma region 线程显示帧率和网口数据通量(做参考)
    m_bRun0 = true;
    AfxBeginThread(ShowFrame_hThread1, (void*)this);    
    #pragma endregion 
  }
  catch (BGAPI2::Exceptions::IException& ex)
  {
    CString str1;
    str1.Format(_T("ExceptionType:%s! ErrorDescription:%s in function:%s"),ex.GetType(),ex.GetErrorDescription(),ex.GetFunctionName());
    MessageBox(str1);
  }
  }
}


实现方法步骤5:停止显示线程

5、如何关闭该线程,在相机关闭时需要正常关闭。


代码如下所示:

void CGigeDemoDlg::StopShowFrame_hThread1()
{
  m_bRun0  = FALSE;          //停止帧率和网口数据通量线程执行
  WaitForSingleObject(ShowFrame_hThread1,200);   //一直等待对应线程退出
  Sleep(2000);                                      //线程停止缓冲时间
  /*DWORD exitcode2;
  GetExitCodeThread(ShowFrame_hThread1,&exitcode2);
  ExitThread(exitcode2);   */
}

实现方法步骤6:帧率和网口数据通量显示

6、完成上面的操作后,在相机初始化并开启采图后就可以开启相机当前帧率和网口数据通量的显示

3f26b172e1c949159cb386a745edaec1.png

目录
相关文章
|
7月前
|
监控 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
94 0
|
6月前
|
算法 开发工具 计算机视觉
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
94 1
|
4月前
|
数据采集 开发工具 Python
海康威视工业相机SDK+Python+PyQt开发数据采集系统(支持软件触发、编码器触发)
该系统基于海康威视工业相机SDK,使用Python与PyQt开发,支持Gige与USB相机设备的搜索及双相机同时显示。系统提供软件触发与编码器触发模式,并可在数据采集过程中实时保存图像。此外,用户可以调节曝光时间和增益,并进行信息输入,这些信息将被保存至配置文件以便下次自动加载。参数调节与实时预览等功能进一步增强了系统的实用性。
298 1
|
7月前
|
监控 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C++)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C++)
79 0
|
7月前
|
开发工具 对象存储 Android开发
对象存储oss使用问题之C++使用OSS SDK时遍历OSS上的文件时崩溃如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
289 0
|
4月前
|
JavaScript 前端开发 Java
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
114 0
|
1月前
|
Java Linux API
Android SDK
【10月更文挑战第21天】
78 1
|
2月前
|
程序员 开发工具 Android开发
Android|使用阿里云推流 SDK 实现双路推流不同画面
本文记录了一种使用没有原生支持多路推流的阿里云推流 Android SDK,实现同时推送两路不同画面的流的方法。
67 7
|
4月前
|
开发工具 Android开发
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
190 4
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
|
4月前
|
Dart 开发工具 Android开发
Android Studio导入Flutter项目提示Dart SDK is not configured
Android Studio导入Flutter项目提示Dart SDK is not configured
392 4

热门文章

最新文章

下一篇
DataWorks