例一:
显示Dicom序列,通过鼠标滚轮切换,并能显示操作提示。

``
//
// This example demonstrates how to read a series of dicom images
// and how to scroll with the mousewheel or the up/down keys
// through all slices
//
// some standard vtk headers
#**include** <vtkSmartPointer.h>
#**include** <vtkObjectFactory.h>
#**include** <vtkRenderWindow.h>
#**include** <vtkRenderWindowInteractor.h>
#**include** <vtkRenderer.h>
#**include** <vtkActor.h>
// headers needed for this example
#**include** <vtkImageViewer2.h>
#**include** <vtkDICOMImageReader.h>
#**include** <vtkInteractorStyleImage.h>
#**include** <vtkActor2D.h>
#**include** <vtkTextProperty.h>
#**include** <vtkTextMapper.h>
// needed to easily convert int to std::string
#**include** <sstream>
// helper class to format slice status message
**class** StatusMessage {
**public**:
**static** std::string Format(**int** slice, **int** maxSlice) {
std::stringstream tmp;
tmp << "Slice Number " << slice + 1 << "/" << maxSlice + 1;
**return** tmp.str();
}
};
// Define own interaction style
**class** myVtkInteractorStyleImage : **public** vtkInteractorStyleImage
{
**public**:
**static** myVtkInteractorStyleImage* New();
vtkTypeMacro(myVtkInteractorStyleImage, vtkInteractorStyleImage);
**protected**:
vtkImageViewer2* _ImageViewer;
vtkTextMapper* _StatusMapper;
**int** _Slice;
**int** _MinSlice;
**int** _MaxSlice;
**public**:
**void** SetImageViewer(vtkImageViewer2* imageViewer) {
_ImageViewer = imageViewer;
_MinSlice = imageViewer->GetSliceMin();
_MaxSlice = imageViewer->GetSliceMax();
_Slice = _MinSlice;
cout << "Slicer: Min = " << _MinSlice << ", Max = " << _MaxSlice << std::endl;
}
**void** SetStatusMapper(vtkTextMapper* statusMapper) {
_StatusMapper = statusMapper;
}
**protected**:
**void** MoveSliceForward() {
**if**(_Slice < _MaxSlice) {
_Slice += 1;
cout << "MoveSliceForward::Slice = " << _Slice << std::endl;
_ImageViewer->SetSlice(_Slice);
std::string msg = StatusMessage::Format(_Slice, _MaxSlice);
_StatusMapper->SetInput(msg.c_str());
_ImageViewer->Render();
}
}
**void** MoveSliceBackward() {
**if**(_Slice > _MinSlice) {
_Slice -= 1;
cout << "MoveSliceBackward::Slice = " << _Slice << std::endl;
_ImageViewer->SetSlice(_Slice);
std::string msg = StatusMessage::Format(_Slice, _MaxSlice);
_StatusMapper->SetInput(msg.c_str());
_ImageViewer->Render();
}
}
**virtual** **void** OnKeyDown() {
std::string key = **this**->GetInteractor()->GetKeySym();
**if**(key.compare("Up") == 0) {
//cout << "Up arrow key was pressed." << endl;
MoveSliceForward();
}
**else** **if**(key.compare("Down") == 0) {
//cout << "Down arrow key was pressed." << endl;
MoveSliceBackward();
}
// forward event
vtkInteractorStyleImage::OnKeyDown();
}
**virtual** **void** OnMouseWheelForward() {
//std::cout << "Scrolled mouse wheel forward." << std::endl;
MoveSliceForward();
// don't forward events, otherwise the image will be zoomed
// in case another interactorstyle is used (e.g. trackballstyle, ...)
// vtkInteractorStyleImage::OnMouseWheelForward();
}
**virtual** **void** OnMouseWheelBackward() {
//std::cout << "Scrolled mouse wheel backward." << std::endl;
**if**(_Slice > _MinSlice) {
MoveSliceBackward();
}
// don't forward events, otherwise the image will be zoomed
// in case another interactorstyle is used (e.g. trackballstyle, ...)
// vtkInteractorStyleImage::OnMouseWheelBackward();
}
};
vtkStandardNewMacro(myVtkInteractorStyleImage);
**int** main(**int** argc, **char*** argv[])
{
//std::string folder = argv[1];
std::string folder = "D:\\yangfeichuan\\2";
// Read all the DICOM files in the specified directory.
vtkSmartPointer<vtkDICOMImageReader> reader =
vtkSmartPointer<vtkDICOMImageReader>::New();
reader->SetDirectoryName(folder.c_str());
reader->Update();
// Visualize
vtkSmartPointer<vtkImageViewer2> imageViewer =
vtkSmartPointer<vtkImageViewer2>::New();
imageViewer->SetInputConnection(reader->GetOutputPort());
// slice status message
vtkSmartPointer<vtkTextProperty> sliceTextProp = vtkSmartPointer<vtkTextProperty>::New();
sliceTextProp->SetFontFamilyToCourier();
sliceTextProp->SetFontSize(20);
sliceTextProp->SetVerticalJustificationToBottom();
sliceTextProp->SetJustificationToLeft();
vtkSmartPointer<vtkTextMapper> sliceTextMapper = vtkSmartPointer<vtkTextMapper>::New();
std::string msg = StatusMessage::Format(imageViewer->GetSliceMin(), imageViewer->GetSliceMax());
sliceTextMapper->SetInput(msg.c_str());
sliceTextMapper->SetTextProperty(sliceTextProp);
vtkSmartPointer<vtkActor2D> sliceTextActor = vtkSmartPointer<vtkActor2D>::New();
sliceTextActor->SetMapper(sliceTextMapper);
sliceTextActor->SetPosition(15, 10);
// usage hint message
vtkSmartPointer<vtkTextProperty> usageTextProp = vtkSmartPointer<vtkTextProperty>::New();
usageTextProp->SetFontFamilyToCourier();
usageTextProp->SetFontSize(14);
usageTextProp->SetVerticalJustificationToTop();
usageTextProp->SetJustificationToLeft();
vtkSmartPointer<vtkTextMapper> usageTextMapper = vtkSmartPointer<vtkTextMapper>::New();
usageTextMapper->SetInput("- Slice with mouse wheel\n or Up/Down-Key\n- Zoom with pressed right\n mouse button while dragging");
usageTextMapper->SetTextProperty(usageTextProp);
vtkSmartPointer<vtkActor2D> usageTextActor = vtkSmartPointer<vtkActor2D>::New();
usageTextActor->SetMapper(usageTextMapper);
usageTextActor->GetPositionCoordinate()->SetCoordinateSystemToNormalizedDisplay();
usageTextActor->GetPositionCoordinate()->SetValue( 0.05, 0.95);
// create an interactor with our own style (inherit from vtkInteractorStyleImage)
// in order to catch mousewheel and key events
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
vtkSmartPointer<myVtkInteractorStyleImage> myInteractorStyle =
vtkSmartPointer<myVtkInteractorStyleImage>::New();
// make imageviewer2 and sliceTextMapper visible to our interactorstyle
// to enable slice status message updates when scrolling through the slices
myInteractorStyle->SetImageViewer(imageViewer);
myInteractorStyle->SetStatusMapper(sliceTextMapper);
imageViewer->SetupInteractor(renderWindowInteractor);
// make the interactor use our own interactorstyle
// cause SetupInteractor() is defining it's own default interatorstyle
// this must be called after SetupInteractor()
renderWindowInteractor->SetInteractorStyle(myInteractorStyle);
// add slice status message and usage hint message to the renderer
imageViewer->GetRenderer()->AddActor2D(sliceTextActor);
imageViewer->GetRenderer()->AddActor2D(usageTextActor);
// initialize rendering and interaction
//imageViewer->GetRenderWindow()->SetSize(400, 300);
//imageViewer->GetRenderer()->SetBackground(0.2, 0.3, 0.4);
imageViewer->Render();
imageViewer->GetRenderer()->ResetCamera();
imageViewer->Render();
renderWindowInteractor->Start();
**return** EXIT_SUCCESS;
}
例二:
vtk取坐标点事件,窗口左下为坐标原点,但非世界坐标原点。
 
