1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > vtk 的vtkimagereslice实现三视图的显示

vtk 的vtkimagereslice实现三视图的显示

时间:2021-07-15 07:26:42

相关推荐

vtk 的vtkimagereslice实现三视图的显示

获取一个三维物体在某个特定点的三视图可以使用vtk的vtkImageReslice实现.首先是定义一些变量,初始化信息。在.h中定义。

vtkSmartPointer<vtkXMLImageDataReader> pXMLImageDataReader = vtkSmartPointer<vtkXMLImageDataReader>::New();vtkSmartPointer<vtkImageCast> pImageCast = vtkSmartPointer<vtkImageCast>::New();vtkSmartPointer<vtkImageReslice> pImageResliceX = vtkSmartPointer<vtkImageReslice>::New();vtkSmartPointer<vtkImageReslice> pImageResliceY = vtkSmartPointer<vtkImageReslice>::New();vtkSmartPointer<vtkImageReslice> pImageResliceZ = vtkSmartPointer<vtkImageReslice>::New();vtkSmartPointer<vtkImageMapToColors> pImageMapToColorsX = vtkSmartPointer<vtkImageMapToColors>::New();vtkSmartPointer<vtkImageMapToColors> pImageMapToColorsY = vtkSmartPointer<vtkImageMapToColors>::New();vtkSmartPointer<vtkImageMapToColors> pImageMapToColorsZ = vtkSmartPointer<vtkImageMapToColors>::New();vtkSmartPointer<vtkWindowLevelLookupTable>pWindowLevelLookupTable = vtkSmartPointer<vtkWindowLevelLookupTable>::New();vtkSmartPointer<vtkImageActor> pImageActorX = vtkSmartPointer<vtkImageActor>::New();vtkSmartPointer<vtkImageActor> pImageActorY = vtkSmartPointer<vtkImageActor>::New();vtkSmartPointer<vtkImageActor> pImageActorZ = vtkSmartPointer<vtkImageActor>::New();vtkSmartPointer<vtkRenderer> pRendererX = vtkSmartPointer<vtkRenderer>::New();vtkSmartPointer<vtkRenderer> pRendererY = vtkSmartPointer<vtkRenderer>::New();vtkSmartPointer<vtkRenderer> pRendererZ = vtkSmartPointer<vtkRenderer>::New();vtkSmartPointer<vtkRenderWindow> pRenderWindow = vtkSmartPointer<vtkRenderWindow>::New();

定义一个函数,显示四视图(包括原始三维物体)。Show4DView().

