medimage 发表于 2015-12-4 22:15:46

VTK例子2-将DCM图像立体化,虚拟场景漫游

本帖最后由 medimage 于 2015-12-4 22:20 编辑

将DCM图像立体化,虚拟场景漫游// 虚拟场景中漫游#include "stdafx.h"#include <iostream>#include "vtkConeSource.h"#include "vtkPolyDataMapper.h"#include "vtkRenderWindow.h"#include "vtkCamera.h"#include "vtkActor.h"#include "vtkRenderer.h"#include "vtkDICOMImageReader.h"#include "vtkSphereSource.h"#include "vtkRenderWindowInteractor.h"#include "vtkImageCast.h"#include "vtkCallbackCommand.h"#include "vtkRenderWindowInteractor.h"#include "vtkImageDataGeometryFilter.h" #include "vtkWarpScalar.h" #include "vtkWindowLevelLookupTable.h" #include "vtkImageMapToWindowLevelColors.h" #include "vtkInteractorStyleTrackballCamera.h" #include "vtkInteractorStyle.h" #include "vtkInteractorEventRecorder.h" #include "vtkTextActor.h" #include "vtkSphereSource.h" #include <vtkTransform.h>#include <vtkTransformFilter.h>#include "vtkTextProperty.h" #include "vtkOrientationMarkerWidget.h"#include "vtkAxesActor.h"#include "vtkCaptionActor2D.h"#include <math.h>#include <vtkJPEGReader.h>#include <vtkTexture.h>#include "vtkSphereSource.h" #include "vtkPlane.h"#include "vtkClipPolyData.h"#include "vtkTextureMapToCylinder.h"#include "vtkPolyDataNormals.h" #include "vtkTextureMapToCylinder.h"#include "vtkTransformTextureCoords.h"#include "vtkDataSetMapper.h"
vtkRenderWindowInteractor *iren;vtkCamera *aCamera;vtkRenderer *ren1;vtkRenderWindow *renWin;vtkTextActor *txt;vtkActor *feidie;vtkInteractorEventRecorder *recorder;int pos;float dis;char BoxWidgetEventLog[] =    "LeftButtonPressEvent 153 253 0 0 0 0 i\n"    "MouseMoveEvent 153 252 0 0 0 0 i\n"    "LeftButtonReleaseEvent 153 252 0 0 0 0 i\n"    ;void keypress(vtkObject *caller, unsigned long eid, void *clientdata, void *calldata);int main(){    ren1= vtkRenderer::New();    renWin = vtkRenderWindow::New();      renWin->AddRenderer( ren1 );    iren = vtkRenderWindowInteractor::New();      iren->SetRenderWindow(renWin);    vtkInteractorStyleTrackballCamera *style=vtkInteractorStyleTrackballCamera::New();    pos=3;    dis=0.7;    vtkDICOMImageReader   *dr =vtkDICOMImageReader::New();      dr->SetDataByteOrderToLittleEndian();      dr->SetFileName("C:/DATADIR/0104.dcm");      dr->SetDataOrigin(0.0,0.0,0.0);    vtkLookupTable *hueLut=vtkLookupTable::New();      hueLut->SetTableRange (0, 2000);      hueLut->SetHueRange (0, 1);      hueLut->SetSaturationRange (1, 1);      hueLut->SetValueRange (1, 1);      hueLut->SetAlpha(1);      hueLut->Build(); //effective built
    vtkImageMapToWindowLevelColors* pImageMapToColors = vtkImageMapToWindowLevelColors ::New();      pImageMapToColors->SetOutputFormatToRGBA();      pImageMapToColors->SetInput((vtkDataObject *)dr->GetOutput());      pImageMapToColors->SetLookupTable(hueLut); vtkImageDataGeometryFilter *geo=vtkImageDataGeometryFilter::New();         geo->SetInput((vtkDataObject *)pImageMapToColors->GetOutput());vtkWarpScalar *scalar=vtkWarpScalar::New();         scalar->SetInput(geo->GetOutput());          scalar->SetScaleFactor(0.06);         scalar->UseNormalOff(   );         scalar->SetUseNormal(60);vtkPolyDataMapper *skinMapper1 = vtkPolyDataMapper::New();    skinMapper1->SetInputConnection(scalar->GetOutputPort());//skinMapper1->SetScalarRange(-1000,2000);//skinMapper1->ImmediateModeRenderingOff();
vtkActor *skin1 = vtkActor::New();    skin1->SetMapper(skinMapper1);    txt = vtkTextActor::New();    txt->SetDisplayPosition(0, 0);    txt->SetInput("Information Shown!");    txt->GetTextProperty()->SetFontSize(18);    txt->GetTextProperty()->SetFontFamilyToArial();    txt->GetTextProperty()->BoldOff();    txt->GetTextProperty()->ItalicOn();    txt->GetTextProperty()->ShadowOn();    txt->GetTextProperty()->SetColor(0, 0, 1);vtkSphereSource *sphere = vtkSphereSource::New();    sphere->SetThetaResolution(10);     sphere->SetPhiResolution(10);    sphere->SetRadius(0.3);vtkTransform *aTransform = vtkTransform::New();    aTransform->Scale(1,1,0.2);vtkTransformFilter *transFilter = vtkTransformFilter::New();    transFilter->SetInput(sphere->GetOutput());    transFilter->SetTransform(aTransform); vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();    mapper->SetInputConnection(transFilter->GetOutputPort());feidie = vtkActor::New();    feidie->SetMapper(mapper);/////////////////////////vtkCallbackCommand * cmd1 = vtkCallbackCommand::New();    cmd1->SetCallback(keypress);    style-> AddObserver (vtkCommand::KeyPressEvent,cmd1);/////////////////////////

//////////////////////////方向vtkAxesActor* axes2 = vtkAxesActor::New();      axes2->SetShaftTypeToCylinder();      axes2->SetXAxisLabelText( "X" );      axes2->SetYAxisLabelText( "Y" );      axes2->SetZAxisLabelText( "Z" );      axes2->SetTotalLength( 1.5, 1.5, 1.5 );      axes2->SetCylinderRadius( 0.500 * axes2->GetCylinderRadius() );      axes2->SetConeRadius    ( 1.025 * axes2->GetConeRadius() );      axes2->SetSphereRadius( 1.500 * axes2->GetSphereRadius() );vtkTextProperty* tprop2 = axes2->GetXAxisCaptionActor2D()->GetCaptionTextProperty();      tprop2->ItalicOn();      tprop2->ShadowOn();      tprop2->SetFontFamilyToTimes();      axes2->GetYAxisCaptionActor2D()->GetCaptionTextProperty()->ShallowCopy( tprop2 );      axes2->GetZAxisCaptionActor2D()->GetCaptionTextProperty()->ShallowCopy( tprop2 );vtkOrientationMarkerWidget *widget = vtkOrientationMarkerWidget::New();    widget->SetOutlineColor( 0.9300, 0.5700, 0.1300 );    widget->SetOrientationMarker( axes2 );    widget->SetInteractor( iren );    widget->SetViewport( 0.85, 0.0, 1, 0.2 );    widget->SetEnabled( 1 );    widget->InteractiveOff();    widget->InteractiveOn();////////////////////////
/////////////////////天空纹理    vtkJPEGReader *pnm1=vtkJPEGReader::New();         pnm1-> SetFileName("C:/DATADIR/flex002.JPG");    vtkTexture *atext=vtkTexture::New();      atext-> SetInputConnection(pnm1->GetOutputPort());      atext-> InterpolateOn();    vtkSphereSource *sphere1 = vtkSphereSource::New();         sphere1->SetThetaResolution(100);          sphere1->SetPhiResolution(100);         sphere1->SetRadius(100);    vtkPlane *plane1=vtkPlane::New();      plane1->SetNormal(0,0,1);//设置切平面的法向量      plane1->SetOrigin(1,0,0);    vtkClipPolyData *clipper=vtkClipPolyData::New();      clipper->SetInputConnection(sphere1-> GetOutputPort());      clipper->SetClipFunction(plane1);      clipper->InsideOutOff();    vtkPolyDataNormals *normals=vtkPolyDataNormals::New();         normals-> SetInputConnection (clipper->GetOutputPort());         normals-> FlipNormalsOn();    vtkTextureMapToCylinder *tmapper=vtkTextureMapToCylinder::New();      tmapper->SetInput(normals->GetOutput());      tmapper->PreventSeamOn();    vtkTransformTextureCoords *xform=vtkTransformTextureCoords::New();      xform-> SetInputConnection(tmapper-> GetOutputPort());      xform-> SetScale( 1, 1, 1);    vtkDataSetMapper*franMapper=vtkDataSetMapper::New();      franMapper-> SetInputConnection(xform-> GetOutputPort());    vtkActor *franActor =vtkActor::New();      franActor -> SetMapper (franMapper);      franActor -> SetTexture (atext);      franActor -> SetPosition(100,100,0);////////////////////////    ren1->AddActor(skin1);    ren1->AddActor(txt);    ren1->AddActor(feidie);    ren1->AddActor(franActor);    ren1->SetBackground( 0.0, 0.6, 1.0 );aCamera = vtkCamera::New();    ren1->SetActiveCamera(aCamera);    ren1->ResetCamera();    aCamera->SetPosition(100,100,5);    aCamera->SetFocalPoint(110,100,5);    aCamera->SetViewUp(0,0,1);    feidie->SetPosition(103,100,5);// record eventsrecorder = vtkInteractorEventRecorder::New();      recorder->SetInteractor(iren);      recorder->ReadFromInputStringOn();      recorder->SetInputString(BoxWidgetEventLog);    //调整视窗大小    renWin->SetSize( 800, 600 );    iren-> SetInteractorStyle(style);    iren->Initialize();    renWin->Render();    recorder->Play();    recorder->Off();    iren->Start(); //dr->Delete();    ren1->Delete();    renWin->Delete();    iren->Delete();        return 0;}void keypress(vtkObject *caller, unsigned long eid, void *clientdata, void *calldata){    char key=iren->GetKeyCode();    double normal;              double focal;    double position;     double view;         switch (key)    {      case '8':                  aCamera->GetViewPlaneNormal (normal);                   aCamera->GetFocalPoint(focal);                                 aCamera->GetPosition(position);                  position=position-pos*normal;                  position=position-pos*normal;                  //position=position-pos*normal;
                  focal=focal-pos*normal;                  focal=focal-pos*normal;                  //focal=focal-pos*normal;
                  aCamera->SetPosition(position);                  aCamera->SetFocalPoint(focal);                break;      case '5':                  aCamera->GetViewPlaneNormal (normal);                   aCamera->GetFocalPoint(focal);                     aCamera->GetPosition(position);                  position=position+pos*normal;                  position=position+pos*normal;                  //position=position+pos*normal;
                  focal=focal+pos*normal;                  focal=focal+pos*normal;                  //focal=focal+pos*normal;
                  aCamera->SetPosition(position);                  aCamera->SetFocalPoint(focal);                break;      case '6':                                  aCamera->Yaw (-pos);                break;      case '4':                  aCamera->Yaw (pos);                break;      case 'n':                                  aCamera->Pitch(-pos);                break;      case 'm':                  aCamera->Pitch(pos);                break;      case '+':                  pos=pos+1;                  printf("%d\n",pos);                  break;      case '-':                  pos=pos-1;                  printf("%d\n",pos);                  break;      case '.':                  aCamera->GetViewPlaneNormal (normal);                   aCamera->GetFocalPoint(focal);                                 focal=focal+normal;                  focal=focal+normal;                  focal=focal+normal;                  aCamera->SetFocalPoint(focal);                   break;      case ',':                  aCamera->GetViewPlaneNormal (normal);                   aCamera->GetFocalPoint(focal);                                 focal=focal-normal;                  focal=focal-normal;                  focal=focal-normal;                  aCamera->SetFocalPoint(focal);                  break;                      case 'v':                  aCamera->SetViewUp(0,0,1);                  break;      case 'c':      case '0':                  aCamera->SetPosition(100,100,5);                  aCamera->SetFocalPoint(110,100,5);                  aCamera->SetViewUp(0,0,1);                  recorder->Play();                  recorder->Off();                  break;      case 'b':                  if (feidie->GetVisibility())                      feidie->VisibilityOff();                  else                       feidie->VisibilityOn();                  break;      case '*'://上                           aCamera->GetFocalPoint(focal);                                 aCamera->GetPosition(position);                  position=position-pos/3.0;                  focal=focal-pos/3.0;                  aCamera->SetPosition(position);                  aCamera->SetFocalPoint(focal);                break;      case '/'://下                  aCamera->GetFocalPoint(focal);                     aCamera->GetPosition(position);                  position=position+pos/3.0;                  focal=focal+pos/3.0;                  aCamera->SetPosition(position);                  aCamera->SetFocalPoint(focal);                break;    }    aCamera->GetViewPlaneNormal (normal);     aCamera->GetFocalPoint(focal);                   aCamera->GetPosition(position);    aCamera->GetViewUp(view);    double length;    length=sqrt((focal-position)*(focal-position)+               (focal-position)*(focal-position)+               (focal-position)*(focal-position));    char text;    sprintf(text," Distance of focus: %f\n normal: %f,%f,%f\n position: %f,%f,%f\n focal: %f,%f,%f\n viewup: %f,%f,%f\n",         length,         normal,normal,normal,         position,position,position,         focal,focal,focal,         view,view,view);    txt->SetInput(text);    if (feidie->GetVisibility())    {         double dp;         dp=position*dis+focal*(1-dis);      dp=position*dis+focal*(1-dis);            dp=position*dis+focal*(1-dis);         feidie->SetPosition(dp);    }    renWin->Render();}

devstd 发表于 2016-5-11 16:48:26

楼主太伟大了

dentaldev 发表于 2016-5-14 15:19:09

看看高人有多高

不再妄想 发表于 2016-5-15 20:51:06

学习了!!!!!!!!!

oevko 发表于 2016-5-16 02:42:22

次贴无用,检定完毕!

江西魏工 发表于 2016-5-23 15:46:00

先看看在说
页: [1]
查看完整版本: VTK例子2-将DCM图像立体化,虚拟场景漫游