Baumer工业相机堡盟工业相机如何通过BGAPISDK设置显示彩色相机和黑白相机的图像(C++)

简介: Baumer工业相机堡盟工业相机如何通过BGAPISDK设置显示彩色相机和黑白相机的图像(C++)

Baumer工业相机

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


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

Baumer工业相机的具有彩色工业相机和黑白工业相机两种类型,适用于多种场合,专门用于各种工业应用的成像设备,如质量控制、自动化、检查和机器视觉。它们通常被设计成在极端条件下工作,如高温、潮湿、灰尘和振动。


Baumer工业相机的彩色和黑白成像的技术背景

堡盟工业相机有彩色和黑白两种类型。这两类相机的主要区别在于它们捕捉和处理图像的方式。


彩色相机配备有拜耳滤光片,这是一种放置在相机图像传感器前的类似棋盘的彩色滤光片。这种滤镜将光线分离成红、绿、蓝三色成分,然后由相机的图像处理器进行处理,形成全彩图像。


黑白相机通常使用没有拜耳滤镜的单色图像传感器。这些传感器捕获的图像是灰度的,没有色彩信息。


就应用而言,彩色相机通常用于色彩准确性和差异性很重要的场合,如产品检验或质量控制。黑白相机通常用于需要高对比度和清晰度的情况,如机器视觉应用或低光环境中。


最终,是选择彩色还是黑白堡盟工业相机将取决于相关应用的具体需求。


Baumer工业相机通过BGAPI SDK在回调函数里显示图像

Baumer彩色工业相机和黑白工业相机的像素格式有所不同,因此在SDK回调函数里进行格式转换显示图像时也会有所不同,下面介绍在C#里Baumer彩色工业相机和黑白工业相机的不同的显示图像的方式


彩色工业相机在BufferEvent显示图像

在回调函数里显示图像,C++调用代码如下所示:

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显示帧率
    int width = 0, height = 0;
    width = (int)pBufferFilled->GetWidth();height = (int)pBufferFilled->GetHeight();    //获取当前图像像素长宽
    CString PixelFormat1 = (CString)pBufferFilled->GetPixelFormat();        //获取当前图像像素格式
    imagebuffer = (BYTE*)((bo_int64)pBufferFilled->GetMemPtr()+pBufferFilled->GetImageOffset());//获取当前图像数据
    #pragma region //保存图像功能
    if(pDlg->m_bSaveImage &&!pDlg->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 = pDlg->m_strDirectory+strtime+".jpg";
    pDlg->SaveImageColor(strpath, imagebuffer,width,height);
    pDlg->m_bSaveImage = false;
    }
    #pragma endregion 
    Gdiplus::Rect rc = Gdiplus::Rect(0,0,width,height);
    #pragma region 彩色相机代码
    if(pDlg->m_pBitmap == NULL)
    {
      pDlg->m_pBitmap = new Gdiplus::Bitmap(width,height, PixelFormat24bppRGB);
      //pDlg->m_pBitmap = new Gdiplus::Bitmap(width, height, PixelFormat8bppIndexed);//黑白相机修改为8bpp
    }
    Gdiplus::BitmapData lockedbits;
    Gdiplus::Status ret = pDlg->m_pBitmap->LockBits(&rc,Gdiplus::ImageLockModeWrite,PixelFormat24bppRGB,&lockedbits);
    //Gdiplus::Status ret = pDlg->m_pBitmap->LockBits(&rc, Gdiplus::ImageLockModeWrite, PixelFormat8bppIndexed, &lockedbits);//黑白相机修改为8bpp
    BYTE* pixels = (BYTE*)lockedbits.Scan0;
    BYTE* src = (BYTE*)imagebuffer;
    for (int row = 0; row < height; ++row) 
    {
    CopyMemory(pixels, src, lockedbits.Stride);
    pixels += width*3;
    src += width*3;
    }
    pDlg->m_pBitmap->UnlockBits(&lockedbits);
    #pragma endregion 
    #pragma region //将图像显示在PictureControl控件上
    HDC hDC = ::GetDC(pDlg->m_stcPicture.m_hWnd);
    Gdiplus::Graphics GdiplusDC(hDC);
    CRect rcControl;
    pDlg->m_stcPicture.GetWindowRect(&rcControl);
    Gdiplus::Rect rtImage(0,0,rcControl.Width(),rcControl.Height());
    GdiplusDC.DrawImage(pDlg->m_pBitmap,rtImage,0,0,width,height, Gdiplus::UnitPixel);
    ::ReleaseDC(pDlg->m_stcPicture.m_hWnd,hDC);
    delete pDlg->m_pBitmap ;
    pDlg->m_pBitmap =NULL;
    #pragma endregion 
    // queue buffer again
    pBufferFilled->QueueBuffer();
  }
  }
  catch (BGAPI2::Exceptions::IException& ex)
  {
  CString str;
  str.Format(_T("ExceptionType:%s! ErrorDescription:%s in function:%s"),ex.GetType(),ex.GetErrorDescription(),ex.GetFunctionName());  
  } 
}

