我正在使用C++
函数(在我的iOS应用内),其中我有uint8_t*
形式的图像数据。
我使用CVPixelBufferGetBaseAddress()
的{{1}}方法使用代码获取了图像数据:
iOS SDK
我有另一个功能(来自第三方的源),它执行我想要在我的图像数据上使用的一些图像处理功能,但这些功能的图像数据的输入是uint8_t *bPixels = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer);
。 / p>
有没有人知道如何转换呢? 我可以提供哪些其他信息?
使用double**
的类的构造函数原型如下:
double**
答案 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