关于vtk模型简化vtkDecimatePro和vtkQuadricDecimation的问题
vtk吧
全部回复
仅看楼主
level 4
萌新又来提问了[委屈],我做的一个读取ct文件三维重建输出.obj的3d模型现在需要将模型优化到一定大小,我首先用了vtkDecimatePro类进行简化,但效果不太好,就改用效果比较好的vtkQuadricDecimation类,然而出现如下问题:
二楼附上源码。
2017年04月10日 12点04分 1
level 4
我调试了一下发现这个程序异常终止在vtkexporter的writer()上,但当我将vtkQuadricDecimation换成vtkDecimationPro就正常运行:
vtkSmartPointer<vtkDICOMImageReader>Reader = vtkSmartPointer<vtkDICOMImageReader>::New();
Reader->SetDataByteOrderToLittleEndian();
Reader->SetDirectoryName(ctFile.c_str());
Reader->SetDataSpacing(3.2, 3.2, 1.5);
Reader->Update()
vtkSmartPointer<vtkMarchingCubes>marchingcube = vtkSmartPointer<vtkMarchingCubes>::New();
marchingcube->SetInputConnection(Reader->GetOutputPort());
marchingcube->SetValue(0, ctValue);
vtkSmartPointer<vtkQuadricDecimation> deci = vtkSmartPointer<vtkQuadricDecimation>::New(); //替换成vtkDecimationPro算法就正常运行: deci->SetInputConnection(marchingcube->GetOutputPort());
deci->SetTargetReduction(reduct);
vtkSmartPointer<vtkSmoothPolyDataFilter> smooth = vtkSmartPointer<vtkSmoothPolyDataFilter>::New();
smooth->SetInputConnection(deci->GetOutputPort());
smooth->SetNumberOfIterations(100);
vtkSmartPointer<vtkPolyDataNormals> skinNormals = vtkSmartPointer<vtkPolyDataNormals>::New();//绘制法线
skinNormals->SetInputConnection(smooth->GetOutputPort());
vtkSmartPointer<vtkStripper>skinStripper = vtkSmartPointer<vtkStripper>::New(); //三角带连接
skinStripper->SetInputConnection(skinNormals->GetOutputPort());
vtkSmartPointer<vtkPolyDataMapper> skinMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
skinMapper->SetInputConnection(skinStripper->GetOutputPort());
skinMapper->ScalarVisibilityOff();
vtkSmartPointer<vtkActor> skin =
vtkSmartPointer<vtkActor>::New();
skin->SetMapper(skinMapper);
vtkSmartPointer<vtkRenderer> aRenderer = vtkSmartPointer<vtkRenderer>::New();
aRenderer->AddActor(skin);
vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer(aRenderer);
vtkSmartPointer<vtkRenderWindowInteractor> iren =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
iren->SetRenderWindow(renWin);
vtkSmartPointer<vtkOBJExporter> porter = vtkSmartPointer<vtkOBJExporter>::New();
porter->SetFilePrefix(outputFile.c_str());
porter->SetInput(renWin);
porter->Write() //在这里异常终止
iren->Initialize();
iren->Start();
萌新刚学,啥也不懂,求指教[委屈]
2017年04月10日 12点04分 2
level 4
别沉啊
[泪]
2017年04月10日 12点04分 3
level 4
@rabbitbride 吧主我又要求救了
2017年04月10日 12点04分 4
level 12
vtkQuadricDecimation
不要用这个~
2017年04月11日 04点04分 5
吧主好久没有出现了
2017年04月11日 09点04分
那吧主如果我一定要用的话怎么办,我目前的项目要求我生成的模型又要小(大概五万面),又不至于失真,所以我才想用这个算法
2017年04月11日 23点04分
vtkDecimationPro优化出来模型的实在太烂了
2017年04月11日 23点04分
请问,我想调整点云分辨率,比如使点数缩小至之前的1/2,我应该怎么做,vtkDecimatePro能做到吗?代码如何写,文件如下,刚开始学vtk,谢谢。
2017年11月23日 06点11分
level 6
楼主,我也遇到了这个蛋疼的问题,你要是解决了麻烦贴出来啊。
2017年04月11日 09点04分 6
用vtkQuadricClustering,里面有一个设置XYZ的值的函数,三个设一样的值,值越小优化越高,具体的函数名你查一下。
2017年04月12日 12点04分
@贴吧用户_0MZNCZS 楼主您要是方便的话,麻烦发一下这部分的源码行吗[email protected],不胜感激了!
2017年04月12日 13点04分
@flowers🌸 <vtkSmartPoint>vtkQuadricClustering deci=<vtkSmartPoint>::New(); deci->SetNumberOfXDivisions (35);deci->SetNumberOfYDivisions (35);deci->SetNumberOfZDivisions (35);deci->SetInputConnect(*->Getoutputport());
2017年04月12日 23点04分
@flowers🌸 手写的,漏了一点,应该能补齐吧,我没电脑不方便粘源码。[阴险]
2017年04月12日 23点04分
level 7
内存不足,64位估计没有问题吧
2017年04月19日 12点04分 7
level 3
@rabbitbride 请问,我想调整点云分辨率,比如使点数缩小至之前的1/2,我应该怎么做,vtkDecimatePro能做到吗?代码如何写,文件如下,刚开始学vtk,非常谢谢。
2017年11月23日 06点11分 9
1