使用ITK过滤器时访问冲突读取位置

时间:2018-05-08 12:33:54

标签: vtk itk

我正在编写一个非常简单的程序:

  • 1 - 使用.vtk

  • 读取itk::MeshFileReader个文件
  • 2 - 使用SquaredEdgeLengthDecimationQuadEdgeMeshFilter

  • 对网格进行抽取

在第2步中,我收到Access violation reading location错误。

某些.vtk文件会发生此崩溃,其他人也不会发生这种情况。

您遇到过这样的错误吗?怎么解决?

2 个答案:

答案 0 :(得分:0)

这听起来像是SquaredEdgeLengthDecimationQuadEdgeMeshFilter中的错误,或者MeshFileReader中不太可能。

您是否尝试过使用最新稳定版release(v4.13)或git master?如果没有,请先尝试。如果问题仍然存在,请在ITK forum上报告问题。

答案 1 :(得分:0)

SquaredEdgeLengthDecimationQuadEdgeMeshFilter需要一个QuadEdge网格输入,它只是可以保存在.vtk文件中的所有可能几何的子集。例如。您可以将非流形存储为.vtk,在这种情况下,当您在其上运行QuadEdgeMes​​hFilter时,您无法获得理智的结果。

我认为一个错误是过滤器没有检查这个前提条件;我认为在这种情况下抛出异常是合适的。

不幸的是我不知道如何检查输入网格是否是有效的输入网格。但是我通过以下方式成功避免了此过滤器中的崩溃:

  • 确保输入只有一个连接的组件(vtkPolyDataConnectivityFilter
  • 在启用PointMerging的情况下使用vtkCleanPolyData进行清理

转换为itk :: QuadEdgeMes​​h并将其提供给SquaredEdgeLengthDecimationQuadEdgeMeshFilter

在Linux上,你可以使用valgrind来检查内存问题,它会指出你在运行过滤器时是否存在内存问题。使用上面两个过滤器的预处理修复了我的表面的内存问题/崩溃,并且valgrind下的运行变得干净。

编辑:下面的代码示例:

#include <vtkPolyDataReader.h>
#include <vtkPolyDataConnectivityFilter.h>
#include <vtkCleanPolyData.h>

#define VTK_CREATE(type, name) vtkSmartPointer<type> name = vtkSmartPointer<type>::New();

...
VTK_CREATE(vtkPolyDataReader, reader);
reader->SetFileName("/tmp/mesh.vtk");

VTK_CREATE(vtkPolyDataConnectivityFilter, connFilter);
connFilter->SetInputConnection(reader->GetOutputPort());
connFilter->SetExtractionModeToLargestRegion();

VTK_CREATE(vtkCleanPolyData, cleaner);
cleaner->SetInputConnection(connFilter->GetOutputPort());
cleaner->SetPointMerging(1);
cleaner->Update();

// Now either convert it to itk::QuadMesh, or if you don't have a converter, just do another I/O
// itk::QuadEdgeMesh<double, 3> MeshType;
// MeshType::Pointer inputItk = PolyDataToItkMesh<MeshType>(cleaner->GetOutput());

VTK_CREATE(vtkPolyDataWriter, writer);
writer->SetInputData(cleaner->GetOutput());
writer->SetFileName("/tmp/mesh_processed.vtk");
writer->Update();