Baumer工业相机中偏振相机如何使用Baumer堡盟GAPI SDK来进行偏振数据的计算转换输出(C++)

news/2025/2/19 17:53:18/

项目场景

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

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

Baumer工业相机的BGAPI SDK给新型偏振照相机提供了测量所获图像的强度和偏振的能力。因此,它能够在应用程序中利用偏振信息。本应用说明描述了如何获得偏振信息。

工业相机产品:
Baumer堡盟VCXU-50MP和堡盟VCXG-50MP,GAPI SDK v2.9.2及以上。

Baumer工业相机的偏振功能的详细介绍应用可以参考下面的技术博客,本文只介绍偏振数据的使用:

Baumer工业相机堡盟相机如何使用偏振功能(偏振相机优点和行业应用)(C++)_格林威的博客-CSDN博客


技术背景

Baumer工业相机的BGAPI SDK可以提供相机的图像原始数据,Halcon具有极为巨大的图像处理库,在图像处理领域非常强大,功能丰富,使用于工业视觉检测。

工业相机的SDK(Software Development Kit)是为了方便开发人员对工业相机进行控制和图像采集而提供的一套软件工具。而Halcon是一款强大的机器视觉软件,能够进行图像处理、分析、识别等多种任务。

 Baumer工业相机中的偏振相机是基于索尼IMC250MZR传感器的。该传感器涂有一层金属网,可以过滤4个相邻像素的偏振信息。偏振角度被过滤以0°、45°、90°、135°的方式排列。
有了这些信息,就可以计算出以下数据:
偏振角(AOP)。
直线极化度(DOLP)
角度和直角极化度(ADOLP)
图像的强度。

使用BGAPI SDK的偏振相机的用法:
该相机只提供有关偏振的原始数据。不同偏振格式的计算格式的计算在主机系统上通过堡盟GAPI SDK完成。

这就减少了接口的必要带宽,因为数据只传输一次,而不是针对每种偏振格式(AOP、DOLP、ADOLP.Intensity)单独传输、强度)分别传输。


功能分析

偏振相机功能的描述
使用标准化的SFNC特性 "ComponentSelector "和 "ComponentEnable",GenICam
兼容的软件可以识别该相机提供原始偏振数据。这些特征不能被改变(只读)。
为了进行识别,应检查以下特征:
ComponentSelector = PolarizedRaw
ComponentEnable = True
为了实现对广泛的GenICam兼容软件的兼容性,堡盟没有引入自定义图像格式。
原始偏振数据使用标准格式Mono8、Mono10、Mono12或Mono13传输、Mono10、Mono12或Mono12p。
此外,该相机还提供了用于校准相机的必要功能,这些功能属于以下类别"校准控制" 这些功能充满了堡盟的校准值。

如有必要,还可使用"DeviceResetToDeliveryState "将把这些值重置为堡盟提供的校准值。


代码分析

为了确保计算尽可能少地使用资源并实现高帧率,有两种方法方法来处理数据。这里我们解释一下最重要的配置和使用的软件功能的使用。
如果一个应用只需要一种偏振格式(AOP、DOLP或ADOLP),最好使用一个单部分图像对象。单部分图像对象正好包含一个图像。

核心代码如下所示:

// A Baumer Polarization Camera can be recognized by checking that the feature
// ComponentSelector has the value "PolarizedRaw"
if (pDevice->GetRemoteNodeList()->GetNodePresent("ComponentSelector"))
{
if (pDevice->GetRemoteNode("ComponentSelector")->GetValue() == "PolarizedRaw")
{
// I'm a Polarization Camera
}
}
// Acquire an image to a buffer
BGAPI2::Buffer* pBufferFilled = pDataStream->GetFilledBuffer(1000);
bo_uint width = static_cast<bo_uint>(pBufferFilled->GetWidth());
bo_uint height = static_cast<bo_uint>(pBufferFilled->GetHeight());
void* pBufferData = pBufferFilled->GetMemPtr();
bo_uint64 bufferDataSize = pBufferFilled->GetMemSize();
bo_uint64 imageOffset = pBufferFilled->GetImageOffset();// Enable all polarized formats (AOP, DOLP, ADOLP, Intensity)
BGAPI2::Node* pCompSelector = pImage->GetNode("ComponentSelector");
BGAPI2::NodeMap*pComponents = pCompSelector->GetEnumNodeList();
for (bo_uint64 i = 0; i < pComponents->GetNodeCount(); i++)
{pCompSelector->SetInt(i);pImage->GetNode("ComponentEnable")->SetBool( true );
}
// Calculate all the polarization formats from the raw image to a multi-part Image object.
BGAPI2::Image* pMultiPartImage = pImageProcessor->CreateTransformedImage(pImage, "Mono8");
// Get necessary information about each multi-part
BGAPI2::Node* pComponentSelector = pMultiPartImage->GetNode("ComponentSelector");
BGAPI2::Node* pComponentEnable = pMultiPartImage->GetNode("ComponentEnable");
BGAPI2::Node* pComponentOffset = pMultiPartImage->GetNode("ComponentOffset");
BGAPI2::Node* pComponentLength = pMultiPartImage->GetNode("ComponentLength");
const void* const pImageBuffer = pMultiPartImage->GetBuffer();
// Loop through the multi-part Image object to extract all the parts
for (std::set<std::string>::const_iterator it = sComponents.begin(); it != sComponents.end();it++)
{pComponentSelector->SetValue(it->c_str());std::string sComponent = pComponentSelector->GetValue().get();if (pComponentEnable->GetBool()) {bo_uint64 partLength = pComponentLength->GetInt();BGAPI2::Image* pComponent = NULL;if (partLength > 0){// Part is validbo_uint64 partOffset = pComponentOffset->GetInt();pComponent = pImageProcessor->CreateImage(width, height, "Mono8", (char*)(pImageBuffer)+partOffset, partLength);}else{// Part is emptyif (sComponent == "ADOLP") {// ADOLP is calculated from the AOP and DOLP images, therefore this// second transformation is necessary.pComponent = pImageProcessor->CreateTransformedImage(pMultiPartImage, "RGB8");}}if (pComponent){// Whatever needs to be done with the polarization data goes here// doCustomCalculation(pComponent, sComponent);// Release the data when not needed anymorepComponent->Release();}}


CameraExplorer软件使用偏振功能

我们可以通过CameraExplorer软件用于查看和保存以下格式的偏振数据
AOP、DOLP、ADOLP和Intensity。
配置是可以在基本视图中使用 "偏振 "类别来完成。

如下图所示:

 

 

 


http://www.ppmy.cn/news/35822.html

相关文章

react组件进阶(四)

文章目录1. 组件通讯介绍2. 组件的 props3. 组件通讯的三种方式3.1 父组件传递数据给子组件3.2 子组件传递数据给父组件3.3 兄弟组件4. Context5. props 深入5.1 children 属性5.2 props 校验5.3 props 的默认值6. 组件的生命周期6.1 组件的生命周期概述6.2 生命周期的三个阶段…

C++ 标准模板库-vector

文章目录1. 概念2. Construct&#xff08;构造&#xff09;3. destructor&#xff08;析构&#xff09;4. operator&#xff08;重载符号&#xff09;5. Capacity:6. 参考文献1. 概念 vector是一个序列化容器&#xff0c;相当于可以改变大小的数组。 2. Construct&#xff08…

SpringMVC的响应处理

文章目录一、传统同步业务数据响应1. 请求资源转发2. 请求资源重定向3. 响应模型数据4. 直接回写数据二、前后端分离异步业务数据响应一、传统同步业务数据响应 Spring响应数据给客户端&#xff0c;主要分为两大部分&#xff1a; ⚫ 传统同步方式&#xff1a;准备好模型数据&am…

mysql 8.0集群搭建(一主多从和多主多从)

MYSQL8.0集群搭建 一主多从 基础环境**1. 下载 mysql rpm包****2.主节点添加主从同步账户****3.开启二进制日志文件和添加server-id**4.登入主节点mysql重置偏移量5.注册从节点6.启动 启动所有从节点的slave7.多主多从模式&#xff0c;&#xff08;此模式基于上边一主多重模式搭…

为什么说学人工智能一定要学Python?

学习人工智能需要掌握大量的数据处理和算法实现&#xff0c;而Python作为一种高级编程语言&#xff0c;具有简单易学、灵活多变、开源丰富的库等优点&#xff0c;成为了人工智能领域广泛应用的语言之一。 具体来说&#xff0c;Python在人工智能中的优势包括&#xff1a; ​​…

nginx配合vite开启gzip压缩以及各种问题处理

1、导入压缩插件 import compressPlugin from "vite-plugin-compression";2、vite配置压缩插件 plugins: [vue(),compressPlugin({verbose: true, // 默认即可disable: false, //开启压缩(不禁用)&#xff0c;默认即可deleteOriginFile: true, //删除源文件thresho…

黑马程序员 linux 学习笔记入门部分合集

ubuntu 安装 本课程使用 ubuntu 系统。 ubuntu 官网 - download。 上面会显示有两个版本&#xff0c;每年 ubuntu 发布两个版本&#xff0c;LTS 是长期维护版&#xff0c;所以相对会较稳定。 介绍 Linux 发行版本 不管什么版本&#xff0c;内核都是一样的。 RPM based&a…

从零开始学Python第08课:常用数据结构之列表-1

在开始本节课的内容之前&#xff0c;我们先给大家一个编程任务&#xff0c;将一颗色子掷6000次&#xff0c;统计每种点数出现的次数。这个任务对大家来说应该是非常简单的&#xff0c;我们可以用1到6均匀分布的随机数来模拟掷色子&#xff0c;然后用6个变量分别记录每个点数出现…