``
#**include** <vtkRenderWindow.h>
#**include** <vtkRenderWindowInteractor.h>
#**include** <vtkRenderer.h>
#**include** <vtkSphereSource.h>
#**include** <vtkPolyDataMapper.h>
#**include** <vtkActor.h>
#**include** <vtkSmartPointer.h>
#**include** <vtkPointPicker.h>
#**include** <vtkCamera.h>
#**include** <vtkInteractorStyleTrackballCamera.h>
#**include** <vtkObjectFactory.h>
#**include** <vtkCoordinate.h>
#**include** <vtkRendererCollection.h>
// Define interaction style
**class** MouseInteractorStyle3 : **public** vtkInteractorStyleTrackballCamera
{
**public**:
**static** MouseInteractorStyle3* New();
**virtual** **void** OnLeftButtonDown()
{
std::cout << "Pressed left mouse button." << std::endl;
**int** x = **this**->Interactor->GetEventPosition()[0];
**int** y = **this**->Interactor->GetEventPosition()[1];
std::cout << "(x,y) = (" << x << "," << y << ")" << std::endl;
vtkSmartPointer<vtkCoordinate> coordinate =
vtkSmartPointer<vtkCoordinate>::New();
coordinate->SetCoordinateSystemToDisplay();
coordinate->SetValue(x,y,0);
// This doesn't produce the right value if the sphere is zoomed in???
**double*** world = coordinate->GetComputedWorldValue(**this**->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer());
std::cout << "World coordinate: " << world[0] << ", " << world[1] << ", " << world[2] << std::endl;
// Forward events
vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
}
};
vtkStandardNewMacro(MouseInteractorStyle3);
**int** main(**int**, **char** *[])
{
vtkSmartPointer<vtkSphereSource> sphereSource =
vtkSmartPointer<vtkSphereSource>::New();
sphereSource->SetCenter(0.0, 0.0, 0.0);
sphereSource->SetRadius(5.0);
sphereSource->Update();
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(sphereSource->GetOutputPort());
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderer->SetBackground(1,1,1); // Background color white
renderer->AddActor(actor);
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow ( renderWindow );
vtkSmartPointer<MouseInteractorStyle3> style =
vtkSmartPointer<MouseInteractorStyle3>::New();
renderWindowInteractor->SetInteractorStyle( style );
renderWindowInteractor->Initialize();
renderWindowInteractor->Start();
**return** EXIT_SUCCESS ;
}
例三:
单个renderwindow中添加多个render,生成冠状面,矢状面,横断面等四视图。

