level 2
我的面绘制也慢,似乎只有体绘制能用到gpu么,,,
2018年05月14日 02点05分
4
level 7
。。。500多张DCM,除去读DCM的时间,面绘制最多也就十几秒吧? 你是在release版本下么? 或者你用的远古版本VTK...
2018年06月10日 13点06分
6
不是啊,我用的vtk7,面绘制是从网上找的代码,跑出来就这么慢。。
2018年06月28日 03点06分
我把面绘制打印成stl文件有1G,我也很绝望
2018年06月28日 03点06分
@黑炎de灼息 对STL进行减面啊, vtkDecimatePro
2018年06月29日 02点06分
@黑炎de灼息 你哪找的代码?我有一个60张的图,用了一分钟多,然后把等值面改了,三秒完事。有的人的代码等值线设置有问题。
2018年06月29日 02点06分
level 2
emmmm要能出结果慢一点也没关系啊,楼主你能看看你下面一个我的帖子吗,到现在都没人回答我,我可愁死啦
2018年06月28日 06点06分
7
我在安装时没遇到你这个问题。。
2018年06月29日 06点06分
level 4
// 抽取等值面为骨头的信息
vtkMarchingCubes *boneExtractor = vtkMarchingCubes::New();
boneExtractor->SetInputConnection(reader->GetOutputPort());
boneExtractor->SetValue(0, 1); //设置提取的等值信息
//剔除旧的或废除的数据单元,提高绘制速度
vtkStripper *boneStripper = vtkStripper::New(); //三角带连接
boneStripper->SetInputConnection(boneExtractor->GetOutputPort());
//建立映射
vtkPolyDataMapper *boneMapper = vtkPolyDataMapper::New();
//boneMapper->SetInputc(boneStripper->GetOutput());
boneMapper->SetInputConnection(boneStripper->GetOutputPort());
//建立角色
vtkActor *bone = vtkActor::New();
bone->SetMapper(boneMapper);
bone->GetProperty()->SetDiffuseColor(.1, .94, .52);
bone->GetProperty()->SetSpecular(.3);
bone->GetProperty()->SetSpecularPower(20);
reader->SetDataSpacing(3.2, 3.2, 1.5);
vtkSmartPointer<vtkContourFilter> skinExtractor = vtkSmartPointer<vtkContourFilter>::New();
skinExtractor->SetInputConnection(reader->GetOutputPort());
skinExtractor->SetValue(0, 500);
vtkSmartPointer<vtkPolyDataNormals> skinNormals = vtkSmartPointer<vtkPolyDataNormals>::New();
skinNormals->SetInputConnection(skinExtractor->GetOutputPort());
skinNormals->SetFeatureAngle(60.0);
vtkSmartPointer<vtkPolyDataMapper> skinMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
skinMapper->SetInputConnection(skinNormals->GetOutputPort());
skinMapper->ScalarVisibilityOff();
vtkSmartPointer<vtkActor> skin = vtkSmartPointer<vtkActor>::New();
skin->SetMapper(skinMapper);
//
vtkSmartPointer<vtkOutlineFilter> outlineData = vtkSmartPointer<vtkOutlineFilter>::New();
outlineData->SetInputConnection(reader->GetOutputPort());
vtkSmartPointer<vtkPolyDataMapper> mapOutline = vtkSmartPointer<vtkPolyDataMapper>::New();
mapOutline->SetInputConnection(outlineData->GetOutputPort());
vtkSmartPointer<vtkActor> outline = vtkSmartPointer<vtkActor>::New();
outline->SetMapper(mapOutline);
outline->GetProperty()->SetColor(0, 0, 0);
//
vtkSmartPointer<vtkCamera> aCamera = vtkSmartPointer<vtkCamera>::New();
aCamera->SetViewUp(0, 0, -1);
aCamera->SetPosition(0, 1, 0);
aCamera->SetFocalPoint(0, 0, 0);
aCamera->ComputeViewPlaneNormal();
aCamera->Azimuth(30.0); //New
aCamera->Elevation(30.0);//New
//
m_pRenderer4->AddActor(outline);
m_pRenderer4->AddActor(skin);
m_pRenderer4->SetActiveCamera(aCamera);
m_pRenderer4->ResetCamera();
aCamera->Dolly(1.5);
//
m_pRenderer4->SetBackground(1, 1, 1);// can change
//
m_pRenderer4->ResetCameraClippingRange();
2018年06月29日 07点06分
9
level 1
boneExtractor->SetValue(0, 1); //设置提取的等值信息
骨头的灰度值应该设置成500
2018年07月28日 13点07分
10
好像没什么用。。
2018年08月01日 07点08分
level 1
vtkSmartPointer<vtkVolume> extractVolume(const char *directoryName){ // vtkSmartPointer<vtkVolume> volume=vtkSmartPointer<vtkVolume>::New(); vtkSmartPointer<vtkDICOMImageReader> reader=vtkSmartPointer<vtkDICOMImageReader>::New(); reader->SetDirectoryName(directoryName); reader->Update(); // A ray-cast mapper is needed to do the ray-casting. //vtkSmartPointer<vtkFixedPointVolumeRayCastMapper> volumeMapper=vtkSmartPointer<vtkFixedPointVolumeRayCastMapper>::New(); vtkSmartPointer<vtkGPUVolumeRayCastMapper> volumeMapper=vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New(); volumeMapper->SetInputConnection(reader->GetOutputPort());
// Color transfer function. color for flesh (500-1000), color for bone(1000 and above). vtkSmartPointer<vtkColorTransferFunction> volumeColor=vtkSmartPointer<vtkColorTransferFunction>::New(); volumeColor->AddRGBPoint(0,0.0,0.0,0.0); volumeColor->AddRGBPoint(500,1.0,0.4,0.2); volumeColor->AddRGBPoint(1000,1.0,0.5,0.3); volumeColor->AddRGBPoint(1150,1.0,1.0,0.9);
// Opacity transfer function is used to control the opacity vtkSmartPointer<vtkPiecewiseFunction> volumeScalarOpacity=vtkSmartPointer<vtkPiecewiseFunction>::New(); volumeScalarOpacity->AddPoint(0,0.00); volumeScalarOpacity->AddPoint(500,0.15); volumeScalarOpacity->AddPoint(1000,0.45); volumeScalarOpacity->AddPoint(1150,0.80);
// Gradient function vtkSmartPointer<vtkPiecewiseFunction> volumeGradientOpacity=vtkSmartPointer<vtkPiecewiseFunction>::New(); volumeGradientOpacity->AddPoint(0,0.0); volumeGradientOpacity->AddPoint(90,0.5); volumeGradientOpacity->AddPoint(100,1.0);
// Volume property attaches the color and opacity to the volume vtkSmartPointer<vtkVolumeProperty> volumeProperty=vtkSmartPointer<vtkVolumeProperty>::New(); volumeProperty->SetColor(volumeColor); volumeProperty->SetScalarOpacity(volumeScalarOpacity); volumeProperty->SetGradientOpacity(volumeGradientOpacity); volumeProperty->SetInterpolationTypeToLinear(); volumeProperty->ShadeOn(); volumeProperty->SetAmbient(0.3); volumeProperty->SetDiffuse(0.8); volumeProperty->SetSpecular(0.2);
// The vtkVolume is a vtkProp3D (like a vtkActor) and controls the position and orientation of the volume volume->SetMapper(volumeMapper); volume->SetProperty(volumeProperty); return volume;}
#include "readdicom.h"
int main(int argc,char* argv[]){ if(argc!=2){ std::cout<<" Usage: "<<argv[0]<<" file directory."<<std::endl; return -1; } vtkSmartPointer<vtkVolume> volume=extractVolume(argv[1]); vtkSmartPointer<vtkRenderer> ren=vtkSmartPointer<vtkRenderer>::New(); ren->AddActor(volume);
vtkSmartPointer<vtkRenderWindow> rw=vtkSmartPointer<vtkRenderWindow>::New(); rw->AddRenderer(ren); rw->SetSize(600,600);
vtkSmartPointer<vtkRenderWindowInteractor> iren=vtkSmartPointer<vtkRenderWindowInteractor>::New(); vtkSmartPointer<vtkInteractorStyleTrackballCamera> style=vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New(); iren->SetInteractorStyle(style); iren->SetRenderWindow(rw); iren->Initialize(); iren->Start(); return 0;}
试试vtkGPUVolumeRayCastMapper,这个快
2018年12月24日 14点12分
11
level 1
vtkSmartPointer<vtkPolyData> extractSurfaceUseMarchingCube(const char *directoryName,double value){ // Extract surface from a seris of dicom data use marching cube algorithm vtkSmartPointer<vtkDICOMImageReader> dicomReader=vtkSmartPointer<vtkDICOMImageReader>::New(); dicomReader->SetDirectoryName(directoryName); dicomReader->Update(); // convert the dicom original // cos(xx')=1 ; cos(yy')=-1 ; cos(zz')=-1 double ImagePositionPatient[3]; ImagePositionPatient[0]=dicomReader->GetImagePositionPatient()[0]; ImagePositionPatient[1]=-dicomReader->GetImagePositionPatient()[1]; ImagePositionPatient[2]=-dicomReader->GetImagePositionPatient()[2];
ImagePositionPatient[1]-=dicomReader->GetDataExtent()[3]*dicomReader->GetPixelSpacing()[1]; ImagePositionPatient[2]-=dicomReader->GetDataExtent()[5]*dicomReader->GetPixelSpacing()[2];
// Using maching cubes vtkSmartPointer<vtkMarchingCubes> mc=vtkSmartPointer<vtkMarchingCubes>::New(); mc->SetInputConnection(dicomReader->GetOutputPort()); mc->ComputeNormalsOn(); mc->ComputeGradientsOn(); mc->SetValue(0,value);
// To remain largest region vtkSmartPointer<vtkPolyDataConnectivityFilter> connFilter=vtkSmartPointer<vtkPolyDataConnectivityFilter>::New(); connFilter->SetInputConnection(mc->GetOutputPort()); connFilter->SetExtractionModeToLargestRegion(); connFilter->Update();
// Eliminate the small part vtkSmartPointer<vtkCleanPolyData> cleanFilter=vtkSmartPointer<vtkCleanPolyData>::New(); cleanFilter->SetInputConnection(connFilter->GetOutputPort()); cleanFilter->Update();
// Translate to the original set the ImagePositionPatient point as [0 0 0] vtkSmartPointer<vtkTransform> translate=vtkSmartPointer<vtkTransform>::New(); translate->Translate(ImagePositionPatient);
vtkSmartPointer<vtkTransformFilter> translateFilter=vtkSmartPointer<vtkTransformFilter>::New(); translateFilter->SetTransform(translate); translateFilter->SetInputConnection(cleanFilter->GetOutputPort()); translateFilter->Update();
// Return the polydata vtkSmartPointer<vtkPolyData> surface=vtkSmartPointer<vtkPolyData>::New(); surface->ShallowCopy(translateFilter->GetOutput()); return surface;}
面绘制,使用marching cube算法,比较快,上面发错了,上面是体绘制。
2018年12月24日 14点12分
12