Baumer工业相机堡盟相机如何使用BGAPI SDK实现相机资源的正确释放(C++)

简介: Baumer工业相机堡盟相机如何使用BGAPI SDK实现相机资源的正确释放(C++)

Baumer工业相机

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


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

Baumer工业相机的BGAPI SDK一般在使用相机后在最好需要将相机资源释放,释放的步骤比较重要,本文介绍如何正确地使用BGAPI SDK释放相机资源


Baumer工业相机SDK技术背景

Baumer工业相机的BGAPI SDK可以提供相机的图像原始数据,在集成相机和视觉软件使用后,关闭视觉软件时需要同时使用SDK去释放SDK占用的相机资源。


工业相机的SDK(Software Development Kit)是为了方便开发人员对工业相机进行控制和图像采集而提供的一套软件工具。而Halcon是一款强大的机器视觉软件,能够进行图像处理、分析、识别等多种任务。


这里主要描述如何在C++的平台下实现对应的资源释放功能的核心代码


代码分析

本文介绍使用BGAPI SDK对Baumer工业相机进行开发时,使用SDK进行相机资源释放的功能。


释放所有相机资源

相机资源释放,在软件关闭,程序退出的时候,需要将创建的资源逐一关闭并释放,资源关闭

释放的顺序跟创建的顺序正好相反;


C++环境下释放所有相机资源代码如下所示:

void CGigeDemoDlg::OnBnClickedCancel()
{
  // TODO: 在此添加控件通知处理程序代码
  USES_CONVERSION;
  //执行相机关闭指令
  try
  {
  if (m_pDevice != NULL)
  {
    if (m_pDevice->GetRemoteNodeList()->GetNodePresent("AcquisitionAbort"))
    {
    m_pDevice->GetRemoteNode("AcquisitionAbort")->Execute();
    }
    m_pDevice->GetRemoteNode("AcquisitionStop")->Execute();
  }
  }
  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);
  }
  //停止相机的采集流
  //STOP DataStream acquisition
  try
  {
  if (m_pDataStream != NULL)
  {
    m_pDataStream->StopAcquisition();
    m_pBufferList->DiscardAllBuffers();
  }
  }
  catch (BGAPI2::Exceptions::IException& ex)
  {
  CString str2;
  str2.Format(_T("ExceptionType:%s! ErrorDescription:%s in function:%s"),ex.GetType(),ex.GetErrorDescription(),ex.GetFunctionName());
  MessageBox(str2);
  }
  //释放相机的采集流
  //Release buffers
  try
  {
  if (m_pDataStream != NULL)
  {
    while (m_pBufferList->size() > 0)
    {
    m_pBuffer = m_pBufferList->begin()->second;
    m_pBufferList->RevokeBuffer(m_pBuffer);
    delete m_pBuffer;
    }
    //关闭相机的数据流
    m_pDataStream->Close();
    //关闭相机的设备
    m_pDevice->Close();
    //关闭相机连接的网口
    m_pInterface->Close();
    //关闭相机连接的实例类
    m_pSystem->Close();
    //释放相机连接类的资源
    BGAPI2::SystemList::ReleaseInstance();
    //Enable the button_inialize
    //GetDlgItem(ID_BTNINITIALIZE)->EnableWindow(TRUE);
  }
  }
  catch (BGAPI2::Exceptions::IException& ex)
  {
  CString str3;
  str3.Format(_T("ExceptionType:%s! ErrorDescription:%s in function:%s"),ex.GetType(),ex.GetErrorDescription(),ex.GetFunctionName());
  MessageBox(str3);
  }
  CDialogEx::OnCancel();
}

释放相机资源注意点

C++环境下释放相机资源代码需要特别注意相机数据流的停止指令,这块尤其重要;

有时停止指令发送后,未停止相机数据流,后面直接执行相机的类释放会导致报错发生。

//STOP DataStream acquisition
  try
  {
  if (m_pDataStream != NULL)
  {
    **m_pDataStream->StopAcquisition();**
    m_pBufferList->DiscardAllBuffers();
  }
  }
  catch (BGAPI2::Exceptions::IException& ex)
  {
  CString str2;
  str2.Format(_T("ExceptionType:%s! ErrorDescription:%s in function:%s"),ex.GetType(),ex.GetErrorDescription(),ex.GetFunctionName());
  MessageBox(str2);
}

工业相机SDK来释放工业相机的资源的优点

增加灵活性: 通过使用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获取每张图像的微秒时间和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++面向对象编程的核心机制。
105 5
|
1月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
97 4
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
114 4
|
2月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
32 4
|
2月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
32 4
|
2月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
29 1