c++ - 如何用C/C++高效的合成Bayer Raw10数据?

标签 c++ c algorithm image-processing

组成两个原始图像缓冲区:

  1. 拜耳原始数据,每个像素包含 10 位;
  2. 原始缓冲区有 4192x3104 像素
  3. 只需添加相应的位数据即可
  4. 使用 C/C++ 语言
  5. 在 Android 移动平台上

如何有效组合两个原始缓冲区?

现在,我试着这样做:

  1. 从 rawBuf1 和 rawBuf2 读取 8 个像素,因为我可以使用 16 位数组(unsigned short pixelWord[5])和 5 个长度来存储它们(8X10 位 = 5x16 位)
  2. 我喜欢这样:p0 unsigned short p0 = (unsigned short )((pixelWord1[0] & 0X03FF) +(pixelWord2[0] & 0X03FF))

但是上层效率太低了。

最佳答案

像素数据以字节流的形式出现,存储在原始缓冲区中

unsigned char rawBuf1[100], rawBuf2[100];

根据您平台的字节顺序,您可以尝试 bit fields并让编译器弄清楚如何访问像素

struct pixels0 {
    unsigned long long p0 : 10;
    unsigned long long p1 : 10;
    unsigned long long p2 : 10;
    unsigned long long p3 : 10;
    unsigned long long p4 : 10;
    unsigned long long p5 : 10;
};

struct pixels6 {
    unsigned long long pad : 4;
    unsigned long long p6 : 10;
    unsigned long long p7 : 10;
};

你会用这个作为

unsigned short p0 = ((struct pixels0*)&rawBuf1[0])->p0 + ((struct pixels0*)&rawBuf2[0])->p0;
/* ... */
unsigned short p5 = ((struct pixels0*)&rawBuf1[0])->p5 + ((struct pixels0*)&rawBuf2[0])->p5;
unsigned short p6 = ((struct pixels6*)&rawBuf1[7])->p6 + ((struct pixels6*)&rawBuf2[7])->p6;
unsigned short p7 = ((struct pixels6*)&rawBuf1[7])->p7 + ((struct pixels6*)&rawBuf2[7])->p;

但请注意,如果它能工作的话,它高度依赖于平台和编译器。

关于c++ - 如何用C/C++高效的合成Bayer Raw10数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23471671/

相关文章:

c++ - Visual Studio (2015) C 项目依赖项 - 必须定义 LNK1561 入口点

algorithm - 如果任何节点最多有 2 条边,则找出是否形成循环的更快方法?

c++ - 使用我的应用程序控制 Dropbox、Google Drive 和/或 SugarSync。

c - 在 C 中创建新进程时变量的值不会改变

c - 未初始化(排队)就使用的变量

c++ - 从 C++ 角度看 C 中的枚举

algorithm - 从给定长度的数组中排列整数

python - 检查 python 函数从 codewars 中确定等值线图

c++ - 从 GLSL 中的数组初始化结构

C++ - 应用于对象类的 sizeof 函数