黑白工业相机在BufferEvent显示图像

在回调函数里显示图像,C++调用代码如下所示:

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显示帧率
    int width = 0, height = 0;
    width = (int)pBufferFilled->GetWidth();height = (int)pBufferFilled->GetHeight();    //获取当前图像像素长宽
    CString PixelFormat1 = (CString)pBufferFilled->GetPixelFormat();        //获取当前图像像素格式
    imagebuffer = (BYTE*)((bo_int64)pBufferFilled->GetMemPtr()+pBufferFilled->GetImageOffset());//获取当前图像数据
    #pragma region //保存图像功能
    if(pDlg->m_bSaveImage &&!pDlg->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 = pDlg->m_strDirectory+strtime+".jpg";
    pDlg->SaveImageMono(strpath, imagebuffer,width,height);
    pDlg->m_bSaveImage = false;
    }
    #pragma endregion 
    Gdiplus::Rect rc = Gdiplus::Rect(0,0,width,height);
    #pragma region 黑白相机代码:像素格式为mono时转Bitmap的代码,彩色相机此处代码不同
    if(pDlg->m_pBitmap == NULL)
    {
    pDlg->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;
    }
    pDlg->m_pBitmap->SetPalette(pal);
    Gdiplus::Status ret = pDlg->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;
    }
    pDlg->m_pBitmap->UnlockBits(&lockedbits);
    #pragma endregion 
    #pragma region //将图像显示在PictureControl控件上
    HDC hDC = ::GetDC(pDlg->m_stcPicture.m_hWnd);
    Gdiplus::Graphics GdiplusDC(hDC);
    CRect rcControl;
    pDlg->m_stcPicture.GetWindowRect(&rcControl);
    Gdiplus::Rect rtImage(0,0,rcControl.Width(),rcControl.Height());
    GdiplusDC.DrawImage(pDlg->m_pBitmap,rtImage,0,0,width,height, Gdiplus::UnitPixel);
    delete []pal;
    ::ReleaseDC(pDlg->m_stcPicture.m_hWnd,hDC);
    delete pDlg->m_pBitmap ;
    pDlg->m_pBitmap =NULL;
    #pragma endregion 
    // queue buffer again
    pBufferFilled->QueueBuffer();
  }
  }
  catch (BGAPI2::Exceptions::IException& ex)
  {
  CString str;
  str.Format(_T("ExceptionType:%s! ErrorDescription:%s in function:%s"),ex.GetType(),ex.GetErrorDescription(),ex.GetFunctionName());  
  } 
}

Baumer工业相机使用BGAPISDK的C++平台的优势

C++是一种强大的、面向对象的编程语言,为使用SDK的工业相机提供了若干优势。为此,使用C++的一些好处包括:


性能: 与其他编程语言如Java、Python或C#相比,C++具有更好的性能。这在处理工业相机时很重要,因为工业相机会产生大量的数据,需要快速处理。


跨平台的兼容性: C++可以在不同的平台上使用,如Windows、Linux和macOS,使其成为创建兼容不同操作系统的SDK的理想选择。


灵活性: 在编程方面,C++提供了很大的灵活性,使其易于用于不同种类的工业相机。此外,C++编程可用于集成不同的API,这使得为特定相机型号开发定制解决方案成为可能。


