Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 将cv::Mat转换为MTLTexture_Opencv_Image Processing_Ios8_Metal - Fatal编程技术网

Opencv 将cv::Mat转换为MTLTexture

Opencv 将cv::Mat转换为MTLTexture,opencv,image-processing,ios8,metal,Opencv,Image Processing,Ios8,Metal,我当前项目的一个中间步骤需要将opencv的cv::Mat转换为MTLTexture(金属纹理容器)。我需要将浮标存储在垫子中,就像纹理中的浮标一样;我的项目不能承受精度的损失 这是我在这种转换上的尝试 - (id<MTLTexture>)texForMat:(cv::Mat)image context:(MBEContext *)context { id<MTLTexture> texture; int width = image.cols; int he

我当前项目的一个中间步骤需要将opencv的cv::Mat转换为MTLTexture(金属纹理容器)。我需要将浮标存储在垫子中,就像纹理中的浮标一样;我的项目不能承受精度的损失

这是我在这种转换上的尝试

- (id<MTLTexture>)texForMat:(cv::Mat)image context:(MBEContext *)context
{

  id<MTLTexture> texture;
  int width = image.cols;
  int height = image.rows;
  Float32 *rawData = (Float32 *)calloc(height * width * 4,sizeof(float));
  int bytesPerPixel = 4;
  int bytesPerRow = bytesPerPixel * width;
  float r, g, b,a;


  for(int i = 0; i < height; i++)
  {
    Float32* imageData = (Float32*)(image.data + image.step * i);
    for(int j = 0; j < width; j++)
    {
      r = (Float32)(imageData[4 * j]);
      g = (Float32)(imageData[4 * j + 1]);
      b = (Float32)(imageData[4 * j + 2]);
      a = (Float32)(imageData[4 * j + 3]);

      rawData[image.step * (i) + (4 * j)] = r;
      rawData[image.step * (i) + (4 * j + 1)] = g;
      rawData[image.step * (i) + (4 * j + 2)] = b;
      rawData[image.step * (i) + (4 * j + 3)] = a;
    }
  }


  MTLTextureDescriptor *textureDescriptor = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatRGBA16Float
                                                                                               width:width
                                                                                              height:height
                                                                                           mipmapped:NO];
  texture = [context.device newTextureWithDescriptor:textureDescriptor];
  MTLRegion region = MTLRegionMake2D(0, 0, width, height);
  [texture replaceRegion:region mipmapLevel:0 withBytes:rawData bytesPerRow:bytesPerRow];

  free(rawData);
  return texture;
}
-(id)texForMat:(cv::Mat)图像上下文:(MBEContext*)上下文
{
id纹理;
int width=image.cols;
int高度=image.rows;
Float32*rawData=(Float32*)calloc(高*宽*4,sizeof(float));
int字节/像素=4;
int bytesPerRow=bytesPerPixel*宽度;
浮子r,g,b,a;
对于(int i=0;i
但它似乎不起作用。它每次从垫子上读取零,并抛出EXC_BAD_访问。我需要mtlpixelformatrgb16float中的MTLTexture来保持精度


感谢您考虑这个问题。

这里的一个问题是您正在使用Float32加载rawData,但是您的纹理是RGBA16Float,因此数据将被损坏(16Float是Float32大小的一半)。这不应该导致你的崩溃,但这是一个你必须处理的问题


正如“chappjc”所指出的,在写数据时,您使用的是“image.step”,但该缓冲区应该是连续的,并且永远不会有一个不仅仅是(宽度*字节/像素)的步长

我相信
image.step
是以字节为单位的。此外,我认为OpenCV通常使用BGR而不是RGB,所以请检查您的频道顺序。您似乎没有(必要地)以图像的步幅来分配
rawData
。步骤
但您正在使用它来解决它。当然,这两个点都是有效的,但由于我遇到了完全相同的问题,我只需确认-第二点是导致崩溃的原因。当迭代通过
rawData
-例如
rawData[image.step*(i)+(4*j)]=r应该是
rawData[bytesPerRow*i+(4*j)]=r