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();

	//x

	pImageResliceX->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();


	//y

	pImageResliceY->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());

	//z

	pImageResliceZ->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;
};

發佈了37 篇原創文章 · 獲贊 19 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章