Show4DView(){pXMLImageDataReader->SetFileName("imagedata22stl.vti");pXMLImageDataReader->Update();//三视图int extent[6]; double spacing[3]; double origin[3];pXMLImageDataReader->GetUpdateExtent(extent); pXMLImageDataReader->GetOutput()->GetSpacing(spacing); pXMLImageDataReader->GetOutput()->GetOrigin(origin); // 计算中心位置。double center[3]; center[0] = origin[0] + spacing[0] * 0.5 * (extent[0] + extent[1]); center[1] = origin[1] + spacing[1] * 0.5 * (extent[2] + extent[3]); center[2] = origin[2] + spacing[2] * 0.5 * (extent[4] + extent[5]);centers[0] = center[0];centers[1] = center[1];centers[2] = center[2];pWindowLevelLookupTable->SetWindow(200); pWindowLevelLookupTable->SetLevel(100);pImageCast->SetInputConnection(pXMLImageDataReader->GetOutputPort());pImageCast->SetOutputScalarTypeToChar();pImageCast->ClampOverflowOn();pImageCast->Update();pImageCast->SetUpdateExtentToWholeExtent();//xpImageResliceX->SetInputConnection(pImageCast->GetOutputPort());pImageResliceX->SetOutputDimensionality(2);pImageResliceX->SetResliceAxesDirectionCosines(sagittalX, sagittalY, sagittalZ);pImageResliceX->SetResliceAxesOrigin(center);pImageResliceX->SetInterpolationModeToLinear();pImageResliceX->Update();//pImageMapToColorsX->SetLookupTable(pWindowLevelLookupTable);//pImageMapToColorsX->SetInputConnection(pImageResliceX->GetOutputPort());pImageActorX->SetInputData(pImageResliceX->GetOutput());pImageActorX->SetPosition(0,0,0);pImageActorX->Update();//ypImageResliceY->SetInputConnection(pImageCast->GetOutputPort());pImageResliceY->SetOutputDimensionality(2);pImageResliceY->SetResliceAxesDirectionCosines(coronalX, coronalY, coronalZ);pImageResliceY->SetResliceAxesOrigin(center);pImageResliceY->SetInterpolationModeToLinear();pImageResliceY->Update();pImageActorY->SetInputData(pImageResliceY->GetOutput());pImageActorY->SetPosition(0,0,0);pImageActorY->Update();//pImageMapToColorsX->SetLookupTable(pWindowLevelLookupTable);//pImageMapToColorsX->SetInputConnection(pImageResliceX->GetOutputPort());//zpImageResliceZ->SetInputConnection(pImageCast->GetOutputPort());pImageResliceZ->SetOutputDimensionality(2);pImageResliceZ->SetResliceAxesDirectionCosines(axialX, axialY, axialZ);pImageResliceZ->SetResliceAxesOrigin(center);pImageResliceZ->SetInterpolationModeToLinear();pImageResliceZ->Update();pImageActorZ->SetInputData(pImageResliceZ->GetOutput());pImageActorZ->SetPosition(0,0,0);pImageActorZ->Update();//pImageMapToColorsX->SetLookupTable(pWindowLevelLookupTable);//pImageMapToColorsX->SetInputConnection(pImageResliceX->GetOutputPort());pDataSetMapper->SetInputConnection(pXMLImageDataReader->GetOutputPort());pActor->SetMapper(pDataSetMapper);float fOpac = 0.5;pActor->GetProperty()->SetOpacity(fOpac);//绘制圆锥代表相机。vtkSmartPointer<vtkConeSource> pConeSource = vtkSmartPointer<vtkConeSource>::New();pConeSource->SetHeight(10.0);pConeSource->SetRadius(5.0);pConeSource->Update();vtkSmartPointer<vtkPolyDataMapper> mappers = vtkSmartPointer<vtkPolyDataMapper>::New();mappers->SetInputData(pConeSource->GetOutput());vtkSmartPointer<vtkActor> actors = vtkSmartPointer<vtkActor>::New();actors->SetMapper(mappers);actors->GetProperty()->SetColor(1,0,0);pRendererX->AddActor(pImageActorX);pRendererY->AddActor(pImageActorY);pRendererZ->AddActor(pImageActorZ);pRenderer->AddActor(pActor);pRenderer->AddActor(actors);vtkMyCallback *mo1 = vtkMyCallback::New();mo1->pImageReslicex = pImageResliceX;mo1->pImageReslicey = pImageResliceY;mo1->pImageReslicez = pImageResliceZ;mo1->rwin=pRenderWindow;mo1->fopac = fOpac;actors->AddObserver(vtkCommand::ModifiedEvent,mo1);pRenderer->SetBackground(1,1,1);pRendererX->SetBackground(0,0,0);pRendererY->SetBackground(0,0,0);pRendererZ->SetBackground(0,0,0);pRenderer->SetViewport( 0, 0 , 0.6, 1 );pRendererX->SetViewport( 0.6, 0.66, 1, 1 );pRendererY->SetViewport(0.6,0.33,1,0.66);pRendererZ->SetViewport(0.6,0,1,0.33);pRenderWindow->AddRenderer(pRendererX);pRenderWindow->AddRenderer(pRendererY);pRenderWindow->AddRenderer(pRendererZ);pRenderWindow->AddRenderer(pRenderer);pRenderWindowInteractor->SetRenderWindow(pRenderWindow);pRenderWindow->Render();for (int i=0;i<10;i++){center[0]++; center[1]++;center[2]++;actors->SetPosition(i*10,i*10,i*10);Sleep(1000);}pRenderWindowInteractor->Initialize();pRenderWindowInteractor->Start();}

其中的回调函数是为了实现实时显示三视图的功能,只是一个demo。

回调函数:

static double centers[3]={0,0,0};static int nCount = 0;class vtkMyCallback : public vtkCommand{public:static vtkMyCallback *New(){return new vtkMyCallback;}virtual void Execute(vtkObject *caller, unsigned long, void*) {//将传入参数强制转换成render类型 vtkActor *actor = reinterpret_cast<vtkActor*>(caller);//actor->GetProperty()->SetOpacity(fopac);//然后输出相机的位置信息nCount++;centers[0] += 10;centers[1] += 10;centers[2] += 10;pImageReslicex->SetResliceAxesOrigin(centers);pImageReslicey->SetResliceAxesOrigin(centers);pImageReslicez->SetResliceAxesOrigin(centers);pImageReslicex->Update();pImageReslicey->Update();pImageReslicez->Update();rwin->Render();}public:vtkMyCallback():rwin(0){pImageReslicex=NULL;pImageReslicey=NULL;pImageReslicez=NULL;}vtkRenderWindow *rwin;float fopac;vtkImageReslice* pImageReslicex;vtkImageReslice* pImageReslicey;vtkImageReslice* pImageReslicez;};

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。