Baumer工业相机堡盟工业相机如何通过BGAPI SDK实现Raw格式的图像保存(C++)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK实现Raw格式的图像保存(C++)

  • Baumer工业相机
  • Baumer工业相机通过SDK实现Raw格式的图像保存的技术背景
  • 通过SDK获取相机信息的代码分析
    • Baumer工业相机回调函数里保存原始图像数据
    • Baumer保存Raw图像格式重要核心代码
    • Baumer工业相机保存Raw图像格式的测试
  • Baumer工业相机通过SDK实现Raw格式的图像保存的优势
  • Baumer工业相机通过SDK实现Raw格式的图像保存的行业应用

Baumer工业相机

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

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

Baumer RAW文件是一种记录了工业相机传感器的原始信息,同时记录了由相机拍摄所产生的一些原数据(Metadata,如ISO的设置、快门速度、光圈值、白平衡等)的文件。RAW是未经处理、也未经压缩的格式,可以把RAW概念化为“原始图像编码数据”。

Baumer工业相机的Camera Explorer软件功能强大,内容丰富,通过该软件可以有效的获取相机相关的全部信息,在对于相机检测项目的开发中,有时需要获取相机中图像Buffer信息和相关的数据流信息,而Camera Explorer软件可以有效的显示相关的信息。

Baumer工业相机通过SDK实现Raw格式的图像保存的技术背景

Baumer工业相机通常通过SDK(Software Development Kit)实现Raw格式的图像保存时,会利用其专门的图像处理模块和数据传输接口来处理原始图像数据。这种方式的技术背景涉及以下几个方面:

  1. 数据采集和传输:Baumer工业相机的SDK会提供用于高速数据采集和传输的接口和功能,以确保从相机传感器捕获到的Raw图像数据可以高效地传输给计算机或其他设备进行处理。

  2. 图像处理和编程接口:Baumer的SDK会提供图像处理的API和工具,以便开发人员可以在采集到的Raw图像数据上进行各种处理操作,包括像素值的访问、图像增强、颜色校正等,从而满足不同应用的需求。

  3. 校准和配置:Baumer的SDK还可以提供各种配置选项和校准工具,以便开发人员可以对相机进行校准和配置,确保从相机获取的Raw图像数据质量和准确性。

  4. 文件格式和保存:Baumer的SDK会支持将处理后的图像数据保存为Raw格式的文件,同时可能也提供其他格式的转换工具和API,以便用户能够导出不同格式的图像数据。

总的来说,Baumer工业相机通过SDK实现Raw格式的图像保存是建立在高速数据传输、图像处理和API支持的基础上,以满足工业和科学领域对高质量图像数据处理的需求。

通过SDK获取相机信息的代码分析

本文介绍使用BGAPI SDK对Baumer工业相机进行开发时,通过BGAPI SDK实现Raw格式的图像保存,从而能够做对应的参数设置和功能开发。

