C++将uTI8*T*图像数据转换为双**图像数据 我正在我的iOS应用程序中使用C++函数,我的图片数据是UTI8*T**./P>

C++将uTI8*T*图像数据转换为双**图像数据 我正在我的iOS应用程序中使用C++函数,我的图片数据是UTI8*T**./P>,c++,iphone,image,image-processing,C++,Iphone,Image,Image Processing,我使用iOS SDK的CVPixelBufferGetBaseAddress方法获得了图像数据: 我有另一个来自第三方源的函数,它执行我想在图像数据上使用的一些图像处理函数,但是这些函数的图像数据输入是double** 有人知道如何转换这个吗? 我还可以提供哪些其他信息 使用双**的类的构造函数原型如下所示: Image(double **iPixels, unsigned int iWidth, unsigned int iHeight); 您的uint8_t*b像素似乎将图像数据保存为高度

我使用iOS SDK的CVPixelBufferGetBaseAddress方法获得了图像数据:

我有另一个来自第三方源的函数,它执行我想在图像数据上使用的一些图像处理函数,但是这些函数的图像数据输入是double**

有人知道如何转换这个吗? 我还可以提供哪些其他信息

使用双**的类的构造函数原型如下所示:

Image(double **iPixels, unsigned int iWidth, unsigned int iHeight);
您的uint8_t*b像素似乎将图像数据保存为高度*宽度长度的一维连续数组。因此,要访问第x行和第y列中的像素,必须写入bPixels[x*width+y]

这个图像似乎适用于二维数组。要访问如上所述的像素,您必须写入iPixels[x][y]

因此,您需要将现有的一维数组复制到二维数组:

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
}

注意:除了最终需要的规范化问题之外,还有一个索引兼容性问题!我的示例假设一维数组是逐行存储的,而处理二维索引的函数使用[x][y]表示先行后列。然而,Image的声明可能会导致这样的结论,即它可能需要用[y][x]对其数组进行索引。

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

猜测1图像构造器需要一个双维数组,其中每个分量都是按该顺序排列的R、G、B、Alpha通道。所以iPixels[0]是红色数据,iPixels[1]是绿色数据,等等

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

猜测3所有这些都必须预先分配

猜测4图像数据是行主数据

猜测5源数据是BRGA

考虑到这一点,从Bpixel开始

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

您需要提供有关图像期望如何合成双像素的更多信息。它可以是多种不同的格式。此外,imageBuffer可以有多种格式,尽管到目前为止您的代码表明它的编码为每像素32位。CVPixelBufferCreate将使用像素格式调用。
uint8_t **mypixels = new uint8_t* [height];
for (int x=0; x<height; x++)
    mypixels[x] = bPixels+x*width;
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);