1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > VTK系列70_VTK对MHD格式文件单张切片的鼠标滑动提取显示

VTK系列70_VTK对MHD格式文件单张切片的鼠标滑动提取显示

时间:2022-04-11 08:24:38

相关推荐

VTK系列70_VTK对MHD格式文件单张切片的鼠标滑动提取显示

实例11:基于VTK对MHD格式文件单张切片的鼠标滑动提取显示

#include "vtkAutoInit.h" VTK_MODULE_INIT(vtkRenderingOpenGL2);VTK_MODULE_INIT(vtkInteractionStyle);#include <vtkSmartPointer.h>#include <vtkImageReader2.h>#include <vtkMatrix4x4.h>#include <vtkImageReslice.h>#include <vtkLookupTable.h>#include <vtkImageMapToColors.h>#include <vtkImageActor.h>#include <vtkRenderer.h>#include <vtkRenderWindow.h>#include <vtkRenderWindowInteractor.h>#include <vtkInteractorStyleImage.h>#include <vtkCommand.h>#include <vtkImageData.h>#include <vtkMetaImageReader.h>#include <vtkImageCast.h>class vtkImageInteractionCallback : public vtkCommand{public:static vtkImageInteractionCallback* New(){return new vtkImageInteractionCallback;}vtkImageInteractionCallback(){this->Slicing = 0;this->ImageReslice = 0;this->Interactor = 0;}void SetImageReslice(vtkImageReslice* reslice){this->ImageReslice = reslice;}void SetImageMapToColors(vtkImageMapToColors* mapToColors){this->mapToColors = mapToColors;}vtkImageReslice* GetImageReslice(){return this->ImageReslice;}void SetInteractor(vtkRenderWindowInteractor* interactor){this->Interactor = interactor;}vtkRenderWindowInteractor* GetInteractor(){return this->Interactor;}virtual void Execute(vtkObject*, unsigned long event, void*){vtkRenderWindowInteractor* interactor = this->GetInteractor();int lastPos[2];interactor->GetLastEventPosition(lastPos);int currPos[2];interactor->GetEventPosition(currPos);if (event == vtkCommand::LeftButtonPressEvent){this->Slicing = 1;}else if (event == vtkCommand::LeftButtonReleaseEvent){this->Slicing = 0;}else if (event == vtkCommand::MouseMoveEvent){if (this->Slicing){vtkImageReslice* reslice = this->ImageReslice;// Increment slice position by deltaY of mouseint deltaY = lastPos[1] - currPos[1];reslice->Update();double sliceSpacing = reslice->GetOutput()->GetSpacing()[2];vtkMatrix4x4* matrix = reslice->GetResliceAxes();// move the center point that we are slicing throughdouble point[4];double center[4];point[0] = 0.0;point[1] = 0.0;point[2] = sliceSpacing * deltaY;point[3] = 1.0;matrix->MultiplyPoint(point, center);matrix->SetElement(0, 3, center[0]);matrix->SetElement(1, 3, center[1]);matrix->SetElement(2, 3, center[2]);mapToColors->Update();interactor->Render();}else{vtkInteractorStyle* style = vtkInteractorStyle::SafeDownCast(interactor->GetInteractorStyle());if (style){style->OnMouseMove();}}}}private:int Slicing;vtkImageReslice* ImageReslice;vtkRenderWindowInteractor* Interactor;vtkImageMapToColors* mapToColors;};int main(){vtkSmartPointer<vtkMetaImageReader> reader =vtkSmartPointer<vtkMetaImageReader>::New();reader->SetFileName("brain.mhd");reader->Update();int extent[6];double spacing[3];double origin[3];reader->GetOutput()->GetExtent(extent);reader->GetOutput()->GetSpacing(spacing);reader->GetOutput()->GetOrigin(origin);double center[3];center[0] = origin[0] + spacing[0] * 0.5 * (extent[0] + extent[1]);center[1] = origin[1] + spacing[1] * 0.5 * (extent[2] + extent[3]);center[2] = origin[2] + spacing[2] * 0.5 * (extent[4] + extent[5]);static double axialElements[16] = {1, 0, 0, 0,0, 1, 0, 0,0, 0, 1, 0,0, 0, 0, 1};vtkSmartPointer<vtkMatrix4x4> resliceAxes =vtkSmartPointer<vtkMatrix4x4>::New();resliceAxes->DeepCopy(axialElements);resliceAxes->SetElement(0, 3, center[0]);resliceAxes->SetElement(1, 3, center[1]);resliceAxes->SetElement(2, 3, center[2]);vtkSmartPointer<vtkImageReslice> reslice =vtkSmartPointer<vtkImageReslice>::New();reslice->SetInputConnection(reader->GetOutputPort());reslice->SetOutputDimensionality(2);reslice->SetResliceAxes(resliceAxes);reslice->SetInterpolationModeToLinear();vtkSmartPointer<vtkLookupTable> colorTable =vtkSmartPointer<vtkLookupTable>::New();colorTable->SetRange(0, 1000);colorTable->SetValueRange(0.0, 1.0);colorTable->SetSaturationRange(0.0, 0.0);colorTable->SetRampToLinear();colorTable->Build();vtkSmartPointer<vtkImageMapToColors> colorMap =vtkSmartPointer<vtkImageMapToColors>::New();colorMap->SetLookupTable(colorTable);colorMap->SetInputConnection(reslice->GetOutputPort());colorMap->Update();vtkSmartPointer<vtkImageActor> imgActor =vtkSmartPointer<vtkImageActor>::New();imgActor->SetInputData(colorMap->GetOutput());vtkSmartPointer<vtkRenderer> renderer =vtkSmartPointer<vtkRenderer>::New();renderer->AddActor(imgActor);renderer->SetBackground(1, 1, 1);vtkSmartPointer<vtkRenderWindow> renderWindow =vtkSmartPointer<vtkRenderWindow>::New();renderWindow->SetSize(500, 500);renderWindow->AddRenderer(renderer);vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =vtkSmartPointer<vtkRenderWindowInteractor>::New();vtkSmartPointer<vtkInteractorStyleImage> imagestyle =vtkSmartPointer<vtkInteractorStyleImage>::New();renderWindowInteractor->SetInteractorStyle(imagestyle);renderWindowInteractor->SetRenderWindow(renderWindow);renderWindowInteractor->Initialize();vtkSmartPointer<vtkImageInteractionCallback> callback =vtkSmartPointer<vtkImageInteractionCallback>::New();callback->SetImageReslice(reslice);callback->SetInteractor(renderWindowInteractor);callback->SetImageMapToColors(colorMap);imagestyle->AddObserver(vtkCommand::MouseMoveEvent, callback);imagestyle->AddObserver(vtkCommand::LeftButtonPressEvent, callback);imagestyle->AddObserver(vtkCommand::LeftButtonReleaseEvent, callback);renderWindowInteractor->Start();return EXIT_SUCCESS;}

用到的MHD文件:

效果(鼠标在切片区域左键一直按住右或左拖动(或上下拖动),即可更换不同切片显示):

注:此例程MHA和NII格式文件同样适用。

本例程配套素材见源码整理文章下载(点击进入)

VTK系列目录:

1 VTK基本概念

2 VTK图像处理

3 VTK图形处理

4 VTK体绘制

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。