level 12
1、include
#include"vtkRenderer.h"
#include"vtkRenderWindow.h"
#include"vtkRenderWindowInteractor.h"
//#include "vtkWin32OpenGLRenderWindow.h"
//#include "vtkWin32RenderWindowInteractor.h"
#include"vtkDICOMImageReader.h"
#include"vtkOutlineFilter.h"
#include"vtkPolyDataMapper.h"
#include"vtkActor.h"
#include"vtkImagePlaneWidget.h"
#include"vtkCellPicker.h"
#include"vtkProperty.h"
#include"vtkImageMapToColors.h"
#include"vtkImageActor.h"
#include"vtkCamera.h"
#include"vtkCommand.h"
#include"vtkVolume16Reader.h"
#include"vtkSliderWidget.h"
#include"vtkSliderRepresentation2D.h"
#include<vtkAxesActor.h>
#include<vtkTransform.h>
#include<vtkSmartPointer.h>
2017年03月15日 04点03分
3
level 12
2、回调
class vtkSliderCallback :public vtkCommand
{
public:static vtkSliderCallback *New()
{
returnnew vtkSliderCallback;
}
virtualvoidExecute(vtkObject *caller,unsignedlong,void*)
{
vtkSliderWidget *sliderWidget = reinterpret_cast<vtkSliderWidget*>(caller);
if(!sliderWidget)return;int value =static_cast<int>(static_cast<vtkSliderRepresentation *>(sliderWidget->GetRepresentation())->GetValue());
if(this->WidgetX){this->WidgetX->SetSliceIndex(value);}
elseif(this->WidgetY){this->WidgetY->SetSliceIndex(value);}
elseif(this->WidgetZ){this->WidgetZ->SetSliceIndex(value);}
}
2017年03月15日 04点03分
4
level 12
3、再回调
class vtkWidgetWindowLevelCallback :public vtkCommand
{public:static vtkWidgetWindowLevelCallback *New()
{
returnnew vtkWidgetWindowLevelCallback;
}
voidExecute( vtkObject *caller,unsignedlong vtkNotUsed(event),void*callData ){
vtkImagePlaneWidget*self=reinterpret_cast< vtkImagePlaneWidget*>(caller);
if(!self)return;
double* wl =static_cast<double*>( callData );
if(self==this->WidgetX)
{this->WidgetY->SetWindowLevel(wl[0],wl[1]);
this->WidgetZ->SetWindowLevel(wl[0],wl[1]);
}
elseif(self==this->WidgetY)
{this->WidgetX->SetWindowLevel(wl[0],wl[1]);
this->WidgetZ->SetWindowLevel(wl[0],wl[1]);}
elseif(self==this->WidgetZ)
{this->WidgetX->SetWindowLevel(wl[0],wl[1]);
this->WidgetY->SetWindowLevel(wl[0],wl[1]);}}
vtkWidgetWindowLevelCallback():WidgetX(0),WidgetY(0),WidgetZ(0){}
vtkImagePlaneWidget*WidgetX;
vtkImagePlaneWidget*WidgetY;
vtkImagePlaneWidget*WidgetZ;
};
2017年03月15日 04点03分
5
level 12
4、读取
int main()
{/
//文件读取的操作
//vtkDICOMImageReader *pReader = vtkDICOMImageReader::New();
//pReader->SetDataByteOrderToLittleEndian();
//pReader->SetDirectoryName( "d:\\neck" );
//pReader->Update();
vtkVolume16Reader* pReader = vtkVolume16Reader::New();
pReader->SetDataDimensions(64,64);
pReader->SetDataByteOrderToLittleEndian();
pReader->SetImageRange(1,93);
pReader->SetDataSpacing(3.2,3.2,1.5);
pReader->SetFilePrefix("D:\\VTKITK\\vtkdata-5.6.0\\Data\\headsq\\quarter");
pReader->SetDataMask(0x7fff);
pReader->Update();
2017年03月15日 04点03分
6
level 12
5、
vtkOutlineFilter *DicomOutline= vtkOutlineFilter::New();
DicomOutline->SetInputConnection( pReader->GetOutputPort());
vtkPolyDataMapper *pMapper = vtkPolyDataMapper::New();
pMapper->SetInputConnection(DicomOutline->GetOutputPort());
vtkActor *DicomActor= vtkActor::New();
DicomActor->SetMapper( pMapper );
vtkRenderer *ren = vtkRenderer::New();
vtkRenderer *ren1 = vtkRenderer::New();
vtkRenderer *ren2 = vtkRenderer::New();
vtkRenderer *ren3 = vtkRenderer::New();
vtkRenderWindow *renWin = vtkRenderWindow::New();
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
renWin->AddRenderer( ren1 );
renWin->AddRenderer( ren2 );
renWin->AddRenderer( ren3 );
renWin->AddRenderer( ren );
iren->SetRenderWindow(renWin);
2017年03月15日 04点03分
7
level 12
6、这里只给出一个面,另外两个面类似
vtkCellPicker *picker = vtkCellPicker::New();
picker->SetTolerance(0.005);
vtkImagePlaneWidget *planeWidgetX = vtkImagePlaneWidget::New();
planeWidgetX->SetInteractor( iren );
planeWidgetX->SetKeyPressActivationValue('x');
planeWidgetX->SetPicker( picker );
planeWidgetX->RestrictPlaneToVolumeOn();
planeWidgetX->GetPlaneProperty()->SetColor(0.0,0.0,1.0);
planeWidgetX->DisplayTextOn();
//planeWidgetX->TextureInterpolateOn();
planeWidgetX->TextureInterpolateOff();
planeWidgetX->SetResliceInterpolateToLinear();
planeWidgetX->SetInput( (vtkDataSet*)pReader->GetOutput() );
planeWidgetX->SetPlaneOrientationToXAxes();//冠
planeWidgetX->SetSliceIndex( 32 );
planeWidgetX->GetTexturePlaneProperty()->SetOpacity( 1 );
planeWidgetX->On();
2017年03月15日 04点03分
8
level 12
7、
//////////////////////////////////////////////////////
vtkWidgetWindowLevelCallback *cbk = vtkWidgetWindowLevelCallback::New();
cbk->WidgetX = planeWidgetX;
cbk->WidgetY = planeWidgetY;
cbk->WidgetZ = planeWidgetZ;
planeWidgetX->AddObserver( vtkCommand::EndWindowLevelEvent, cbk );
planeWidgetY->AddObserver( vtkCommand::EndWindowLevelEvent, cbk );
planeWidgetZ->AddObserver( vtkCommand::EndWindowLevelEvent, cbk );
cbk->Delete();
//////////////////////////////////////////////////////
vtkSliderRepresentation2D *sliderRep1 = vtkSliderRepresentation2D::New();
sliderRep1->SetMinimumValue(1);
sliderRep1->SetMaximumValue(50);
sliderRep1->SetValue(planeWidgetX->GetSliceIndex());
sliderRep1->GetPoint1Coordinate()->SetCoordinateSystemToNormalizedDisplay();
sliderRep1->GetPoint1Coordinate()->SetValue(.0 ,.02);
sliderRep1->GetPoint2Coordinate()->SetCoordinateSystemToNormalizedDisplay();
sliderRep1->GetPoint2Coordinate()->SetValue(1.0, .02);
vtkSliderWidget *sliderWidget1= vtkSliderWidget::New();
sliderWidget1->SetInteractor(iren);
sliderWidget1->SetRepresentation(sliderRep1);
sliderWidget1->SetAnimationModeToAnimate();
sliderWidget1->EnabledOn();
vtkSliderCallback *slidercbk = vtkSliderCallback::New();
slidercbk->WidgetX= planeWidgetX;
sliderWidget1->AddObserver(vtkCommand::InteractionEvent,slidercbk);
2017年03月15日 04点03分
9
level 12
8、这里只给出一个面,另外两个面类似
//增加2D图像测试获取切片
vtkImageMapToColors *colorMap1 = vtkImageMapToColors::New();
colorMap1->PassAlphaToOutputOff(); //use in RGB
AcolorMap1->SetActiveComponent( 0 );
colorMap1->SetOutputFormatToLuminance();
colorMap1->SetInput( (vtkDataSet*)planeWidgetX->GetResliceOutput() );
colorMap1->SetLookupTable( (vtkScalarsToColors *)planeWidgetX->GetLookupTable() );
vtkImageActor *imageActor1 = vtkImageActor::New();
imageActor1->PickableOff();
imageActor1->SetInput( colorMap1->GetOutput() );
2017年03月15日 04点03分
10
level 12
9、
vtkSmartPointer<vtkTransform> transform =vtkSmartPointer<vtkTransform>::New();
transform->Translate(-10.0, -10.0, -10.0);
vtkSmartPointer<vtkAxesActor> axes =vtkSmartPointer<vtkAxesActor>::New();
axes->SetUserTransform(transform);
ren->AddActor(axes);
2017年03月15日 04点03分
11
level 12
10
ren->AddActor(DicomActor);//outline
ren1->AddActor( imageActor1 );
ren2->AddActor( imageActor2 );
ren3->AddActor( imageActor3 );
// OK
ren->SetBackground( 0.1, 0.1, 0.2 );
ren1->SetBackground( 0.1, 0.2, 0.1 );
ren2->SetBackground( 0.2, 0.1, 0.2 );
ren3->SetBackground( 0.2, 0.2, 0.2 );
renWin->SetSize(600,400);
//renWin->SetFullScreen(1);
ren3->SetViewport(0,0.5,0.5,1);
ren1->SetViewport(0.5,0.5,1,1);
ren2->SetViewport(0,0,0.5,0.5);
ren->SetViewport(0.5,0,1,0.5);
ren->GetActiveCamera()->Dolly(1.15);
ren1->GetActiveCamera()->Dolly(1.15);
ren2->GetActiveCamera()->Dolly(1.15);
ren3->GetActiveCamera()->Dolly(1.15);
ren->ResetCamera();
ren1->ResetCamera();
ren2->ResetCamera();
ren3->ResetCamera();
iren->Initialize();
renWin->SetWindowName("vtkSuperViewer by winston");
iren->Start();
renWin->Render();
//return 0;
}
2017年03月15日 04点03分
12
level 7
当我把这一句imageActor1->SetInputData( colorMap1->GetOutput() )改成imageActor1->SetInputData(planeWidgetY->GetResliceOutput())的时候 就能显示出图像来,但还是要重新手动调整相机的距离 这是为什么啊,我用的是vtkdicomreader读的DICOM图像
2017年03月15日 06点03分
15
vtkSmartPointer<vtkImageActor> imageActor = vtkSmartPointer<vtkImageActor>::New(); imageActor->GetMapper()->SetInputConnection( scalarValuesToColors->GetOutputPort());
2018年08月05日 08点08分