面向对象的方法: C++是一种面向对象的编程语言,这意味着它为组织代码提供了一个清晰的结构。这有利于创建可重复使用的代码,并促进模块化,使其更容易建立易于维护的复杂软件。


库和框架的可用性: 在C++中,有许多库和框架可以用来创建工业相机的SDK。这包括图像处理、计算机视觉、网络编程等方面的库。这些库使创建复杂的应用程序更加容易,而不必从头开始重写代码。


总之,C++平台为创建工业相机的SDK提供了许多优势。它的性能、跨平台兼容性、灵活性、面向对象的方法以及可用的库和框架使其成为开发工业相机软件的理想选择。


Baumer工业相机的的彩色相机和黑白相机分别的优势

堡盟彩色工业相机的优势:


由于使用了先进的彩色滤光片,色彩再现的精度更高。

能够提供更多的图像细节,更好地区分复杂场景中的物体。

更具视觉吸引力的图像,对检查和质量控制等任务很有用。

可用于机器视觉和交通监控等应用。

堡盟的黑白工业相机的优势:


由于没有彩色滤光片,提供更高的分辨率和更清晰的图像。

对光有更高的敏感性,使其成为低光照条件下的理想应用。

可以捕获更快的帧率,使其成为高速应用的理想选择,如生产线监控。

与彩色摄像机相比,成本降低,使它们成为某些应用中更经济的选择。


Baumer彩色工业相机和黑白工业相机在图像处理上的不同点

彩色工业相机和黑白(单色)工业相机在其图像处理能力上有所不同。


彩色工业相机被设计用来捕捉全彩图像,这意味着它们必须处理和分析来自多个颜色通道(通常是红色、绿色和蓝色)的数据。这需要更多的计算能力和专门的算法来从原始图像数据中提取准确的颜色信息。


黑白工业相机只捕获灰度图像,这意味着它们不需要处理多个颜色通道。这简化了图像处理任务,从而使帧率更快,分辨率更高,噪音更低。


这两种的区别也在导致上面再回调函数里进行显示图像时也有所不同的原因。


就应用而言,彩色工业相机是需要准确识别颜色的任务的理想选择,如质量控制、颜色分类和印刷材料的检查。黑白工业相机更适合于需要高灵敏度的任务,如低光成像或运动检测。

目录
相关文章
|
2月前
|
Serverless 编译器 C++
【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
本任务要求设计一个矩形类、圆形类和图形基类,计算并输出相应图形面积。相关知识点包括纯虚函数和抽象类的使用。 **目录:** - 任务描述 - 相关知识 - 纯虚函数 - 特点 - 使用场景 - 作用 - 注意事项 - 相关概念对比 - 抽象类的使用 - 定义与概念 - 使用场景 - 编程要求 - 测试说明 - 通关代码 - 测试结果 **任务概述:** 1. **图形基类(Shape)**:包含纯虚函数 `void PrintArea()`。 2. **矩形类(Rectangle)**:继承 Shape 类,重写 `Print
59 4
|
7月前
|
传感器 定位技术 C++
基于C++的GDAL用空白栅格填充长时间序列遥感影像中的缺失图像
然后,定义需要处理的遥感影像路径列表,和识别数据缺失的逻辑。这里我们简化处理,假设已经知道哪一幅图像是缺失的,因此直接跳过识别步骤。
104 1
|
7月前
|
传感器 算法 C++
C++ PCL 设置法向量的方向
C++ PCL 设置法向量的方向
125 0
|
7月前
|
编译器 C++
VS Code设置C++编译器路径
VS Code设置C++编译器路径
107 0
|
25天前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
4天前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
34 16
|
8天前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
51 6
|
1月前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
25天前
|
安全 编译器 C语言
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。
|
25天前
|
存储 程序员 C语言
【C++篇】深度解析类与对象(上)
在C++中,类和对象是面向对象编程的基础组成部分。通过类,程序员可以对现实世界的实体进行模拟和抽象。类的基本概念包括成员变量、成员函数、访问控制等。本篇博客将介绍C++类与对象的基础知识,为后续学习打下良好的基础。