如何将 cv::Mat 转换为 vtkImageData?

luc*_*hli 6 c++ opencv vtk

如何在 C++ 中有效地从 a 转换cv::Mat为 a vtkImageData?我寻找一种适用于 BW 和 COLOR 图像的方法。

小智 4

以下是@lucasahli 的上述答案的简化版本。它使用高效的 memcpy 而不是双 for 循环。

注意:对于彩色图像,您可能需要将图像通道从 bgr 顺序翻转为 rgb 顺序,我使用mixChannels来实现。

vtkSmartPointer<vtkImageData> OpenCVToVtkConverter::convertCVMatToVtkImageData(const cv::Mat &sourceCVImage, bool flipOverXAxis) {
  vtkSmartPointer<vtkImageData> outputVtkImage = vtkSmartPointer<vtkImageData>::New();

  int numOfChannels = sourceCVImage.channels();

  // dimension set to 1 for z since it's 2D
  outputVtkImage->SetDimensions(sourceCVImage.cols, sourceCVImage.rows, 1);

  // NOTE: if your image isn't uchar for some reason you'll need to change this type
  outputVtkImage->AllocateScalars(VTK_UNSIGNED_CHAR, numOfChannels);

  // the flipped image data gets put into tempCVImage
  cv::Mat tempCVImage;
  if(flipOverXAxis){ // Normally you should flip the image!
    cv::flip(sourceCVImage, tempCVImage, 0);
  }
  else {
    tempCVImage = sourceCVImage;
  }

  // the number of byes in the cv::Mat, assuming the data type is uchar
  size_t byte_count = sourceCVImage.cols * sourceCVImage.rows * numOfChannels * sizeof(unsigned char);

  // copy the internal cv::Mat data into the vtkImageData pointer
  memcpy(outputVtkImage->GetScalarPointer(), tempCVImage.data, byte_count);

  outputVtkImage->Modified();
  return outputVtkImage;
}
Run Code Online (Sandbox Code Playgroud)