当前位置:网站首页>vtk 图像序列鼠标交互翻页
vtk 图像序列鼠标交互翻页
2022-06-12 12:25:00 【4月16!】
读一组dcm图像,鼠标交互翻页,取点
#include <vtkAbstractPicker.h>
#include <itkGDCMImageIO.h>
#include <itkGDCMSeriesFileNames.h>
#include <itkImageSeriesReader.h>
#include <vtkPolyDataMapper.h>
#include <vtkImageData.h>
#include <vtkProperty.h>
#include <vtkRendererCollection.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkSmartPointer.h>
#include <vtkMetaImageReader.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkMarchingCubes.h>
#include <vtkStripper.h>
#include <vtkDecimatePro.h>
#include <vtkSmoothPolyDataFilter.h>
#include <vtkPolyDataNormals.h>
#include <vtkActor.h>
#include <vtkImageActor.h>
#include <vtkTriangleFilter.h>
#include <vtkMassProperties.h>
#include <vtkDICOMImageReader.h>
#include <vtkImageViewer2.h>
#include <vtkInteractorStyleImage.h>
#include <vtkCornerAnnotation.h>
#include <vtkAbstractMapper3D.h>
#include <vtkInteractorStyleImage.h>
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
#include <vtkTextProperty.h>
typedef int16_t PixelType;
typedef itk::Image< PixelType, 3 > ImageType;
class Interactor : public vtkInteractorStyleTrackballCamera {
protected:
vtkImageViewer2 *Viewer;
int CurrentSliceNum = 1;
int num = 0;
int SliceNum;
ImageType::SizeType Dim;
ImageType::SpacingType Spacing;
ImageType::PointType origin;
ImageType::Pointer Image;
ImageType::IndexType point_tempx;
public:
static Interactor *New();
vtkTypeMacro(Interactor, vtkInteractorStyleTrackballCamera);
void SetViewer(vtkImageViewer2 *viewer) { this->Viewer = viewer; }
void SetImage(ImageType::Pointer ima) {
Image = ima;
Spacing = Image->GetSpacing();
origin = Image->GetOrigin();
Dim = Image->GetLargestPossibleRegion().GetSize();
SliceNum = Dim[2];
}
void OnMouseWheelForward() override {
//+
if (CurrentSliceNum < SliceNum) CurrentSliceNum++;
this->Viewer->SetSlice(CurrentSliceNum);
this->Viewer->GetRenderer()->ResetCamera(); // need
}
void OnMouseWheelBackward() override {
//-
if (CurrentSliceNum > 1) CurrentSliceNum--;
this->Viewer->SetSlice(CurrentSliceNum);
this->Viewer->GetRenderer()->ResetCamera(); // need
}
void OnLeftButtonDown() override {
this->Interactor->GetPicker()->Pick(this->Interactor->GetEventPosition()[0],
this->Interactor->GetEventPosition()[1],
0, // always zero.
this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer());
double world_pos[3];
this->Interactor->GetPicker()->GetPickPosition(world_pos);
point_tempx[0] = (world_pos[0] - origin[0]) / Spacing[0];
point_tempx[1] = (world_pos[1] - origin[1]) / Spacing[1];
point_tempx[2] = (world_pos[2] - origin[2]) / Spacing[2];
this->Viewer->GetRenderWindow()->GetInteractor()->Render();
vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
}
void OnKeyDown() override {
std::string key = this->GetInteractor()->GetKeySym();
if (key.compare("Left") == 0)
{
// do something
}
}
~Interactor() {}
};
vtkStandardNewMacro(Interactor);
#include <vtkPointPicker.h>
#include"itkImageToVTKImageFilter.h"
int main() {
// read dcm
//also can be read using vtk
std::string dicom_path = "D:/xiaoxue/CTdata/mask/3Dircadb1.14/PATIENT_DICOM";
ImageType::Pointer inputImg = LoadDicom<ImageType>(dicom_path);
typedef itk::ImageToVTKImageFilter< ImageType > itkTovtkFilterType;
auto itkTovtkImageFilter_Liver = itkTovtkFilterType::New();
itkTovtkImageFilter_Liver->SetInput(inputImg);
itkTovtkImageFilter_Liver->Update();
vtkNew<vtkPointPicker> pointPicker;
vtkSmartPointer<vtkImageViewer2> viewer =
vtkSmartPointer<vtkImageViewer2>::New();
viewer->SetInputData(itkTovtkImageFilter_Liver->GetOutput());
viewer->SetSize(800, 800);
viewer->SetSliceOrientationToXY();
viewer->GetRenderer()->SetBackground(1, 1, 1);
vtkSmartPointer<vtkRenderWindowInteractor> rwi =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
rwi->SetPicker(pointPicker);
viewer->SetupInteractor(rwi);
vtkSmartPointer<Interactor> imagestyle =
vtkSmartPointer<Interactor>::New();
imagestyle->SetViewer(viewer);
imagestyle->SetImage(inputImg);
rwi->SetInteractorStyle(imagestyle);
viewer->Render();
rwi->Start();
return 0;
}
边栏推荐
- 屏蔽不显示VS警告warning
- Win7 registers out of process components, services, and COM component debugging
- NDT配准原理
- 时序数据库 - InfluxDB2 docker 安装
- Records of gdcpc Guangdong Provincial Games in 22 years
- 鸡尾酒排序
- Bat interview & advanced, get interview materials at the end of the text
- 一个ES设置操作引发的“血案”
- bind、call、apply三者的区别,还有bind()的封装
- Visio 2019 uses PJ
猜你喜欢
随机推荐
About message
golang的channel和条件变量在单生产单消费场景下的性能对比测试
Point cloud registration -- GICP principle and its application in PCL
Stress - system pressure simulation tool
服务端渲染与客户端渲染的区别(优缺点)
鸡尾酒排序
What is modularity? Benefits of modularity
导航中,添加边框影响布局的解决方法
Macro compilation preprocessing header Win32_ LEAN_ AND_ MEAN
In navigation, the solution of adding borders to affect the layout
开源项目-(ERP+酒店+电商)后台管理系统
object. Defineproperty basic usage
Micro task, macro task and event loop of JS
TRON-api-波场转账查询接口-PHP版本-基于ThinkPHP5封装-附带接口文档-20220602版本-接口部署好适用于任何开发语言
Numpy数值计算基础
What can LDAP and SSO integration achieve?
轻量化---Project
Tron API wave field transfer query interface PHP version package based on thinkphp5 attached interface document 20220602 version deployed interface applicable to any development language
Beyondcompare 4 uses PJ
拿来就能用的网页动画特效,不来看看?









