导入数据时的vtk内存管理

时间:2013-05-28 14:09:27

标签: vtk

我正在使用vtkImageImport将opencv矩阵转换为vtkImageData

vtkImageData* convertImage(const cv::Mat& image)
{
  int width = image.cols;
  int height = image.rows;
  vtkSmartPointer<vtkImageImport> importer = vtkSmartPointer<vtkImageImport>::New();
  importer->SetDataScalarTypeToUnsignedChar();
  importer->SetImportVoidPointer(image.data);
  importer->SetWholeExtent(0,width-1,0, height-1, 0, 0);
  importer->SetDataExtentToWholeExtent();
  importer->Update();
  return importer->GetOutput();
}

在进行此类导入时,我有两个关于如何管理指针和内存的问题。

  1. 导入器是否为创建的vtkImageData创建和分配新数据指针,以便在销毁opencv矩阵时不影响vtk图像。
  2. 一旦导入器被销毁,返回的vtkImageData *是否仍然有效,或者我应该返回一个智能指针以保持引用计数&gt; 0?我的理由是,如果导入器在内部使用智能指针作为vtkImageData,那么图像将在导入器被销毁时被销毁。 VTK示例始终使用与使用数据的范围相同的导入程序。
  3. 谢谢

1 个答案:

答案 0 :(得分:4)

当您要求时,进口商会复印一份。

void vtkImageImport::SetImportVoidPointer (void* ptr, int save);存储您的void*指针而不复制数据,save arg用于ImgImport的析构函数中,如果save为1,则不会删除存储的指针。

void SetImportVoidPointer (void *ptr)使用save=1调用以前的方法,因此在您的代码中,来自CV :: Mat的data不会被销毁。注意:两者都使用相同的指针:修改你的CV :: Mat;进口商的结果会有所不同。

void CopyImportVoidPointer (void *ptr, vtkIdType size);制作数据的副本,在本例中,在内部,ImgImport将复制数据,存储新指针,并在析构函数中删除它。您可以删除您的CV :: Mat,它可能不会影响导入器。

对于第二个问题,我不确定检索输出的内部行为,但是将vtkAlgorithm中的输出存储在vtkSmartPointer中允许您删除算法而不会破坏数据。

vtkSmartPointer<vtkImageData> convertImage(const cv::Mat& image)
{
  int width = image.cols;
  int height = image.rows;
  vtkSmartPointer<vtkImageImport> importer = vtkSmartPointer<vtkImageImport>::New();
  importer->SetDataScalarTypeToUnsignedChar();
  importer->SetImportVoidPointer(image.data);
  importer->SetWholeExtent(0,width-1,0, height-1, 0, 0);
  importer->SetDataExtentToWholeExtent();
  importer->Update();

  vtkSmartPointer<vtkImageData> outp = importer->GetOutput();
  importer->Delete (); // this line cause the destruction of the output, unless it's stored in a smartPointer.

  return outp;
}

Importer-&gt; Delete()就是例如。我尝试了一个基本的例子,我能够使用vtkAlgorithm的输出,而不将输出存储在smartPointer中。 但是阅读Vtk official tutorials(“使用智能指针获取对象”一节),如果不将输出存储在智能指针中,则可以在范围的末尾删除导入器,也可以删除数据。 / p>

这就是我不确定的原因:我仍然可以使用convertImage方法返回的“direct”指针。您必须使用VTK tutos中描述的智能指针。这是确保您的数据有效的最佳方式。

希望有所帮助。