我正在编写一个非常简单的程序:
1 - 使用.vtk
itk::MeshFileReader
个文件
2 - 使用SquaredEdgeLengthDecimationQuadEdgeMeshFilter
在第2步中,我收到Access violation reading location
错误。
某些.vtk
文件会发生此崩溃,其他人也不会发生这种情况。
您遇到过这样的错误吗?怎么解决?
答案 0 :(得分:0)
这听起来像是SquaredEdgeLengthDecimationQuadEdgeMeshFilter
中的错误,或者MeshFileReader中不太可能。
您是否尝试过使用最新稳定版release(v4.13)或git master?如果没有,请先尝试。如果问题仍然存在,请在ITK forum上报告问题。
答案 1 :(得分:0)
SquaredEdgeLengthDecimationQuadEdgeMeshFilter
需要一个QuadEdge网格输入,它只是可以保存在.vtk文件中的所有可能几何的子集。例如。您可以将非流形存储为.vtk,在这种情况下,当您在其上运行QuadEdgeMeshFilter时,您无法获得理智的结果。
我认为一个错误是过滤器没有检查这个前提条件;我认为在这种情况下抛出异常是合适的。
不幸的是我不知道如何检查输入网格是否是有效的输入网格。但是我通过以下方式成功避免了此过滤器中的崩溃:
vtkPolyDataConnectivityFilter
)vtkCleanPolyData
进行清理转换为itk :: QuadEdgeMesh并将其提供给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();