我正在使用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();
}
在进行此类导入时,我有两个关于如何管理指针和内存的问题。
谢谢
答案 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中描述的智能指针。这是确保您的数据有效的最佳方式。
希望有所帮助。