开源相机管理库Aravis学习——PixelFormat编码规则

news/发布时间2024/5/11 15:24:43

目录
  • 前言
  • 前置知识
    • PixelFormat
    • Bpp
  • 编码规则
    • 源码
    • 分析
    • 分类标准
  • 补充
    • ARV_PIXEL_FORMAT_BIT_PER_PIXEL
  • 参考文章

前言

在学习Aravis官方例程的时候,有这么一个函数:arv_camera_get_pixel_format,它的返回类型是ArvPixelFormat(本质是个32位无符号整数)。这意味着对于每个图像数据格式,都有自己对应的唯一的编码。我比较好奇Aravis是通过什么规则对各种图像数据格式进行的编码,于是就查看了源码。

本文主要讨论Aravis中对不同图像数据格式的编码规则。

前置知识

PixelFormat

PixelFormat指的是图像中每个像素的数据格式,它定义了图像中像素的组成方式、颜色信息的存储方法和每个像素所占的位数等。这一格式对于图像的处理和显示是非常关键的,因为它直接影响到图像的质量和处理的效率。

常见的PixelFormat有:Mono8,BayerGB8,BayerGB10等。

Bpp

在工业相机中,Bpp通常指的是"bits per pixel",它描述了存储每个像素所需的位数。这个值决定了图像的颜色深度以及可能包含的信息量。例如:

  • Bpp8: 每个像素使用8位表示,常用于灰度图像,可以显示256种灰度级别。
  • Bpp16: 每个像素使用16位,可以是更深的灰度图,或者是用于存储彩色图像的颜色分量之一(如在某些彩色格式中,红色、绿色和蓝色每个分量可能各占16位)。
  • Bpp24 或 Bpp32: 这通常用于彩色图像,其中每个颜色分量(红、绿、蓝)各占8位,32位图像格式可能会包含一个额外的8位用于透明度(alpha通道)。

在工业成像应用中,Bpp的选择对于图像质量和处理效率非常重要,因为它直接影响图像的细节和色彩表达。高Bpp值允许图像包含更多的颜色和亮度级别,从而提供更精确的视觉数据,但也意味着更大的数据大小和处理需求。

编码规则

源码

像素格式指定了图像中每个像素应该如何表示,包括每个像素的组件数量和每个组件的位数等。在Aravis中通过编码可以清晰的表示图像数据的颜色和位深信息,部分定义如下:

//file: arvenums.h
/* Grey pixel formats */
#define	ARV_PIXEL_FORMAT_MONO_8			((ArvPixelFormat) 0x01080001u)
#define ARV_PIXEL_FORMAT_BAYER_GR_8		((ArvPixelFormat) 0x01080008u)/* Color pixel formats */
#define ARV_PIXEL_FORMAT_RGB_8_PACKED		((ArvPixelFormat) 0x02180014u)/* Custom */
#define ARV_PIXEL_FORMAT_CUSTOM_BAYER_GR_12_PACKED  	((ArvPixelFormat) 0x810c0001u)

分析

对于每个PixelFormat,都有唯一一个32位的无符号整数与之对应。

以Mono8为例,其对应的32位无符号整数为:0x01080001,我们从高位向低位看:

  • 0x01:对像素格式的一个分类,Aravis中共分为三类,对应的编号为0x010x020x08。具体的分类准则在后面讨论;
  • 0x08:表示当前PixelFormat对应的Bpp,0x08就对应Bpp8;
  • 0x0001:为像素格式设定的序号。

分类标准

之前本来还想自己推断一下Aravis中对PixelFormat的分类依据,后来我查资料时看到了GenICam Pixel Format Names and Values,这应该是相当于EMVA规定的一个准则吧。对比源码可以发现,Aravis中0x010x02开头的PixelFormat对应的值就是遵循的这个文件的内容。

0x010x02的差别估计就是一个像素点对应的通道数量不同,0x01表示一个像素点上只有一个通道,0x02表示一个像素点上的通道数大于1。至于0x08,应该是Aravis自己定义的一些格式,具体的作用目前不太清楚。

补充

ARV_PIXEL_FORMAT_BIT_PER_PIXEL

在arvenums.h中还定义了一个宏,用于获取像素格式的Bpp:

#define ARV_PIXEL_FORMAT_BIT_PER_PIXEL(pixel_format) (((pixel_format) >> 16) & 0xff)

以Mono8为例,其值为0x01080001,右移16位并与上0xff,获取到第17位到32位:0x08。对应的Bpp就可以被正确解析出来,为8。

参考文章

1.GenICam_SFNC_v2_5
2.GenICam_PFNC_v2_4
3.GenICam Pixel Format Names and Values

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

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

揭秘JavaScript数据世界:一文通晓基本类型和引用类型的精髓!

在编程的世界里,数据是构建一切的基础。就像建筑师需要了解不同材料的强度和特性一样,程序员也必须熟悉各种数据类型。 今天,我们就来深入探讨JavaScript中的数据类型,看看它们如何塑造我们的代码世界。 一、JavaScript数据类型简介 数据类型是计算机语言的基础知识,数据类…

如何将本地项目第一次同步到gitee远程

一,Gitee账号的注册/登录 在gitee登录入口输入相关信息进行注册登录https://gitee.com/signup#lang=zh-CN 二,本地安装git客户端并配置用户信息 1.Git - 安装 Git (git-scm.com)根据提示点击下一步,安装完成后,在本地文件夹右键单击出现git相关指令,表示安装成功2.点击git…

faiss简单测试方法

先把仓库克隆到本地,我这边还需要改cmake环境,在project上面加 set(CMAKE_CUDA_COMPILER /usr/local/cuda-11.8/bin/nvcc) 构建 mkdir buildcmake -B build . 编译,只需要编译faiss这部分就可以,(主目录下有很多测试代码,编译很慢,只编译faiss会快很多) cd build make …

一个库帮你轻松的创建漂亮的.NET控制台应用程序

前言 做过.NET控制台应用程序的同学应该都知道原生的.NET控制台应用程序输出的内容都比较的单调,假如要编写漂亮且美观的控制台输出内容或者样式可能需要花费不少的时间去编写代码和调试。今天大姚给大家分享一个.NET开源且免费的类库帮你轻松的创建漂亮、美观的.NET控制台应用…

华为NPU开发流程点滴

华为NPU开发流程点滴 NPU/CPU集成操作流程图介绍了App使用HUAWEI HiAI DDK的集成流程。IR在线模型构建 IR在线模型构建通过IR单算子根据原始模型中的关系级联,配置权重数据,构建IR模型网络。 离线模型转换 离线模型转换需要将Caffe、TensorFlow、ONNX、MindSpore模型转换为HU…

拉格朗日(Lagrange)中值定理

preamble罗尔中值定理是理解拉格朗日中值定理的基础罗尔中值定理是拉格朗日中值定理的1个特殊情况泰勒中值定理是拉格朗日中值定理的推广cite: 罗尔定理: https://www.cnblogs.com/Preparing/p/18156702definition 若函数\(f(x)\)满足下列条件:\(f(x)\) 在闭区间\([a,b]\)上连…