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

时间:2021-06-09 01:17:37



#勤写标兵挑战赛#

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来释放工业相机的资源的优点

  1. 增加灵活性: 通过使用SDK,开发人员可以定制和调整相机功能,以更好地适应他们的具体应用要求。

  2. 改进集成: 该SDK允许多个相机和相机组件与其他硬件和软件系统无缝集成。

  3. 更大程度的控制: 使用工业相机SDK可以更深入、更直接地访问相机的功能和数据,从而更好地控制捕获的图像和视频。

  4. 增强性能: 使用SDK可以提高相机性能,加快数据处理速度,从而获得更高质量的图像和视频。

  5. 降低成本: SDK允许在选择和定制相机系统时有更大的灵活性,从长远来看有可能导致成本的节约。

工业相机SDK来释放工业相机的资源的重要性

在软件中正确释放工业相机资源非常重要,因为它可以确保相机及其相关硬件不会处于不一致或不稳定的状态,这可能导致内存泄漏、性能下降和系统崩溃等问题。

遵循SDK(软件开发工具包)中的步骤,可以确保摄像机使用的所有组件被正确关闭,任何内存或其他系统资源被正确释放。

这可以帮助确保摄像机及其相关组件正常工作,并确保软件应用程序长期稳定和可靠。