Baumer工业相机堡盟工业相机如何通过BGAPI SDK和GDI+库中的Image类图像压缩算法进行图像压缩保存(C++)

简介: Baumer工业相机堡盟工业相机如何通过BGAPI SDK和GDI+库中的Image类图像压缩算法进行图像压缩保存(C++)

Baumer工业相机

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


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

Baumer相机中原始图像可以和微软提供的图像压缩算法进行联合,从而实现外部图像进行压缩的功能设置。


Baumer工业相机和GDI+库图像压缩技术背景

工业相机被用于各个行业的不同应用,如质量控制、机器视觉、过程监控和研究目的。这些相机产生高分辨率的图像,对准确的检查和分析至关重要。然而,这些图像占据了大量的存储空间,并且由于其大小,可能难以处理。


解决这个问题的一个办法是在不丢失任何重要细节的情况下对图像进行压缩。GDI+库的图像压缩算法是开发人员用来压缩工业相机图像的一种流行方法。GDI+库是一个用于Windows的图形库,允许开发人员创建和处理图形图像。它提供了各种功能,可以帮助开发者有效地压缩图像。


GDI+库中的图像类根据图像的文件格式,使用各种图像压缩算法。例如,JPEG压缩用于JPEG图像文件,而PNG压缩则用于PNG图像文件。


GDI+库使用的JPEG压缩算法是有损的,意味着在压缩过程中会丢失一些图像数据。损失的数据量可以通过调整压缩质量等级来控制。较低的质量水平会导致较小的文件大小,但图像质量较差,而较高的质量水平会导致较大的文件大小,但图像质量较好。


GDI+库使用的PNG压缩算法是无损的,这意味着在压缩过程中不会丢失图像数据。PNG文件也可以使用不同的过滤器进行压缩,帮助减少表示图像所需的数据量。


总的来说,GDI+库使用有损和无损压缩算法的组合来提供高效的图像存储和操作能力。


有关于Baumer工业相机中的JPEG图像压缩相机如何使用内置图像压缩算法的的介绍,之前已经有相关的技术博客可以参考:


Baumer工业相机堡盟相机中的JPEG图像压缩相机如何通过BGAPI SDK和OpenCV的Mat进行图像转换(C++)


有关于如何在C#的平台下实现通过BGAPI SDK实现微软图像质量压缩的核心代码技术博客如下所示:

Baumer工业相机堡盟工业相机如何通过BGAPI SDK和微软图像压缩算法进行图像压缩保存(C#)


这里主要描述如何在C++的平台下实现通过BGAPI SDK实现GDI+库图像质量压缩的核心代码


代码分析

本文介绍使用BGAPI SDK对Baumer的工业相机进行开发时,使用通过BGAPI SDK和GDI+库的图像压缩算法进行图像转换的功能,注意Image算法的使用需要将Buffer图像先转为Bitmap数据,再进行压缩算法的使用。


第一步:先引用对应的GDI+库

C++环境下引用GDI+库作为图像处理库代码如下所示:


#include <afxwin.h>
#include <gdiplus.h>
#pragma comment(lib, "gdiplus.lib")
using namespace Gdiplus;

第二步:在回调函数里进行Buffer图像转换为Image图像进行压缩

下面为在在C++环境里回调函数中进行图像转换为Image图像的核心代码,如下所示:

//图像回调函数
//==================
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 
    // 将Bitmap对象转换为Image对象
    Image* img = (Image*)m_pBitmap.GetThumbnailImage(width, height, NULL, NULL);
    //将Image图像进行JPEG图像压缩,压缩质量80
    CString OutputImagePath = _T("CompressedImage.jpg")
    CompressImage(img , OutputImagePath , 80);
    #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());  
  } 
}

第三步:GDI+库中Image图像压缩算法

下面为使用GDI+库压缩算法的核心代码,如下所示:

void CompressImage(Image* image, const CString& destFile, int quality)
{
    if (image)
    {
        CLSID clsid;
        GetEncoderClsid(L"image/jpeg", &clsid);
        EncoderParameters encoderParams;
        encoderParams.Count = 1;
        encoderParams.Parameter[0].Guid = EncoderQuality;
        encoderParams.Parameter[0].Type = EncoderParameterValueTypeLong;
        encoderParams.Parameter[0].NumberOfValues = 1;
        encoderParams.Parameter[0].Value = &quality;
        image->Save(destFile, &clsid, &encoderParams);
        delete image;
    }
    GdiplusShutdown(gdiplusToken);
}

