QT+VTK: 如何在QT中显示VTK生成的图像

本文由Markdown语法编辑器编辑完成。

1. 背景:

在医疗软件的开发中,QT和VTK是经常配合使用的。基于QT,可以快速地搭建出软件的图像窗口、按钮、工具栏和状态栏;基于VTK(还有DCMTK,ITK等),则可以实现医学图像的基本读取和处理。VTK的渲染窗口是其内部的一个类vtkRenderWindow,响应鼠标事件是通过vtkRenderWindowInteractor。

那么如何实现将基于VTK渲染在vtkRenderWindow中的图像显示在QT的控件(QWidget, QImage,QLabel等)中呢。

这里介绍两种思路。

2. QT与VTK联合显示图像:

2.1 借助QVTKWidget:

2.2 图像按字节拷贝:

这种方法的基本思路是:在内存中创建一套VTK渲染图像的管道机制,但是使vtkRenderWindow不显示,只是存在于内存中。当图像渲染完毕后,将vtkRenderWindow中的图像通过filter,截取出来,然后再按字节逐一拷贝到提前创建好的QImage中。

vtkSmartPointer<vtkRenderWindow> m_spRenderWindow = vtkSmartPointer<vtkRenderWindow>::New();
m_spRenderWindow->OffScreenRenderingOn();
vtkSmartPointer<vtkScalarsToColors> = m_spLookupTable = vtkSmartPointer<vtkScalarsToColors>::New();
vtkSmartPointer<vtkRenderer> m_spRenderer = 
vtkSmartPointer<vtkRenderer>::New();

vtkSmartPointer<vtkImageMapToColors> m_spImageMapToColors = vtkSmartPointer<vtkImageMapToColors>::New();
m_spImageMapToColors->SetInputData(m_spImage);
m_spImageMapToColors->SetLookupTable(m_spLookupTable);

vtkSmartPointer<vtkImageActor> m_spImageActor = 
vtkSmartPointer<vtkImageActor>::New();
m_spImageActor->GetMapper()->SetInputConnection(m_spImageMapToColors->GetOutputPort());
m_spRenderer->GetActiveCamera()->ParallelProjectionOn();
m_spRenderer->AddActor(m_spImageActor);
m_spRenderWindow->AddRenderer(m_spRenderer);
m_spRenderWindow->Render();

vtkSmartPointer<vtkWindowToImageFilter> windowToImageFilter = 
vtkSmartPointer<vtkWindowToImageFilter>::New();
windowToImageFilter->SetInput(m_spRenderWindow);
windowToImageFilter->SetInputBufferTypeToRGBA();
windowToImageFilter->Update();

vtkImageData *output=windowToImageFilter->GetOutput();
DxImageExtent extent;
output->GetExtent(extent.GetPointer());
void *startPointer=output->GetScalarPointer(extent.XMin(),extent.YMin(),extent.ZMin());

QImage m_displayImage;
memcpy(m_displayImage.bits(),startPointer,m_displayImage.byteCount());
m_displayImage=m_displayImage.rgbSwapped();

未完待续……

你可能感兴趣的:(VTK,Qt,医学影像处理)