MPR多平面重建的初步实现
一、功能概述
- 用三个窗口分别显示冠状位、矢状位、横断位的切面图像;
- 左键按住调节窗宽;
- 右键按住缩放;
- 中键按住平移;
- 滚轮滚动时翻页;
二、代码实现
class mprVtkInteractorStyleImage : public vtkInteractorStyleImage
{
public:static mprVtkInteractorStyleImage* New();vtkTypeMacro(mprVtkInteractorStyleImage, vtkInteractorStyleImage);protected:vtkImageViewer2* _imageViewer;int _slice;int _minSlice;int _maxSlice;public:void SetImageViewer(vtkImageViewer2* imageViewer){_imageViewer = imageViewer;_minSlice = imageViewer->GetSliceMin();_maxSlice = imageViewer->GetSliceMax();_slice = imageViewer->GetSlice();}void MoveSliceForward(){if(_slice < _maxSlice){_slice += 1;_imageViewer->SetSlice(_slice);_imageViewer->Render();}}void MoveSliceBackward(){if(_slice > _minSlice){_slice -= 1;_imageViewer->SetSlice(_slice);_imageViewer->Render();}}virtual void OnKeyDown() override{string key = this->GetInteractor()->GetKeySym();if(key.compare("Up") == 0){MoveSliceForward();}else if(key.compare("Down") == 0){MoveSliceBackward();}}virtual void OnMouseWheelForward() override{MoveSliceForward();}virtual void OnMouseWheelBackward() override{if(_slice > _minSlice){MoveSliceBackward();}}
};vtkStandardNewMacro(mprVtkInteractorStyleImage);
vtkSmartPointer<vtkImageViewer2> viewX;
vtkSmartPointer<vtkImageViewer2> viewY;
vtkSmartPointer<vtkImageViewer2> viewZ;
vtkSmartPointer<mprVtkInteractorStyleImage> mprInteractorStyleX;
vtkSmartPointer<mprVtkInteractorStyleImage> mprInteractorStyleY;
vtkSmartPointer<mprVtkInteractorStyleImage> mprInteractorStyleZ;
void MainWindow::on_dataLoad_pB_clicked()
{QString path = QFileDialog::getExistingDirectory(this,"请选择文件夹路径...","D:/S100/");vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New();reader->SetDirectoryName(path.toStdString().c_str());reader->Update();vtkSmartPointer<vtkImageData> imageData = reader->GetOutput();viewX = vtkSmartPointer<vtkImageViewer2>::New();viewX->SetInputData(imageData);viewX->SetSliceOrientation(0);vtkSmartPointer<vtkRenderWindow> renderWindowX = this->ui->openGLWidget_MPR_X->renderWindow();viewX->SetRenderWindow(renderWindowX);viewX->SetColorLevel(25);viewX->SetColorWindow(3000);mprInteractorStyleX = vtkSmartPointer<mprVtkInteractorStyleImage>::New();mprInteractorStyleX->SetImageViewer(viewX);vtkSmartPointer<vtkRenderWindowInteractor> interactorX = vtkSmartPointer<vtkRenderWindowInteractor>::New();interactorX->SetRenderWindow(renderWindowX);viewX->SetupInteractor(interactorX);interactorX->SetInteractorStyle(mprInteractorStyleX);interactorX->Initialize();viewX->Render();viewX->GetRenderer()->ResetCamera();viewY = vtkSmartPointer<vtkImageViewer2>::New();viewY->SetInputData(imageData);viewY->SetSliceOrientation(1);vtkSmartPointer<vtkRenderWindow> renderWindowY = this->ui->openGLWidget_MPR_Y->renderWindow();viewY->SetRenderWindow(renderWindowY);viewY->SetColorLevel(25);viewY->SetColorWindow(3000);mprInteractorStyleY = vtkSmartPointer<mprVtkInteractorStyleImage>::New();mprInteractorStyleY->SetImageViewer(viewY);vtkSmartPointer<vtkRenderWindowInteractor> interactorY = vtkSmartPointer<vtkRenderWindowInteractor>::New();interactorY->SetRenderWindow(renderWindowY);viewY->SetupInteractor(interactorY);interactorY->SetInteractorStyle(mprInteractorStyleY);interactorY->Initialize();viewY->Render();viewY->GetRenderer()->ResetCamera();viewZ = vtkSmartPointer<vtkImageViewer2>::New();viewZ->SetInputData(imageData);viewZ->SetSliceOrientation(2);vtkSmartPointer<vtkRenderWindow> renderWindowZ = this->ui->openGLWidget_MPR_Z->renderWindow();viewZ->SetRenderWindow(renderWindowZ);viewZ->SetColorLevel(25);viewZ->SetColorWindow(3000);mprInteractorStyleZ = vtkSmartPointer<mprVtkInteractorStyleImage>::New();mprInteractorStyleZ->SetImageViewer(viewZ);vtkSmartPointer<vtkRenderWindowInteractor> interactorZ = vtkSmartPointer<vtkRenderWindowInteractor>::New();interactorZ->SetRenderWindow(renderWindowZ);viewZ->SetupInteractor(interactorZ);interactorZ->SetInteractorStyle(mprInteractorStyleZ);interactorZ->Initialize();viewZ->Render();viewZ->GetRenderer()->ResetCamera();
}
三、显示结果

四、遗留问题
- 先在外面创建窗口,再嵌入到QT渲染窗口中,过程一闪而过,很明显;
- 滚轮向上滚动时,先放大,然后才翻页;
- 没有铺满整个窗口;
- 没有十字标线;