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渲染窗口中,过程一闪而过,很明显;
- 滚轮向上滚动时,先放大,然后才翻页;
- 没有铺满整个窗口;