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彩色工业相机和黑白工业相机在图像处理上的不同点

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


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


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


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


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

目录
相关文章
|
4月前
|
传感器 定位技术 C++
基于C++的GDAL用空白栅格填充长时间序列遥感影像中的缺失图像
然后,定义需要处理的遥感影像路径列表,和识别数据缺失的逻辑。这里我们简化处理,假设已经知道哪一幅图像是缺失的,因此直接跳过识别步骤。
64 1
|
4月前
|
传感器 算法 C++
C++ PCL 设置法向量的方向
C++ PCL 设置法向量的方向
94 0
|
4月前
|
编译器 C++
VS Code设置C++编译器路径
VS Code设置C++编译器路径
60 0
|
6月前
|
算法 Java API
在VC++中使用CxImage库读写图像实现像素操作
在VC++中使用CxImage库读写图像实现像素操作
51 0
|
25天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
38 2
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
83 5
|
1月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
80 4
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
88 4
|
2月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
31 4
|
2月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
32 4