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

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

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进行相机的控制和数据采集。这种统一的接口设计简化了开发过程,同时也提高了代码的可移植性和可维护性。


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


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


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


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


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


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


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


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


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


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


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


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


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


目录
相关文章
|
2月前
|
监控 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C#)
67 0
|
2月前
|
数据采集 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用Force IP强制修改网口IP功能(C++)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用Force IP强制修改网口IP功能(C++)
41 0
|
1月前
|
算法 开发工具 计算机视觉
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
41 1
|
2月前
|
监控 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C++)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C++)
50 0
|
2月前
|
开发工具 对象存储 Android开发
对象存储oss使用问题之C++使用OSS SDK时遍历OSS上的文件时崩溃如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
|
3天前
|
设计模式 安全 编译器
【C++11】特殊类设计
【C++11】特殊类设计
22 10
|
8天前
|
C++
C++友元函数和友元类的使用
C++中的友元(friend)是一种机制,允许类或函数访问其他类的私有成员,以实现数据共享或特殊功能。友元分为两类:类友元和函数友元。类友元允许一个类访问另一个类的私有数据,而函数友元是非成员函数,可以直接访问类的私有成员。虽然提供了便利,但友元破坏了封装性,应谨慎使用。
39 9
|
4天前
|
存储 编译器 C语言
【C++基础 】类和对象(上)
【C++基础 】类和对象(上)
|
12天前
|
编译器 C++
【C++】string类的使用④(字符串操作String operations )
这篇博客探讨了C++ STL中`std::string`的几个关键操作,如`c_str()`和`data()`,它们分别返回指向字符串的const char*指针,前者保证以&#39;\0&#39;结尾,后者不保证。`get_allocator()`返回内存分配器,通常不直接使用。`copy()`函数用于将字符串部分复制到字符数组,不添加&#39;\0&#39;。`find()`和`rfind()`用于向前和向后搜索子串或字符。`npos`是string类中的一个常量,表示找不到匹配项时的返回值。博客通过实例展示了这些函数的用法。
|
12天前
|
存储 C++
【C++】string类的使用③(非成员函数重载Non-member function overloads)
这篇文章探讨了C++中`std::string`的`replace`和`swap`函数以及非成员函数重载。`replace`提供了多种方式替换字符串中的部分内容,包括使用字符串、子串、字符、字符数组和填充字符。`swap`函数用于交换两个`string`对象的内容,成员函数版本效率更高。非成员函数重载包括`operator+`实现字符串连接,关系运算符(如`==`, `&lt;`等)用于比较字符串,以及`swap`非成员函数。此外,还介绍了`getline`函数,用于按指定分隔符从输入流中读取字符串。文章强调了非成员函数在特定情况下的作用,并给出了多个示例代码。