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 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());//获取当前图像数据
			

			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) 
			{
				//如果选用格式为Bayer
				BGAPI2::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 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保存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://www.mfbz.cn/a/276448.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用Html和js和layui写一个简单猜拳小游戏

简单学习技术&#xff0c;写了一个小游戏&#xff0c;用html和js写一个简单的小游戏。玩家点击按钮出拳&#xff0c;玩家胜利结果显示绿色&#xff0c;玩家输了结果显示红色&#xff0c;平局结果显示蓝色。 页面效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <…

低代码平台快速开发CRM 可灵活自定义的CRM软件

白码低代码平台以其简化和加速应用程序开发的方法而闻名&#xff0c;无需大量编写代码&#xff0c;只需通过可视化界面和配置来构建应用程序。在快速开发CRM方面&#xff0c;白码低代码平台具有许多优势和应用。 白码低代码平台快速搭建CRM 快速开发是白码低代码平台的一大优势…

最新AI系统ChatGPT网站系统源码,Midjourney绘画,GPT语音对话+ChatFile文档对话总结+DALL-E3文生图+思维导图一站式解决方案

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

MD5算法

一、引言 MD5&#xff08;Message-Digest Algorithm 5&#xff09;是一种广泛应用的密码散列算法&#xff0c;由Ronald L. Rivest于1991年提出。MD5算法主要用于对任意长度的消息进行加密&#xff0c;将消息压缩成固定长度的摘要&#xff08;通常为128位&#xff09;。在密码学…

算法设计与分析期末上机板子——课内题目题意与题解分析+课外知识点总结!

真正的模板&#xff01;&#xff01;&#xff01; 文章目录 课内堆实现C语言矩阵连乘E1D连分数计算C3A-钢管切割&#xff1a;动态规划C3C-流水线调度&#xff1a;动态规划C3E-矩阵连乘效率&#xff1a;区间动态规划C3F-导弹轰炸&#xff08;小偷问题&#xff09;&#xff1a;动…

flutter dio使用proxyman抓包进行网络调试

证书 wifi 手机和电脑连上同一个wifi&#xff0c;并且手机wifi使用代理&#xff0c;代理地址为电脑的ip和proxyman设置的监听端口 代码 import package:dio/dio.dart; import package:dio/io.dart; import dart:io;class ProxyUtil {static String proxyIP "";st…

MySQL GTID 主从错误

错误 搭建主从出现以下错误 Last_IO_Error: The replication receiver thread cannot start because the master has GTID_MODE OFF and this server has GTID_MODE ON. 原因 MySQL主从的 Master 和 Slave 必须 同时开启或者关闭 enforce-gtid-consistency和 gtid-mode 功能…

Centos如何修改ssh端口

想必很大一部分的同学用的是centos服务器&#xff0c;对于默认的22端口存在一定的安全风险&#xff0c;所以今天我们一起看下如何修改ssh端口 一、什么是SSH SSH&#xff08;Secure Shell&#xff09;是一种安全的远程登录协议&#xff0c;它允许您通过网络远程连接到Linux系统…

YOLOv5改进 | 2023主干篇 | 华为最新VanillaNet主干替换Backbone实现大幅度长点

一、本文介绍 本文给大家来的改进机制是华为最新VanillaNet网络&#xff0c;其是今年最新推出的主干网络&#xff0c;VanillaNet是一种注重极简主义和效率的神经网络架构。它的设计简单&#xff0c;层数较少&#xff0c;避免了像深度架构和自注意力这样的复杂操作(需要注意的是…

docker中部署mysql

原文链接&#xff1a; Docker 安装mysql8.0_docker安装mysql8.0-CSDN博客 1&#xff1a;拉取mysql镜像 docker pull mysql:8.0指定8.0版本的&#xff0c;因为我之前装的是5.6&#xff0c;不支持窗口函数&#xff0c;8版本之后的才支持&#xff0c;所以更换版本。 2&#xf…

C# WPF上位机开发(报表导出)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于在工厂上班的小伙伴来说&#xff0c;导出生产数据、生成报表&#xff0c;这是很习以为常的一个工作。之前的文章中&#xff0c;虽然我们也介绍…

格密码:隐藏超平面问题与uSVP问题 (Ajtai密码)

目录 一. 技术发展 二. 隐藏超平面问题&#xff08;hidden hyperplanes problem,HHP&#xff09; 三. 唯一最短向量问题&#xff0c;unique shortest vector problem&#xff0c;uSVP 四. Ajtai-Dwork密码系统&#xff08;改进版&#xff09; 4.1 公钥 4.2 私钥 4.3 加密…

Serverless架构:无服务器应用与AWS Lambda-读书笔记

Serverless架构&#xff1a;无服务器应用与AWS Lambda-读书笔记 好的架构可以成就软件&#xff0c;缺乏架构则会破坏软件。 一、Serverless 架构的来龙去脉 在典型的Web应用程序中&#xff0c;服务器接受前端的HTTP请求并处理请求。在保存到数据库之前&#xff0c;数据可能会…

<JavaEE> TCP 的通信机制(六) -- 异常情况处理 和 总结

目录 十、异常情况处理 1&#xff09;进程崩溃终止 2&#xff09;主机正常关机 3&#xff09;机器掉电/网络断开 1> 接收端掉线 2> 发送端掉线 TCP 通信机制 总结 阅读指针 -> 《 TCP 的通信机制 -- 延时应答、捎带应答、面向字节流 》&#xff1c;JavaEE&…

如何使用mac电脑,1、使用快捷命令打开访达,2、使用终端命令创建文件,3、使用命令打开创建的文件,并且在vscode中打开

如何使用mac电脑 1、使用快捷命令打开访达 optioncommand空格键 快速进入访达 shiftcmmandn 创建一个空目录 2、使用终端命令创建文件 2.1进入文件夹 在终端页面输入“cd /Users/yunf/Desktop/”并按回车键&#xff08;此时进入到桌面文件夹&#xff0c;如果需要进入到其它…

Qt(二):使用udp发送与接收图片

使用Qt来通过UDP协议发送和接收图片可以分为几个步骤。以下是一个基本的指南&#xff1a; 发送图片准备图片数据&#xff1a;首先&#xff0c;你需要将图片转换为可以在网络上传输的数据格式。通常&#xff0c;这涉及到将图片转换为字节数组。设置UDP套接字&#xff1a;在Qt中…

html-css-js移动端导航栏底部固定+i18n国际化全局

需求&#xff1a;要做一个移动端的仿照小程序的导航栏页面操作&#xff0c;但是这边加上了i18n国家化&#xff0c;由于页面切换的时候会导致国际化失效&#xff0c;所以写了这篇文章 1.效果 切换页面的时候中英文也会跟着改变&#xff0c;不会导致切换后回到默认的语言 2.实现…

Linux 查看系统类型和版本(内核版本 | 发行版本)

Linux 查看系统类型和版本 首先普及下linux系统的版本内容1. 查看linux系统内核版本2. 查看linux系统发行版本 首先普及下linux系统的版本内容 内核版本和发行版本区别 内核版本就是指 Linux 中最基层的代码&#xff0c;版本号如 Linux version 3.10.0-327.22.2.el7.x86_64发行…

docker compose 部署 grafana + loki + vector 监控kafka消息

Centos7 随笔记录记录 docker compose 统一管理 granfana loki vector 监控kafka 信息。 当然如果仅仅是想通过 Grafana 监控kafka&#xff0c;推荐使用 Grafana Prometheus 通过JMX监控kafka 目录 1. 目录结构 2. 前提已安装Docker-Compose 3. docker-compose 自定义服…

论文降重同义词替换的效果评估与优化建议 papergpt

大家好&#xff0c;今天来聊聊论文降重同义词替换的效果评估与优化建议&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 标题&#xff1a;论文降重同义词替换的效果评估与优…
最新文章