Baumer工业相机堡盟相机如何使用NEOAPI SDK实现相机的连接(C++)

发布时间:2023年12月29日


?

Baumer工业相机

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

Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有快速数据传输、低功耗、易于集成以及高度可扩展性等特点。
?
Baumer工业相机的NEOAPI SDK是目前最新版本的SDK类型,具有安装简单、测试方便、易于集成等特点。

Baumer工业相机SDK技术背景

工业相机的SDK(Software Development Kit)是为了方便开发人员对工业相机进行控制和图像采集而提供的一套软件工具。而Halcon是一款强大的机器视觉软件,能够进行图像处理、分析、识别等多种任务。
?
这里主要描述如何在C++的平台下实现相机连接的核心代码

代码分析

本文介绍使用NEOAPI SDK对Baumer工业相机进行开发时,可以简单使用Neoapi的函数与相机进行连接

第一步:先使用NEOAPI函数查找相机

C++环境下查找相机代码如下所示:

#pragma region //获取当前已连接相机信息列表  
NeoAPI::CamInfoList& infolist = NeoAPI::CamInfoList::Get();  // 新建相机信息List
infolist.Refresh();											 // 刷新相机信息List
NeoAPI::NeoString model;
for (NeoAPI::CamInfo info : infolist)
{
	model = info.GetModelName();
	std::cout << info.GetModelName() << " :: " << info.IsConnectable() << std::endl; // Print a list of all connected cameras with its connection status
}


#pragma endregion 

检索连接到系统中的相机的信息
有时,事先并不知道哪些相机可能被安装在系统中,以及它们是否可以使用。通过NeoAPI::CamInfoList和NeoAPI::CamInfo类,我们提供了一个简单的方法来查找。摄像机不需要连接就可以获得这些信息,甚至可以由其他程序使用。由于CamInfoList代表的是系统的当前状态,不应该有多个对象,因此它被实现为一个单子。

NeoAPI::CamInfoList::EnablePnPEventCallback()和NeoAPI::CamInfoList::GetPnPEvent()方法可用于获取相机是否与系统连接或断开的通知

下面则是详细的相机查询核心代码:

if (model != "")
{
	camera = NeoAPI::Cam();
	camera.Connect(model);              				// 通过相机名称连接相机

	NeoAPI::NeoString devName0 = camera.f().DeviceModelName;
	CString devName = (CString)devName0;
	camera.f().TriggerMode = NeoAPI::TriggerMode::On;	//初始化相机时将触发模式设为On
	camera.SetImageBufferCount(8);    
} 

第二步:连接相机后对相机进行采图

后续进行图像采集核心代码,如下所示:

// TODO: 在此添加控件通知处理程序代码
if (camera.IsConnected())
{		
	ContinueDisplay = FALSE;
	m_bSaveImage = true;
	NeoAPI::Image image = camera.GetImage();            // 获取相机图像

	Image = image;
	ToDisplayImage(image);								// 在Picturebox上显示图像
	GetDlgItem(IDC_BTNPLAY)->EnableWindow(TRUE);        // 实时按钮设置可用

}



第三步:将采集的图像显示在UI界面上

将NeoAPI::Image image图像转为Bitmap图像并显示在Picturebox上,
转换显示核心代码,如下所示:

//将NeoAPI::Image image图像转为Bitmap图像并显示在Picturebox上
void CGigeDemoDlg::ToDisplayImage(NeoAPI::Image image)
{

	unsigned char* imagebuffer = NULL;
	USES_CONVERSION;

	int width = 0, height = 0;
	width = (int)image.GetWidth();height = (int)image.GetHeight();	//获取当前图像像素长宽
	CString PixelFormat1 = (CString)image.GetPixelFormat();			//获取当前图像像素格式
	imagebuffer = (BYTE*)(image.GetImageData());			//获取当前图像数据
		
	CString ImageID1str;
	ImageID1str.Format(_T("%d"), (int)image.GetImageID());		    //获取当前图像FrameID



	#pragma region //保存图像功能
	if (m_bSaveImage && !m_strDirectory.IsEmpty())
	{
		CTime time = CTime::GetCurrentTime();
		CString strtime;
		strtime.Format(_T("\\%4d%2d%2d%2d%2d%2d"), time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond());
		CString  strpath = m_strDirectory + strtime +"-"+ ImageID1str + ".jpg";
		SaveImageMono(strpath, imagebuffer, width, height);
		m_bSaveImage = false;
	}
	#pragma endregion 


	Gdiplus::Rect rc = Gdiplus::Rect(0, 0, width, height);

	#pragma region 黑白相机代码:像素格式为mono时转Bitmap的代码,彩色相机此处代码不同
	if (m_pBitmap == NULL)
	{
		m_pBitmap = new Gdiplus::Bitmap(width, height, PixelFormat8bppIndexed);
	}
	Gdiplus::BitmapData lockedbits;
	Gdiplus::ColorPalette * pal = (Gdiplus::ColorPalette*)new BYTE[sizeof(Gdiplus::ColorPalette) + 255 * sizeof(Gdiplus::ARGB)];
	pal->Count = 256;
	for (UINT i = 0;i < 256;i++)
	{
		UINT color = i * 65536 + i * 256 + i;
		color = color | 0xFF000000;
		pal->Entries[i] = color;
	}
	m_pBitmap->SetPalette(pal);
	Gdiplus::Status ret = m_pBitmap->LockBits(&rc, Gdiplus::ImageLockModeWrite, PixelFormat8bppIndexed, &lockedbits);
	BYTE* pixels = (BYTE*)lockedbits.Scan0;
	BYTE* src = (BYTE*)imagebuffer;
	for (int row = 0; row < height; ++row)
	{
		CopyMemory(pixels, src, lockedbits.Stride);
		pixels += width;
		src += width;
	}
	m_pBitmap->UnlockBits(&lockedbits);
	#pragma endregion 

	#pragma region //将图像显示在PictureControl控件上
	HDC hDC = ::GetDC(m_stcPicture.m_hWnd);
	Gdiplus::Graphics GdiplusDC(hDC);
	CRect rcControl;
	m_stcPicture.GetWindowRect(&rcControl);
	Gdiplus::Rect rtImage(0, 0, rcControl.Width(), rcControl.Height());
	GdiplusDC.DrawImage(m_pBitmap, rtImage, 0, 0, width, height, Gdiplus::UnitPixel);

	delete[]pal;
	::ReleaseDC(m_stcPicture.m_hWnd, hDC);

	delete m_pBitmap;
	m_pBitmap = NULL;

	#pragma endregion 


}