有关于Baumer工业相机堡盟工业相机如何通过BGAPI SDK实现Raw格式的图像保存(C#)的介绍,之前已经有相关的技术博客可以参考:

Baumer工业相机堡盟工业相机如何通过BGAPI SDK实现Raw格式的图像保存(C#)

Baumer工业相机回调函数里保存原始图像数据

C++环境下在回调函数里保存Raw图像代码如下所示:

void BGAPI2CALL BufferHandler( void * callBackOwner, Buffer * pBufferFilled )
{CGigeDemoDlg* pDlg = (CGigeDemoDlg*)callBackOwner;unsigned char* imagebuffer = NULL;BGAPI2::Image* pImageSrc = NULL;bo_uchar* pMemDst = NULL;bo_uint64 memSizeDst = 0;USES_CONVERSION;try{if(pBufferFilled == NULL){}else if(pBufferFilled->GetIsIncomplete() == true){// queue buffer againpBufferFilled->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());//获取当前图像数据const bo_uint w = static_cast<bo_uint>(pBufferFilled->GetWidth());const bo_uint h = static_cast<bo_uint>(pBufferFilled->GetHeight());void* const pMemSrc = pBufferFilled->GetMemPtr();BGAPI2::String sBufferPixelFormat = pBufferFilled->GetPixelFormat();const bo_uint64 memSizeSrc = pBufferFilled->GetMemSize();if (pImageSrc == NULL) {pImageSrc = pDlg->m_imgProcessor->CreateImage(w, h, sBufferPixelFormat, pMemSrc, memSizeSrc);} else {pImageSrc->Init(w, h, sBufferPixelFormat, pMemSrc, memSizeSrc);}if (pImageSrc != NULL&PixelFormat1.FindOneOf((_T("Bayer")))!=-1) {//如果选用格式为BayerBGAPI2::String sPixelFormatDst ="BGR8";							bo_uint64 bufferLength = pImageSrc->GetTransformBufferLength(sPixelFormatDst);if (bufferLength > memSizeDst) {if (pMemDst != NULL) {delete[] pMemDst;pMemDst = NULL;memSizeDst = 0;}pMemDst = new bo_uchar[static_cast<size_t>(bufferLength)];memSizeDst = bufferLength;}				pDlg->m_imgProcessor->TransformImageToBuffer(pImageSrc, sPixelFormatDst, pMemDst, bufferLength);}#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";//使用Baumer自定义Raw格式保存BGAPI2::Image* pBufferFilledImage;CString filename = pDlg->m_strDirectory+strtime+".brw"; BGAPI2::String filenamestr = pDlg->m_strDirectory+strtime+".brw";pImageSrc->GetNode("SaveBrw")->SetValue(filenamestr);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 againpBufferFilled->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保存Raw图像格式重要核心代码

BGAPI2::Image* pImageSrc = NULL;
const bo_uint w = static_cast<bo_uint>(pBufferFilled->GetWidth());
const bo_uint h = static_cast<bo_uint>(pBufferFilled->GetHeight());
void* const pMemSrc = pBufferFilled->GetMemPtr();
BGAPI2::String sBufferPixelFormat = pBufferFilled->GetPixelFormat();
const bo_uint64 memSizeSrc = pBufferFilled->GetMemSize();
//将相机内部图像内存数据转为BGAPI2.Image数据,方便后续直接保存未BRW对应的BRW格式
if (pImageSrc == NULL) 
{pImageSrc = pDlg->m_imgProcessor->CreateImage(w, h, sBufferPixelFormat, pMemSrc, memSizeSrc);
} 
else 
{pImageSrc->Init(w, h, sBufferPixelFormat, pMemSrc, memSizeSrc);
}#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);//使用Baumer自定义Raw格式保存BGAPI2::Image* pBufferFilledImage;CString filename = pDlg->m_strDirectory+strtime+".brw"; BGAPI2::String filenamestr = pDlg->m_strDirectory+strtime+".brw";pImageSrc->GetNode("SaveBrw")->SetValue(filenamestr);pDlg->m_bSaveImage = false;
}
#pragma endregion 

Baumer工业相机保存Raw图像格式的测试

在这里插入图片描述

Baumer工业相机通过SDK实现Raw格式的图像保存的优势

通过SDK实现Raw格式的图像保存有几个优势:

  1. 灵活性:使用SDK保存图像的原始Raw格式可以保留数据的完整性,而不会出现由JPEG等压缩格式所带来的数据损失。这使得用户可以在后期处理过程中更加灵活地进行调整和编辑,从而获得更高质量的图像。

  2. 捕获更多细节:Raw格式通常能够捕获更多的图像细节和动态范围,使得在后期处理中可以更好地进行曝光和颜色校正,以及减少噪点等工作。

  3. 自定义处理:通过SDK保存Raw格式图像,用户可以利用相机制造商提供的原始数据以及自定义的图像处理算法进行更精细的图像处理,满足特定的应用需求。

Raw格式图像的保存使得用户能够获得更高质量的图像数据,但同时也需要更多的后期处理工作。因此,选择是否保存Raw格式图像取决于具体的应用需求和后期处理能力。

Baumer工业相机通过SDK实现Raw格式的图像保存的行业应用

工业相机通过SDK实现Raw格式的图像保存在许多行业应用中发挥重要作用,包括但不限于:

  1. 检测和测量应用:在制造业中,工业相机通过SDK保存Raw格式的图像可用于精确的检测和测量应用,例如缺陷检测、尺寸测量、外观质量控制等。Raw格式图像的高质量和完整性有助于确保实时检测和测量的准确性。

  2. 医学成像:医疗领域也常常利用工业相机进行医学成像,比如X射线、CT扫描、核磁共振成像等。通过SDK保存Raw格式的图像能够保留更多的图像细节和动态范围,有助于医学图像的后期处理和分析。

  3. 智能交通:在智能交通系统中,工业相机通过SDK保存Raw格式的图像可用于车牌识别、交通监控等应用。Raw格式的图像数据能提供更多细节,有助于提高识别的准确性和可靠性。

  4. 机器视觉:在自动化生产线和机器视觉系统中,工业相机通过SDK保存Raw格式的图像可用于产品检测、识别和定位等应用。Raw格式图像保留了更多的信息,有助于提高机器视觉系统的准确性和稳定性。

总的来说,工业相机通过SDK实现Raw格式的图像保存在需要高质量图像数据、精确测量和复杂分析的行业应用中具有广泛的应用前景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2660568.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

一款降压型开关模式转换器解决方案

一、基本概述 TX4145 是一款降压型开关模式转换器。TX4145 在 6-60V 宽输入电源范围内实现不同峰值输出电流&#xff0c;并且具有出色的线电压和负载调整率。 TX4145 采用 PWM 电流模工作模式&#xff0c;环路易于稳定并提供快速的瞬态响应。 TX4145 外部提供 FS 脚&#xf…

Android 13 - Media框架(28)- MediaCodec(三)

上一节我们了解到 ACodec 执行完 start 流程后&#xff0c;会把所有的 input buffer 都提交给 MediaCodec 层&#xff0c;MediaCodec 是如何处理传上来的 buffer 呢&#xff1f;这一节我们就来了解一下这部分内容。 1、ACodecBufferChannel::fillThisBuffer ACodec 通过调用 A…

语言模型:从n-gram到神经网络的演进

目录 1 前言2 语言模型的两个任务2.1 自然语言理解2.2 自然语言生成 3 n-gram模型4 神经网络语言模型5 结语 1 前言 语言模型是自然语言处理领域中的关键技术之一&#xff0c;它致力于理解和生成人类语言。从最初的n-gram模型到如今基于神经网络的深度学习模型&#xff0c;语言…

普中STM32-PZ6806L开发板(HAL库函数实现-7段共阳数码管数字显示)

简介 通过操作GPIO输出电平实现驱动单个共阳数码管 0 ~ F的显示。电路原理图 数码管电路原理图 数码管与主芯片电路原理图 其他知识 1. 由原理图可知, 共阳极已接VCC, 所以只需要控制GPIO输出低电平就可以点亮7 . 的数码管了. 2. 驱动管与主芯片引脚对应关系A -> PC0…

408数据结构常考算法基础训练

408相关&#xff1a; 408数据结构错题知识点拾遗 408数据结构常考算法基础训练 408计算机组成原理错题知识点拾遗408操作系统错题知识点拾遗等待完善408计算机网络错题知识点拾遗 408计算机网络各层协议简记等待完善 该训练营为蓝蓝考研&#xff08;蓝颜知己&#xff09;的算…

听GPT 讲Rust源代码--src/tools(29)

File: rust/src/tools/clippy/clippy_lints/src/unused_peekable.rs 在Rust源代码中&#xff0c;rust/src/tools/clippy/clippy_lints/src/unused_peekable.rs这个文件是Clippy工具中一个特定的Lint规则的实现文件&#xff0c;用于检测未使用的Peekable迭代器。 Peekable迭代器…

kubeadm开快速的搭建一个k8s集群

kubeadm开快速的搭建一个k8s集群 二进制适合大集群&#xff0c;50台以上主机 kubeadm更适合中小企业的业务集群。 master节点 20.0.0.92 docker kubelet kubeadm kubectl flannel node1 20.0.0. 94 docker kubelet kubeadm kubectl flanne node2 20.0.0.03 docker kubelet…

基于YOLOv8深度学习的45种交通标志智能检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

cnPuTTY 0.80.0.1—PuTTY Release 0.80中文版本简单说明~~

2023-12-18 官方发布了PuTTY 0.80本次发布主要是针对Terrapin攻击(CVE-2023-48795)的修改发布。 更多详细的内容请查看PuTTY Change Log。 有关Terrapin攻击可用简单参考&#xff1a;警告&#xff01;&#xff01;&#xff01;Terrapin攻击(CVE-2023-48795)~~~ 为了缓解此漏洞…

mysql 与 支持语言的连接驱动 jdbc connector JAR 包

有位网友问我有没有 mysql jdbc驱动 &#xff0c;我刚开始一脸懵逼&#xff0c;后来明白过来&#xff0c;在网上找了几篇文章看看了解了解&#xff0c;得出如下解决办法&#xff1a; Mysql jdbc 下载&#xff1a; 网址&#xff1a; MySQL :: Download Connector/J 步骤1 &a…

AWS SSM中切换AWS不同的profile

问题 在自己的开发笔记本上面&#xff0c;通过AWS SSM方式访问EC2服务&#xff0c;只需要通过简单的命令就可以访问EC2了&#xff0c;如下&#xff1a; aws ssm start-session --target i-xxxx12350这个命令就是利用aws命令行工具中ssm提供的会话管理能力访问ec2服务&#xf…

Kafka学习笔记1(千峰教育)

Kafka学习笔记1&#xff08;千峰教育&#xff09; 一、为什么使用消息队列1.使用同步的通信方式来解决多个服务之间的通信2.使用异步的通信方式 二、消息队列的流派1.有broker2.无broker 三、Kafka的基本知识1.Kafk2a的安装2.Kafka中的一些基本概念3.创建topic4.发送消息5.消费…

【2023年中国高校大数据挑战赛 】赛题 B DNA 存储中的序列聚类与比对 Python实现

【2023年中国高校大数据挑战赛 】赛题 B DNA 存储中的序列聚类与比对 Python实现 1 题目 赛题 B DNA 存储中的序列聚类与比对 近年来&#xff0c;随着新互联网设备的大量涌入和对其服务需求的指数级增长&#xff0c;越来越多的数据信息被产生与收集。预计到 2021 年&#xf…

网络攻防中应该掌握的进阶工具udp2raw,通过raw socket给UDP包加上TCP或ICMP header,进而绕过UDP屏蔽或QoS

网络攻防中应该掌握的进阶工具udp2raw,通过raw socket给UDP包加上TCP或ICMP header,进而绕过UDP屏蔽或QoS。 udp2raw tunnel,通过raw socket给UDP包加上TCP或ICMP header,进而绕过UDP屏蔽或QoS,或在UDP不稳定的环境下提升稳定性。可以有效防止在使用kcptun或者finalspeed的…

Unreal Engine游戏引擎的优势

在现在这个繁荣的游戏开发行业中&#xff0c;选择合适的游戏引擎是非常重要的。其中&#xff0c;Unreal Engine作为一款功能强大的游戏引擎&#xff0c;在业界广受赞誉。那Unreal Engine游戏引擎究竟有哪些优势&#xff0c;带大家简单的了解一下。 图形渲染技术 Unreal Engin…

gnu工程的编译 - 以libiconv为例

文章目录 gnu工程的编译 - 以libiconv为例概述gnu官方源码包的发布版从官方的代码库直接迁出的git版源码如果安装了360, 需要添加开发相关的目录到信任区生成 configrue 的方法备注END gnu工程的编译 - 以libiconv为例 概述 gnu工程的下载分2种: gnu官方源码包的发布版 这种…

中文版大模型 Token 成本计算器

分享一个轻量的小工具&#xff0c;10MB 左右&#xff0c;能够帮助你直观的了解大模型 Token 的计算方法。 希望能够帮助到想了解或者正在规划模型 API 使用成本的你。 写在前面 之所以折腾这个小工具&#xff0c;是因为有朋友和我提问&#xff0c;大模型 API 的 Token 到底是…

托管在亚马逊云科技的向量数据库MyScale如何借助AWS基础设施构建稳定高效的云数据库

MyScale是一款完全托管于亚马逊云科技&#xff0c;支持SQL的高效向量数据库。MyScale的优势在于&#xff0c;它在提供与专用向量数据库相匹敌甚至优于的性能的同时&#xff0c;还支持完整的SQL语法。以下内容&#xff0c;将阐述MyScale是如何借助亚马逊云科技的基础设施&#x…

手机/平板实现电脑第三屏-记录极简

软件&#xff1a; 手机 平板 : moonlight 电脑&#xff1a; 1 KtzeAbyss/Easy-Virtual-Display 2 Parsec Virtual Display Driver https://builds.parsec.app/vdd/parsec-vdd-0.38.0.0.exe 3 LizardByte/Sunshine: Self-hosted game stream host for Moonlight. (gith…

第十四章 Sentinel实现熔断与限流

Sentinel实现熔断与限流 gitee&#xff1a;springcloud_study: springcloud&#xff1a;服务集群、注册中心、配置中心&#xff08;热更新&#xff09;、服务网关&#xff08;校验、路由、负载均衡&#xff09;、分布式缓存、分布式搜索、消息队列&#xff08;异步通信&#x…