``
#**include** "vtkDICOMImageReader.h"
#**include** "vtkOutlineFilter.h"
#**include** "vtkPolyDataMapper.h"
#**include** "vtkActor.h"
#**include** "vtkRenderer.h"
#**include** "vtkRenderWindow.h"
#**include** "vtkRenderWindowInteractor.h"
#**include** "vtkImagePlaneWidget.h"
#**include** "vtkCellPicker.h"
#**include** "vtkProperty.h"
#**include** "vtkImageMapToColors.h"
#**include** "vtkImageActor.h"
#**include** "vtkCamera.h"
#**include** "vtkCommand.h"
#**include** "vtkJPEGReader.h"
**class** vtkWidgetWindowLevelCallback : **public** vtkCommand
{
**public**:
**static** vtkWidgetWindowLevelCallback *New()
{ **return** **new** vtkWidgetWindowLevelCallback; }
**void** Execute( vtkObject *caller, **unsigned** **long** 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]);
}
**else** **if**( self == **this**->WidgetY )
{
**this**->WidgetX->SetWindowLevel(wl[0],wl[1]);
**this**->WidgetZ->SetWindowLevel(wl[0],wl[1]);
}
**else** **if** (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;
};
**int** main()
{
vtkDICOMImageReader *DicomReader = vtkDICOMImageReader::New();
DicomReader->SetDataByteOrderToLittleEndian();
DicomReader->SetDirectoryName( "D:\\yangfeichuan\\2" );
DicomReader->Update();
vtkOutlineFilter *DicomOutline = vtkOutlineFilter::New();
DicomOutline->SetInputConnection( DicomReader->GetOutputPort() );
vtkPolyDataMapper *DicomMapper = vtkPolyDataMapper::New();
DicomMapper->SetInputConnection( DicomOutline->GetOutputPort() );
vtkActor *DicomActor = vtkActor::New();
DicomActor->SetMapper( DicomMapper );
vtkRenderWindow *renWin = vtkRenderWindow::New();
vtkRenderer *ren = vtkRenderer::New();
vtkRenderer *ren1 = vtkRenderer::New();
vtkRenderer *ren2 = vtkRenderer::New();
vtkRenderer *ren3 = vtkRenderer::New();
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
renWin->AddRenderer( ren1 );
renWin->AddRenderer( ren2 );
renWin->AddRenderer( ren3 );
renWin->AddRenderer( ren );
iren->SetRenderWindow( renWin );
// ren->AddActor( DicomActor );
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*)DicomReader->GetOutput() );
planeWidgetX->SetPlaneOrientationToXAxes();//??
planeWidgetX->SetSliceIndex( 255 );
planeWidgetX->GetTexturePlaneProperty()->SetOpacity( 1 );
planeWidgetX->On();
vtkImagePlaneWidget * planeWidgetY = vtkImagePlaneWidget::New();
planeWidgetY->SetInteractor( iren );
planeWidgetY->SetKeyPressActivationValue( 'y' );
planeWidgetY->SetPicker( picker );
planeWidgetY->RestrictPlaneToVolumeOn();
planeWidgetY->GetPlaneProperty()->SetColor( 1.0, 0.0, 0.0 );
planeWidgetY->DisplayTextOn();
planeWidgetY->TextureInterpolateOn();
planeWidgetY->SetResliceInterpolateToLinear();
planeWidgetY->SetInput( (vtkDataSet*)DicomReader->GetOutput() );
planeWidgetY->SetPlaneOrientationToYAxes();//??
planeWidgetY->SetSliceIndex( 255 );
planeWidgetY->On();
vtkImagePlaneWidget * planeWidgetZ = vtkImagePlaneWidget::New();
planeWidgetZ->SetInteractor( iren );
planeWidgetZ->DisplayTextOn();
planeWidgetZ->RestrictPlaneToVolumeOn();
planeWidgetZ->SetKeyPressActivationValue( 'z' );
planeWidgetZ->SetPicker( picker );
planeWidgetZ->GetPlaneProperty()->SetColor( 0.0, 1.0, 0.0 );
planeWidgetZ->TextureInterpolateOn();
planeWidgetZ->SetResliceInterpolateToLinear();
planeWidgetZ->SetInput( (vtkDataSet*)DicomReader->GetOutput() );
planeWidgetZ->SetPlaneOrientationToZAxes(); //?ᨢ????
planeWidgetZ->SetSliceIndex( 150 );
planeWidgetZ->On();
/* vtkImagePlaneWidget *planeWidgetZ = vtkImagePlaneWidget::New();
planeWidgetZ->SetInteractor( iren );
planeWidgetZ->SetKeyPressActivationValue( 'z' );
planeWidgetZ->DisplayTextOn();
planeWidgetZ->SetPicker( picker );
planeWidgetZ->GetPlaneProperty()->SetColor( 1.0, 0.0, 0.0 );
planeWidgetZ->TextureInterpolateOn();
planeWidgetZ->SetResliceInterpolateToCubic();
planeWidgetZ->SetInput( (vtkDataSet*)DicomReader->GetOutput() );
planeWidgetZ->SetPlaneOrientationToZAxes();
planeWidgetZ->SetSliceIndex( 183 );
planeWidgetZ->On();*/
vtkWidgetWindowLevelCallback* cbk = vtkWidgetWindowLevelCallback::New();
cbk->WidgetX = planeWidgetX;
cbk->WidgetY = planeWidgetY;
cbk->WidgetZ = planeWidgetZ;
cbk->Delete();
vtkImageMapToColors *colorMap1 = vtkImageMapToColors::New();
colorMap1->PassAlphaToOutputOff(); //use in RGBA
colorMap1->SetActiveComponent( 0 );
colorMap1->SetOutputFormatToLuminance();
colorMap1->SetInput( (vtkDataSet*)planeWidgetX->GetResliceOutput() );
colorMap1->SetLookupTable( (vtkScalarsToColors *)planeWidgetX->GetLookupTable() );
vtkImageActor * imageActor1 = vtkImageActor::New();
imageActor1->PickableOff();
imageActor1->SetInput( colorMap1->GetOutput() );
vtkImageMapToColors *colorMap2 = vtkImageMapToColors::New();
colorMap2->PassAlphaToOutputOff();
colorMap2->SetActiveComponent( 0 ); // for muti-component
colorMap2->SetOutputFormatToLuminance();
colorMap2->SetInput( (vtkDataSet*)planeWidgetY->GetResliceOutput() );
colorMap2->SetLookupTable( (vtkScalarsToColors *)planeWidgetX->GetLookupTable() );
vtkImageActor * imageActor2 = vtkImageActor::New();
imageActor2->PickableOff();
imageActor2->SetInput( colorMap2->GetOutput() );
vtkImageMapToColors *colorMap3 = vtkImageMapToColors::New();
colorMap3->PassAlphaToOutputOff();
colorMap3->SetActiveComponent( 0 );
colorMap3->SetOutputFormatToLuminance();
colorMap3->SetInput( (vtkDataSet*)planeWidgetZ->GetResliceOutput() );
colorMap3->SetLookupTable( (vtkScalarsToColors *)planeWidgetX->GetLookupTable());
//colorMap3->SetLookupTable(planeWidgetX->GetLookupTable());
vtkImageActor *imageActor3 = vtkImageActor::New();
imageActor3->PickableOff();
imageActor3->SetInput( colorMap3->GetOutput() );
ren->AddActor( DicomActor ); //outline
ren1->AddActor( imageActor1 );
ren2->AddActor( imageActor2 );
ren3->AddActor( imageActor3 );
// OK
ren->SetBackground( 0.3, 0.3, 0.6 );
ren1->SetBackground( 1.0, 0.0, 0.0 );
ren2->SetBackground( 0.0, 1.0, 0.0 );
ren3->SetBackground( 0.0, 0.0, 1.0 );
renWin->SetSize( 600, 400 );
ren->SetViewport( 0, 0.5, 0.5, 1 );
ren1->SetViewport( 0.5, 0.5, 1, 1 );
ren2->SetViewport( 0, 0, 0.5, 0.5 );
ren3->SetViewport( 0.5, 0, 1, 0.5 );
iren->Initialize();
iren->Start();
renWin->Render();
**return** 0;
}
[来自为知笔记(Wiz)](http://www.wiz.cn/i/c09d0bb5 "来自为知笔记(Wiz)")