测试显示图像结果如下所示:

在这里插入图片描述

Baumer工业相机使用NeoAPI SDK的优点

Baumer工业相机使用NeoAPI SDK的优点包括以下几个方面:

  1. 统一的开发接口:NeoAPI SDK提供了统一的开发接口,使得开发人员可以方便地使用相同的API进行相机的控制和数据采集。这种统一的接口设计简化了开发过程,同时也提高了代码的可移植性和可维护性。

  2. 全面的功能支持:NeoAPI SDK涵盖了相机的各项功能,包括实时图像采集、图像存储、图像处理和分析等。开发人员可以通过SDK提供的接口实现对这些功能的灵活控制,满足不同应用场景下的需要。

  3. 高度优化的性能:Baumer工业相机与NeoAPI SDK相结合,可以实现卓越的性能。SDK针对相机硬件进行了优化,提供了高速的数据传输通道、低延迟的图像采集能力,以及稳定的图像处理性能,适用于高要求的工业自动化和视觉检测应用。

  4. 跨平台兼容性:NeoAPI SDK支持多种操作系统(如Windows、Linux等)和开发环境(如C++、C#等),使得开发人员可以在不同平台上使用相同的开发工具和接口进行相机应用的开发和集成。

  5. 丰富的算法库:NeoAPI SDK内置了丰富的图像处理和分析算法库,包括图像增强、边缘检测、模式识别等功能。这些算法可以帮助用户在应用程序中实现更复杂的图像处理和分析功能。

综上所述,Baumer工业相机使用NeoAPI SDK具有统一的开发接口、全面的功能支持、高度优化的性能、跨平台兼容性和丰富的算法库等优点,为工业视觉应用提供了强大的支持和便利。

Baumer工业相机使用NeoAPI SDK开发的行业应用

Baumer工业相机使用便捷的NeoAPI SDK进行开发在众多行业应用中发挥关键作用,包括但不限于:

  1. 制造业:在制造业中,Baumer工业相机搭配NeoAPI SDK可用于质量控制、产品检测和缺陷识别等任务。通过实时图像处理和精确的数据采集,相机能够帮助制造商提高生产效率,确保产品质量,减少废品率。

  2. 医疗行业:Baumer工业相机和NeoAPI SDK可应用于医疗影像设备、医疗器械生产中的质量检验、医学影像分析等领域。相机可用于拍摄和处理医学图像,帮助医生进行诊断、手术导航以及医疗影像数据的分析和管理。

  3. 农业领域:在农业领域,Baumer工业相机结合NeoAPI SDK可以用于农作物的生长监测、果蔬分选和质量检测,土壤分析等。这有助于提高农业生产效率,优化农业资源利用,改善农产品质量。

  4. 物流和包装行业:Baumer工业相机和NeoAPI SDK可应用于自动化包装线、快递分拣系统、防伪识别等物流和包装领域。通过图像识别和分析,相机可以提高包装线的速度和准确性,实现自动化分拣和包装。

  5. 汽车制造业:在汽车制造业中,Baumer工业相机搭配NeoAPI SDK可用于汽车零部件的质量检测、车身焊接检测、机器人视觉引导等应用。这有助于确保汽车零部件的精准生产和质量控制。

综上所述,Baumer工业相机结合NeoAPI SDK在制造业、医疗、农业、物流和包装以及汽车制造等行业中发挥着重要的作用,为这些领域提供了高效的图像采集和处理解决方案。

文章来源:https://blog.csdn.net/xianzuzhicai/article/details/135290308
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。