C ++ - 将uint8_t *图像数据转换为双倍**图像数据

时间:2014-01-19 00:04:44

标签: c++ iphone image image-processing

我正在使用C++函数(在我的iOS应用内),其中我有uint8_t*形式的图像数据。

我使用CVPixelBufferGetBaseAddress()的{​​{1}}方法使用代码获取了图像数据:

iOS SDK

我有另一个功能(来自第三方的源),它执行我想要在我的图像数据上使用的一些图像处理功能,但这些功能的图像数据的输入是uint8_t *bPixels = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer); 。 / p>

有没有人知道如何转换呢? 我可以提供哪些其他信息?

使用double**的类的构造函数原型如下:

double**

2 个答案:

答案 0 :(得分:0)

您的uint8_t *bPixels似乎将图像数据保存为height*width长度的1维连续数组。因此,要访问第x行和第y列中的像素,您必须编写bPixels[x*width+y]

Image()似乎适用于二维数组。要访问上面的像素,您必须编写iPixels[x][y]

所以你需要将现有的1维数组复制到2维:

double **mypixels = new double* [height];
for (int x=0; x<height; x++)
{
    mypixels[x] = new double [width];
    for (int y=0; y<width; y++)
        mypixels[x][y] = bPixels[x*width+y]; // attention here, maybe normalization is necessary
                                             // e.g. mypixels[x][y] = bPixels[x*width+y] / 255.0
}

因为您的1维数组具有uint8_t类型的像素和类型为double的2维像素,所以必须分配新内存。否则,如果两者都具有相同的像素类型,则更优雅的解决方案(简单的地图)将是:

uint8_t **mypixels = new uint8_t* [height];
for (int x=0; x<height; x++)
    mypixels[x] = bPixels+x*width;

注意:除了最终必要的规范化问题之外,index兼容性也存在问题!我的例子假设一维数组存储在逐行中,并且函数用[x][y]处理二维索引(这意味着第一行 - 然后-column )。然而,Image()的声明可能会得出结论,它需要将其数组编入索引[y][x]

答案 1 :(得分:0)

我将在这里采取一大堆猜测,希望这会引导您获取文档并回答。如果没有进一步的文档,那么这是一个起点。

猜测1)Image构造函数需要一个双维数组,其中每个组件按此顺序为R,G,B,Alpha通道。所以iPixels [0]是红色数据,iPixels [1]是绿色数据等。

猜猜2)因为它不是整数数据,所以值的范围是0到1.

猜猜3)所有这一切都必须预先分配。

猜猜4)图像数据是行主要的

猜猜5)源数据是BRGA

考虑到这一点,从bPixels开始

double *redData = new double[width*height];
double *greenData = new double[width*height];
double *blueData = new double[width*height];
double *alphaData = new double[width*height];
double **iPixels = new double*[4];

iPixels[0] = redData;
iPixels[1] = greenData;
iPixels[2] = blueData;
iPixels[3] = alphaData;

for(int y = 0;y < height;y++)
{  
   for(int x = 0;x < width;x++)
   {
      int alpha = bPixels[(y*width + x)*4 + 3];
      int red = bPixels[(y*width +x)*4 + 2];
      int green = bPixels[(y*width + x)*4 + 1];
      int blue = bPixels[(y*width + x)*4];

      redData[y*width + x] = red/255.0;
      greenData[y*width + x] = green/255.0;
      blueData[y*width + x] = blue/255.0;
      alphaData[y*width + x] = alpha/255.0;
   }
 }

 Image newImage(iPixels,width,height);

一些可能出错的事情。

源不是BGRA而是RGBA,它会使颜色全部错误。 不是行主要或目的地不在切片中,这会使事情看起来全部搞砸了和/或seg-fault