
#include <vtkSmartPointerh>
#include <vtkPointsh>
#include <vtkPolyDatah>
#include <vtkIdListh>
#include <vtkKdTreePointLocatorh>
int main(int, char [])
{
// Setup point coordinates
double x[3] = {10, 00, 00};
double y[3] = {00, 10, 00};
double z[3] = {00, 00, 10};
#define VTK_USE_ANSI_STDLIB
#pragma warning( disable : 4996)
#include <vtkRendererh>
#include <vtkRenderWindowh>
#include <vtkRenderWindowInteractorh>
#include <vtkPropertyh>
#include <vtkCamerah>
#include <vtkPiecewiseFunctionh>
#include <vtkColorTransferFunctionh>
#include <vtkVolumePropertyh>
#include <vtkVolumeRayCastCompositeFunctionh>
#include <vtkVolumeRayCastMapperh>
#include <vtkVolumeh>
#include <vtkImageDatah>
#include <vtkVolumeTextureMapper2Dh>
#include <vtkPlaneh>
#include <vtkOutlineFilterh>
#include <vtkBoxWidgeth>
#include <vtkPolyDataMapperh>
#include <vtkPropertyh>
#include <vtkCommandh>
#include <vtkPlanesh>
#include <vtkVolumeTextureMapper2Dh>
#include <vtkImageResliceh>
#include <vtkMatrix4x4h>
#include <vtkTransformh>
#include <vtkImageViewerh>
#include <mathh>
unsigned char data;
float xMax = 0;
float xMin = 0;
float yMax = 0;
float yMin = 0;
float zMax = 0;
float zMin = 0;
int xDim = 0;
int yDim = 0;
int zDim = 0;
int xStep = 0;
int yStep = 0;
int zStep = 0;
void fBuildTestData()
{
xDim = yDim = zDim = 10;
xStep = yStep = zStep = 1;
data = new unsigned char[xDim yDim zDim];
int value = 0;
for (int iz = 0; iz < 10; iz++)
{
for (int iy = 0; iy < 10; iy++)
{
for (int ix = 0; ix < 10; ix++)
{
data[iz xDim yDim + iy xDim + ix] = value;
}
}
value += 1;
}
}
//main function
int main(int, char argv)
{
fBuildTestData();
vtkRenderer ren1 = vtkRenderer::New();
vtkRenderWindow renWin = vtkRenderWindow::New();
renWin->AddRenderer(ren1);
vtkRenderWindowInteractor iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
//////////////////////////////////////////////////////////////////////////
// create the image data
vtkImageData image = vtkImageData::New();
image->SetDimensions(zDim, yDim, xDim);
image->SetSpacing(xStep, yStep, zStep);
image->SetOrigin(5, 5, 5);
image->SetExtent(0, xDim - 1, 0, yDim - 1, 0, zDim - 1);
image->SetScalarType(VTK_UNSIGNED_CHAR);
image->SetNumberOfScalarComponents(1);
image->AllocateScalars();
unsigned char ptr = (unsigned char )image->GetScalarPointer();
// !! 将Data数据转化到image中去 !!
memcpy(ptr, data, xDimyDimzDim);
vtkPiecewiseFunction opacityTransferFunction = vtkPiecewiseFunction::New();
opacityTransferFunction->AddPoint(0, 1);
opacityTransferFunction->AddPoint(1, 1);
vtkColorTransferFunction colorTransferFunction = vtkColorTransferFunction::New();
colorTransferFunction->AddRGBPoint(00, 10, 10, 10);
colorTransferFunction->AddRGBPoint(10, 01, 02, 04);
colorTransferFunction->AddRGBPoint(20, 0, 1, 0);
colorTransferFunction->AddRGBPoint(30, 04, 02, 0);
colorTransferFunction->AddRGBPoint(40, 02, 04, 0);
colorTransferFunction->AddRGBPoint(50, 02, 04, 1);
colorTransferFunction->AddRGBPoint(60, 0, 0, 1);
colorTransferFunction->AddRGBPoint(70, 1, 0, 1);
colorTransferFunction->AddRGBPoint(80, 1, 0, 0);
colorTransferFunction->AddRGBPoint(90, 01, 0, 04);
vtkVolumeProperty volumeProperty = vtkVolumeProperty::New();
volumeProperty->SetColor(colorTransferFunction);
volumeProperty->SetScalarOpacity(opacityTransferFunction);
volumeProperty->ShadeOff();
volumeProperty->SetInterpolationTypeToLinear();
vtkVolumeTextureMapper2D volumeMapper = vtkVolumeTextureMapper2D::New();
volumeMapper->SetInput(image);
vtkVolume volume = vtkVolume::New();
volume->SetMapper(volumeMapper);
volume->SetProperty(volumeProperty);
ren1->AddVolume(volume);
//////////////////////////////////////////////////////////////////////////
vtkTransform transform = vtkTransform::New();
transform->RotateX(0);
transform->RotateY(-90);
transform->RotateZ(0);
vtkImageReslice imageReslice = vtkImageReslice::New();
imageReslice->SetInput( image );
// imageDataFirstRotationVolumeReslice->SetResliceAxes( sagittal_transform);
imageReslice->SetResliceTransform(transform);
imageReslice->WrapOff();
imageReslice->MirrorOff();
imageReslice->SetInterpolationModeToLinear();
imageReslice->InterpolateOn();
imageReslice->OptimizationOn();
imageReslice->ReleaseDataFlagOn();
imageReslice->SetBackgroundColor(0, 0, 0, 1);
imageReslice->SetOutputOriginToDefault();
imageReslice->SetOutputSpacing(xStep, yStep, zStep);
imageReslice->SetOutputOrigin(5, 5, 5);
imageReslice->SetOutputExtent(0, xDim - 1, 0, yDim - 1, 0, zDim - 1);
imageReslice->Update();
vtkImageViewer imageView = vtkImageViewer::New();
imageView->SetInput(imageReslice->GetOutput());
imageView->SetZSlice(5);
imageView->SetColorWindow(2000);
imageView->SetColorLevel(1000);
ren1->AddActor2D((vtkProp )imageView->GetActor2D());
//////////////////////////////////////////////////////////////////////////
ren1->SetBackground(02, 04, 06);
renWin->SetSize(640, 480);
// 开始渲染
renWin->Render();
// 消息循环开始
iren->Start();
}
方法如下: figure; %设置坐标轴线宽,加边框,坐标字号 axes('linewidth',1, 'box', 'on', 'FontSize',16); %设置坐标轴label xlabel('时间(s)','FontSize',16); ylabel('压力(pa)','FontSize',16); grid on; hold on; plot(ScopeData1time, Sco
一般来大多数的CAD软体都可以转STL的格式,转出来表示你的图档有问题,STL常出现的问题是因为,STL的格式是以弦高切成三角形的,做为计算的,和IGES、STP不同,IGES、STP的格式有转码表的
1 定义
参考资料[1][2][3]都指出,窗技术是CT检查中用以观察不同密度的正常组织或病变的一种显示技术,包括窗宽(window width)和窗位(window level)。由于各种组织结构或病变具有不同的CT值,因此欲显示某一组织结构细节时,应选择适合观察该组织或病变的窗宽和窗位,以获得最佳显示。
11 窗宽
窗宽是CT图像上显示的CT值范围,在此CT值范围内的组织和病变均以不同的模拟灰度显示,而CT值高于此范围的组织和病变,无论高出程度有多少,均以白影显示,不再有灰度差异;反之,低于此范围的组织结构,不论低的程度有多少,均以黑影显示,也无灰度差别。
12 窗位
窗位是窗的中心位置,同样的窗宽,由于窗位不同,其所包括CT值范围的CT值也有差异。
2 实现代码
参考资料[2]中给出了相关代码,这里略去。
3 VTK中的实现
31 vtkImagePlaneWidget
在VTK中,可以直接设置窗位的类是vtkImagePlaneWidget,但这主要用于虚拟切片中。对于普通的图像,可按照32或者33的方法来实现。
32 vtkImageMapToWindowLevelColors
但是如果使用vtkImageReader读取图像,然后通过vtkImageActor来显示,则需要借助vtkImageMapToWindowLevelColors类来实现窗宽窗位的设置,详见vtkImageMapToWindowLevelColors的测试案例TestMapToWindowLevelColorspy。
33 vtkInteractorStyleImage
32是通过用于自己设定窗宽窗位来实现不同的观测效果的。此外,还可以通过改变Ineractor的style来达到这个目的,例如:
[cpp] view plain copy
vtkSmartPointer< vtkInteractorStyleImage > interactorStyleImage =
vtkSmartPointer< vtkInteractorStyleImage >::New();
ui->qvtkWidget->GetInteractor()->SetInteractorStyle( interactorStyleImage );
这时,使用鼠标和通过qvtkWidget显示的图像进行交互时,按住左键拖动鼠标即可实现窗位窗宽的调整。这是最适合于观测图像的交互风格。
#include "vtkDICOMImageReaderh"
#include "vtkOutlineFilterh"
#include "vtkPolyDataMapperh"
#include "vtkActorh"
#include "vtkRendererh"
#include "vtkRenderWindowh"
#include "vtkRenderWindowInteractorh"
#include "vtkImagePlaneWidgeth"
#include "vtkCellPickerh"
#include "vtkPropertyh"
#include "vtkImageMapToColorsh"
#include "vtkImageActorh"
#include "vtkCamerah"
#include "vtkCommandh"
#include "vtkJPEGReaderh"
class vtkWidgetWindowLevelCallback;
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;
};
void Test_02()
{
vtkDICOMImageReader DicomReader = vtkDICOMImageReader::New();
DicomReader->SetDataByteOrderToLittleEndian();
DicomReader->SetDirectoryName( "D:\\T_PETCT_Example\\CT483" );
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( 0005 );
vtkImagePlaneWidget planeWidgetX = vtkImagePlaneWidget::New();
planeWidgetX->SetInteractor( iren );
planeWidgetX->SetKeyPressActivationValue( 'x' );
planeWidgetX->SetPicker( picker );
planeWidgetX->RestrictPlaneToVolumeOn();
planeWidgetX->GetPlaneProperty()->SetColor( 00, 00, 10 );
planeWidgetX->DisplayTextOn();
//planeWidgetX->TextureInterpolateOn();
planeWidgetX->TextureInterpolateOff();
planeWidgetX->SetResliceInterpolateToLinear();
planeWidgetX->SetInputData( (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( 10, 00, 00 );
planeWidgetY->DisplayTextOn();
planeWidgetY->TextureInterpolateOn();
planeWidgetY->SetResliceInterpolateToLinear();
planeWidgetY->SetInputData( (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( 00, 10, 00 );
planeWidgetZ->TextureInterpolateOn();
planeWidgetZ->SetResliceInterpolateToLinear();
planeWidgetZ->SetInputData( (vtkDataSet)DicomReader->GetOutput() );
planeWidgetZ->SetPlaneOrientationToZAxes();
planeWidgetZ->SetSliceIndex( 200 );
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->SetInputData( (vtkDataSet)planeWidgetX->GetResliceOutput() );
colorMap1->SetLookupTable( (vtkScalarsToColors )planeWidgetX->GetLookupTable() );
vtkImageActor imageActor1 = vtkImageActor::New();
imageActor1->PickableOff();
imageActor1->SetInputData( colorMap1->GetOutput() );
vtkImageMapToColors colorMap2 = vtkImageMapToColors::New();
colorMap2->PassAlphaToOutputOff();
colorMap2->SetActiveComponent( 0 ); // for muti-component
colorMap2->SetOutputFormatToLuminance();
colorMap2->SetInputData( (vtkDataSet)planeWidgetY->GetResliceOutput() );
colorMap2->SetLookupTable( (vtkScalarsToColors )planeWidgetX->GetLookupTable() );
vtkImageActor imageActor2 = vtkImageActor::New();
imageActor2->PickableOff();
imageActor2->SetInputData( colorMap2->GetOutput() );
vtkImageMapToColors colorMap3 = vtkImageMapToColors::New();
colorMap3->PassAlphaToOutputOff();
colorMap3->SetActiveComponent( 0 );
colorMap3->SetOutputFormatToLuminance();
colorMap3->SetInputData( (vtkDataSet)planeWidgetZ->GetResliceOutput() );
colorMap3->SetLookupTable( (vtkScalarsToColors )planeWidgetX->GetLookupTable());
vtkImageActor imageActor3 = vtkImageActor::New();
imageActor3->PickableOff();
imageActor3->SetInputData( colorMap3->GetOutput() );
ren->AddActor( DicomActor ); //outline
ren1->AddActor( imageActor1 );
ren2->AddActor( imageActor2 );
ren3->AddActor( imageActor3 );
// OK
ren->SetBackground( 03, 03, 06 );
ren1->SetBackground( 10, 00, 00 );
ren2->SetBackground( 00, 10, 00 );
ren3->SetBackground( 00, 00, 10 );
renWin->SetSize( 1000, 1000 );
ren->SetViewport( 0, 05, 05, 1 );
ren1->SetViewport( 05, 05, 1, 1 );
ren2->SetViewport( 0, 0, 05, 05 );
ren3->SetViewport( 05, 0, 1, 05 );
iren->Initialize();
iren->Start();
renWin->Render();
}
int main()
{
Test_02();
return 0;
}
以上就是关于vtkpolydata的单元Id和法向量如何获取全部的内容,包括:vtkpolydata的单元Id和法向量如何获取、在VTK中怎么取Volume的切片、vtkAxesActor设置坐标系怎么改变坐标轴上X,Y和Z的颜色等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)