3

私の現在のプロジェクトの中間ステップでは、opencv の cv::Mat を Metal のテクスチャ コンテナである 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;
}

しかし、それは機能していないようです。Mat から毎回ゼロを読み取り、EXC_BAD_ACCESS をスローします。精度を維持するには、MTLPixelFormatRGBA16Float の MTLTexture が必要です。

この問題を検討していただきありがとうございます。

4

1 に答える 1