当前位置:网站首页>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;
}
边栏推荐
- Micro task, macro task and event loop of JS
- [transfer]placement NEW
- Advantages and disadvantages of single page development and multi page development
- 2021-11-16
- Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference
- ACE配置IPv6, VS静态编译ACE库
- Start with Xiaobai, take the weight parameter from the trained model and draw the histogram
- Rust language learning
- Traditional DOM rendering?
- LDAP和SSO集成能实现什么效果?
猜你喜欢

InfluxDB2.x 基准测试工具 - influxdb-comparisons

Point cloud registration -- GICP principle and its application in PCL

VGG小卷积代替大卷积 VS 深度可分离卷积

SEO optimization of web pages

Invalid date of moment conversion timestamp

Promise understanding has used promise to realize picture preloading (sequential loading)

轻量化---Project

Dom and BOM in JS

Numpy数值计算基础

Video speed doubling in PC browser
随机推荐
for in 与Object.keys()的区别
Ace configures IPv6, vs statically compiles ace Library
DOM+JS+轮播图+无时间
Visio 2019 uses PJ
Is yuancosmos a short-term speculation or a future trend?
vant 标签栏+上拉加载+下拉刷新demo van-tabs+van-pull-refresh+van-list demo
What is modularity? Benefits of modularity
Shielding does not display vs warning
【VIM】.vimrc配置,已经安装Vundle,YoucompleteMe
【您编码,我修复】WhiteSource正式更名为Mend
2021-11-16
WebStorage
[转]placement new
Congratulations to splashtop for winning the 2022 it Europa "vertical application solution of the year" award
[译] Go语言测试进阶版建议与技巧
Stress - system pressure simulation tool
C语言进阶篇——浮点型在内存中的存储
【Leetcode】416. Split equal sum subset
NewOJ Week 10题解
大学生请假理由