工业相机图像通过SDK使用GDI+库图像压缩算法的优点

减少了文件大小: GDI+库图像压缩算法有助于减少工业相机图像的大小,而不影响图像的质量。这使得存储和分发图像变得更加容易和快速。


更快的处理: 使用GDI+库图像压缩算法可以更快地处理工业相机图像。减少的文件大小有助于加快图像分析和处理的速度。


更好的质量: GDI+库图像压缩算法在压缩工业相机图像的同时保持其质量。这导致了图像质量的提高,减少了失真和假象。


多功能性: 使用GDI+库图像压缩算法的SDK可以在多个平台上使用,使其成为工业相机图像压缩的通用解决方案。


成本效益高: 使用GDI+库图像压缩算法的工业相机图像是一个具有成本效益的解决方案,因为它减少了对大型存储容量和昂贵硬件的需求。


工业相机图像通过SDK使用GDI+库图像压缩的行业应用

机器视觉: 工业相机被广泛用于机器视觉系统,以检查和监测汽车、电子和医疗等行业的生产线。


2.质量控制: 对工业相机拍摄的图像进行分析,以确保产品符合要求的质量标准。


监视: 工业相机捕获的图像用于安全和监视目的,如监视公共区域、建筑物和仓库。


交通监控: 摄像机图像被用于交通管理系统,以监测和控制城市地区的交通流量。


医学成像: 工业相机用于捕捉医疗用途的图像,如内窥镜和牙科成像。


自主车辆: 工业相机捕捉的图像用于自动驾驶车辆,以提供有关车辆周围环境的实时信息。


农业: 工业相机用于农业,监测作物生长和检测植物疾病。


机器人学: 工业相机用于工业机器人,提供视觉反馈,使机器人能够执行精确的任务。

目录
相关文章
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
359 2
|
存储 算法 数据处理
公司局域网管理中的哈希表查找优化 C++ 算法探究
在数字化办公环境中,公司局域网管理至关重要。哈希表作为一种高效的数据结构,通过哈希函数将关键值(如IP地址、账号)映射到数组索引,实现快速的插入、删除与查找操作。例如,在员工登录验证和设备信息管理中,哈希表能显著提升效率,避免传统线性查找的低效问题。本文以C++为例,展示了哈希表在局域网管理中的具体应用,包括设备MAC地址与IP分配的存储与查询,并探讨了优化哈希函数和扩容策略,确保网络管理高效准确。
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
409 17
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
387 0
|
存储 算法 安全
企业员工数据泄露防范策略:基于 C++ 语言的布隆过滤器算法剖析[如何防止员工泄密]
企业运营过程中,防范员工泄密是信息安全领域的核心议题。员工泄密可能致使企业核心数据、商业机密等关键资产的流失,进而给企业造成严重损失。为应对这一挑战,借助恰当的数据结构与算法成为强化信息防护的有效路径。本文专注于 C++ 语言中的布隆过滤器算法,深入探究其在防范员工泄密场景中的应用。
414 8
|
存储 监控 算法
基于 C++ 哈希表算法的局域网如何监控电脑技术解析
当代数字化办公与生活环境中,局域网的广泛应用极大地提升了信息交互的效率与便捷性。然而,出于网络安全管理、资源合理分配以及合规性要求等多方面的考量,对局域网内计算机进行有效监控成为一项至关重要的任务。实现局域网内计算机监控,涉及多种数据结构与算法的运用。本文聚焦于 C++ 编程语言中的哈希表算法,深入探讨其在局域网计算机监控场景中的应用,并通过详尽的代码示例进行阐释。
388 4
|
机器学习/深度学习 存储 算法
基于 C++ 布隆过滤器算法的局域网上网行为控制:URL 访问过滤的高效实现研究
本文探讨了一种基于布隆过滤器的局域网上网行为控制方法,旨在解决传统黑白名单机制在处理海量URL数据时存储与查询效率低的问题。通过C++实现URL访问过滤功能,实验表明该方法可将内存占用降至传统方案的八分之一,查询速度提升约40%,假阳性率可控。研究为优化企业网络管理提供了新思路,并提出结合机器学习、改进哈希函数及分布式协同等未来优化方向。
503 0
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
1229 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
JavaScript 前端开发 Java
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
755 0
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
1236 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex