医站点医维基

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1060|回复: 5

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

[复制链接]

336

主题

410

回帖

2806

积分

管理员

积分
2806

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2015-12-4 22:15:46 | 显示全部楼层 |阅读模式
本帖最后由 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 events
  recorder = 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[3];         
    double focal[3];  
    double position[3];
    double view[3];
   
    switch (key)
    {
      case '8':
                  aCamera->GetViewPlaneNormal (normal);
                  aCamera->GetFocalPoint(focal);                 
                  aCamera->GetPosition(position);
                  position[0]=position[0]-pos*normal[0];
                  position[1]=position[1]-pos*normal[1];
                  //position[2]=position[2]-pos*normal[2];

                  focal[0]=focal[0]-pos*normal[0];
                  focal[1]=focal[1]-pos*normal[1];
                  //focal[2]=focal[2]-pos*normal[2];

                  aCamera->SetPosition(position);
                  aCamera->SetFocalPoint(focal);
                break;
      case '5':
                  aCamera->GetViewPlaneNormal (normal);
                  aCamera->GetFocalPoint(focal);   
                  aCamera->GetPosition(position);
                  position[0]=position[0]+pos*normal[0];
                  position[1]=position[1]+pos*normal[1];
                  //position[2]=position[2]+pos*normal[2];

                  focal[0]=focal[0]+pos*normal[0];
                  focal[1]=focal[1]+pos*normal[1];
                  //focal[2]=focal[2]+pos*normal[2];

                  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[0]=focal[0]+normal[0];
                  focal[1]=focal[1]+normal[1];
                  focal[2]=focal[2]+normal[2];
                  aCamera->SetFocalPoint(focal);
                  break;
      case ',':
                  aCamera->GetViewPlaneNormal (normal);
                  aCamera->GetFocalPoint(focal);                 
                  focal[0]=focal[0]-normal[0];
                  focal[1]=focal[1]-normal[1];
                  focal[2]=focal[2]-normal[2];
                  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[2]=position[2]-pos/3.0;
                  focal[2]=focal[2]-pos/3.0;
                  aCamera->SetPosition(position);
                  aCamera->SetFocalPoint(focal);
                break;
      case '/'://下
                  aCamera->GetFocalPoint(focal);   
                  aCamera->GetPosition(position);
                  position[2]=position[2]+pos/3.0;
                  focal[2]=focal[2]+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[0]-position[0])*(focal[0]-position[0])+
                 (focal[1]-position[1])*(focal[1]-position[1])+
                 (focal[2]-position[2])*(focal[2]-position[2]));
    char text[300];
    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[0],normal[1],normal[2],
         position[0],position[1],position[2],
         focal[0],focal[1],focal[2],
         view[0],view[1],view[2]);
    txt->SetInput(text);
    if (feidie->GetVisibility())
    {
         double dp[3];
         dp[0]=position[0]*dis+focal[0]*(1-dis);
        dp[1]=position[1]*dis+focal[1]*(1-dis);     
         dp[2]=position[2]*dis+focal[2]*(1-dis);
         feidie->SetPosition(dp);
    }
    renWin->Render();
}

虚拟场景中漫游

虚拟场景中漫游

虚拟场景中漫游2

虚拟场景中漫游2
回复

使用道具 举报

60

主题

416

回帖

1235

积分

版主

积分
1235

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2016-5-11 16:48:26 | 显示全部楼层
楼主太伟大了
回复

使用道具 举报

1

主题

441

回帖

1100

积分

版主

积分
1100

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2016-5-14 15:19:09 | 显示全部楼层
看看高人有多高
回复

使用道具 举报

6

主题

408

回帖

860

积分

高级会员

积分
860

最佳新人

发表于 2016-5-15 20:51:06 | 显示全部楼层
学习了!!!!!!!!!
回复

使用道具 举报

0

主题

399

回帖

804

积分

高级会员

积分
804

最佳新人

发表于 2016-5-16 02:42:22 | 显示全部楼层
次贴无用,检定完毕!
回复

使用道具 举报

135

主题

407

回帖

1461

积分

版主

积分
1461

热心会员推广达人优秀版主荣誉管理论坛元老

发表于 2016-5-23 15:46:00 | 显示全部楼层
先看看在说
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|关于我们|医维基|网站地图|Archiver|手机版|医疗之家 ( 沪ICP备2023001278号-1 )  

GMT+8, 2024-5-2 13:04 , Processed in 0.230845 second(s), 31 queries .

Designed by Medical BBS

快速回复 返回顶部 返回列表