gpt4 book ai didi

导入数据时的vtk内存管理

转载 作者:行者123 更新时间:2023-12-04 02:55:27 25 4
gpt4 key购买 nike

我正在使用 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();
}

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

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

谢谢

最佳答案

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

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

void SetImportVoidPointer (void *ptr) 使用 save=1 调用之前的方法,因此在您的代码中,data 来自 CV::Mat ,不会被摧毁。注意:两者都使用相同的指针:修改你的 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->Delete() 只是一个例子。我尝试了一个基本示例,并且能够使用 vtkAlgorithm 的输出,而无需将输出存储在 smartPointer 中。但是阅读 Vtk official tutorials (“使用智能指针获取对象”部分),如果您不将输出存储在智能指针中,导入器可能会在范围末尾被删除,数据也会被删除。

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

希望对您有所帮助。

关于导入数据时的vtk内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16794258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com