请教专业术语。
vtk吧
全部回复
仅看楼主
level 7
浩繁星尘 楼主
1.
请问VTK图形图像开发进阶上的180页,倒数第二行:vtkvolumemapper3D支持任何数据,但是必须是单组分数据或者多元独立数据。请问这两种数据是什么意思??
2
我想用一系列CT的dicom图 通过vtkvolumemapper3D 实现重建 请问怎么写呢??
2017年06月09日 06点06分 1
level 7
体绘制的例子代码 使用的是gpuvolumeraycustmapper; 如果要读DICOM图像的话 需要修改一下代码;代码根据VTK的版本做一下修改是肯定可以跑通的;
#include "vtkBoxWidget.h"
#include "vtkCamera.h"
#include "vtkCommand.h"
#include "vtkColorTransferFunction.h"
#include "vtkDICOMImageReader.h"
#include "vtkImageData.h"
#include "vtkImageResample.h"
#include "vtkMetaImageReader.h"
#include "vtkPiecewiseFunction.h"
#include "vtkPlanes.h"
#include "vtkProperty.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkVolume.h"
#include "vtkVolumeProperty.h"
#include "vtkXMLImageDataReader.h"
#include "vtkGPUVolumeRayCastMapper.h"
#include "vtkInteractorStyleImage.h"
#include <vtkActor.h>
#include <vtkCubeSource.h>
#include <vtkTransform.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderWindow.h>
#include <vtkRendererCollection.h>
#define VTI_FILETYPE 1
#define MHA_FILETYPE 2
// The mouse motion callback, to turn "Slicing" on and off
class vtkImageInteractionCallback : public vtkCommand
{
public:
int startpos[2];
int endpos[2];
static vtkImageInteractionCallback *New()
{
return new vtkImageInteractionCallback;
};
vtkImageInteractionCallback()
{
this->Slicing = 0;
this->volume = 0;
this->Interactor = 0;
};
void SetImageReslice(vtkVolume *volume)
{
this->volume = volume;
};
vtkVolume *GetImageReslice()
{
return this->volume;
};
void SetInteractor(vtkRenderWindowInteractor *interactor)
{
this->Interactor = interactor;
};
vtkRenderWindowInteractor *GetInteractor()
{
return this->Interactor;
};
virtual void Execute(vtkObject *, unsigned long event, void *)
{
vtkRenderWindowInteractor *interactor = this->GetInteractor();
if (event == vtkCommand::LeftButtonPressEvent)
{
this->Slicing = 1;
startpos[0] = interactor->GetEventPosition()[0];
startpos[1] = interactor->GetEventPosition()[1];
}
else if (event == vtkCommand::LeftButtonReleaseEvent)
{this->Slicing = 0;}
else if (event == vtkCommand::MouseMoveEvent)
{if (this->Slicing)
{
vtkVolume *volume = this->volume;
//volume->RotateX(20);
vtkSmartPointer<vtkCamera>myCamera = vtkSmartPointer<vtkCamera>::New();
myCamera=interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->GetActiveCamera();
myCamera->OrthogonalizeViewUp();
endpos[0] = interactor->GetEventPosition()[0];
endpos[1] = interactor->GetEventPosition()[1];
int x = endpos[0] - startpos[0];
int y = endpos[1] - startpos[1];
startpos[0] = endpos[0];
startpos[1] = endpos[1];
if (x > 0)
{myCamera->Azimuth(5);}
if (x < 0)
{myCamera->Azimuth(-5);}
if (y > 0)
{myCamera->Elevation(5);}
if (y < 0)
{myCamera->Elevation(-5);}
//myCamera->Azimuth(10);
//myCamera->Render();
interactor->GetRenderWindow()->Render();
interactor->Render();
}
else
{
vtkInteractorStyle *style = vtkInteractorStyle::SafeDownCast(
interactor->GetInteractorStyle());
if (style)
{
style->OnMouseMove();
}
}
}
};
private:
// Actions (slicing only, for now)
int Slicing;
// Pointer to vtkImageReslice
vtkVolume *volume;
// Pointer to the interactor
vtkRenderWindowInteractor *Interactor;
};
int main(int argc, char *argv[])
{
char *dirname = "F:\\changhai";
double opacityWindow = 4096;
double opacityLevel = 2048;
int blendType = 4;
double reductionFactor = 1.0;
double frameRate = 10.0;
bool independentComponents = true;
vtkRenderer *renderer = vtkRenderer::New();
vtkRenderWindow *renWin = vtkRenderWindow::New();
vtkSmartPointer<vtkCamera> camera = vtkSmartPointer<vtkCamera>::New();
renWin->AddRenderer(renderer);
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
iren->SetDesiredUpdateRate(frameRate);
iren->GetInteractorStyle()->SetDefaultRenderer(renderer);
vtkAlgorithm *reader = 0;
vtkImageData *input = 0;
vtkDICOMImageReader *dicomReader = vtkDICOMImageReader::New();
dicomReader->SetDirectoryName(dirname);
dicomReader->Update();
input = dicomReader->GetOutput();
reader = dicomReader;
vtkImageResample *resample = vtkImageResample::New();
if (reductionFactor < 1.0)
{
resample->SetInputConnection(reader->GetOutputPort());
resample->SetAxisMagnificationFactor(0, reductionFactor);
resample->SetAxisMagnificationFactor(1, reductionFactor);
resample->SetAxisMagnificationFactor(2, reductionFactor);
}
vtkVolume *volume = vtkVolume::New();
vtkGPUVolumeRayCastMapper *mapper = vtkGPUVolumeRayCastMapper::New();
if (reductionFactor < 1.0)
{
mapper->SetInputConnection(resample->GetOutputPort());
}
else
{
mapper->SetInputConnection(reader->GetOutputPort());
}
// Set the sample distance on the ray to be 1/2 the average spacing
double spacing[3];
if (reductionFactor < 1.0)
{
resample->GetOutput()->GetSpacing(spacing);
}
else
{
input->GetSpacing(spacing);
}
// Create our transfer function
vtkColorTransferFunction *colorFun = vtkColorTransferFunction::New();
vtkPiecewiseFunction *opacityFun = vtkPiecewiseFunction::New();
// Create the property and attach the transfer functions
vtkVolumeProperty *property = vtkVolumeProperty::New();
property->SetIndependentComponents(independentComponents);
property->SetColor(colorFun);
property->SetScalarOpacity(opacityFun);
property->SetInterpolationTypeToLinear();
// connect up the volume to the property and the mapper
volume->SetProperty(property);
volume->SetMapper(mapper);
// Depending on the blend type selected as a command line option,
// adjust the transfer function
switch (blendType)
{
case 4:
colorFun->AddRGBPoint(-3024, 0, 0, 0, 0.5, 0.0);
colorFun->AddRGBPoint(-16, 0.73, 0.25, 0.30, 0.49, .61);
colorFun->AddRGBPoint(641, .90, .82, .56, .5, 0.0);
colorFun->AddRGBPoint(3071, 1, 1, 1, .5, 0.0);
opacityFun->AddPoint(-3024, 0, 0.5, 0.0);
opacityFun->AddPoint(-16, 0, .49, .61);
opacityFun->AddPoint(641, .72, .5, 0.0);
opacityFun->AddPoint(3071, .71, 0.5, 0.0);
mapper->SetBlendModeToComposite();
property->ShadeOn();
property->SetAmbient(0.1);
property->SetDiffuse(0.9);
property->SetSpecular(0.2);
property->SetSpecularPower(10.0);
property->SetScalarOpacityUnitDistance(0.8919);
break;
}
// Set the default window size
renWin->SetSize(600, 600);
renWin->Render();
// Add the volume to the scene
renderer->AddVolume(volume);
renderer->ResetCamera();
// Set up the interaction
vtkInteractorStyleImage* imageStyle = vtkInteractorStyleImage::New();
iren->SetInteractorStyle(imageStyle);
vtkImageInteractionCallback* callback = vtkImageInteractionCallback::New();
callback->SetImageReslice(volume);
callback->SetInteractor(iren);
imageStyle->AddObserver(vtkCommand::MouseMoveEvent, callback);
imageStyle->AddObserver(vtkCommand::LeftButtonPressEvent, callback);
imageStyle->AddObserver(vtkCommand::LeftButtonReleaseEvent, callback);
renderer->SetBackground(.3, .6, .3);
// interact with data
renWin->Render();
iren->Start();
opacityFun->Delete();
colorFun->Delete();
property->Delete();
volume->Delete();
mapper->Delete();
reader->Delete();
resample->Delete();
renderer->Delete();
renWin->Delete();
iren->Delete();
return 0;
}
2017年06月09日 17点06分 2
谢谢大神啦。还想请教一个问题,如果读dicom的图片,是读单张还是多张呢?
2017年06月10日 02点06分
谢谢啦 感谢帮助
2017年06月10日 07点06分
1