QVTKWidget控件顯示三維圖片

QVTKWidget控件一般顯示二維圖片,如果要顯示三維圖片,並通過鼠標滾輪切換單張圖片,則需要加入監聽機制,可以自定義一個類來實現所需要的交互方式,該類可以繼承於vtkCommand類。

(1)定義鼠標滾輪交互方式,用於顯示下一張切片

class vtkNextSliceCallbk : public vtkCommand
{
private:
    vtkRenderWindowInteractor *Interactor;
    vtkImageViewer2* viewer;
    vtkInteractorStyleImage* style;

public:
    static vtkNextSliceCallbk *New()
    {
        return new vtkNextSliceCallbk;
    }

    vtkNextSliceCallbk()//構造函數
    {
        this->Interactor = 0;
    }

    void SetInteractorStyle(vtkInteractorStyleImage* style)
    {
        this->style = style;
    }

    void SetInteractor(vtkRenderWindowInteractor *interactor)
    {
        this->Interactor = interactor;
    }

    vtkRenderWindowInteractor *GetInteractor()
    {
        return this->Interactor;
    }

    void SetViewer(vtkImageViewer2* viewer)
    {
        this->viewer = viewer;
    }

    virtual void Execute(vtkObject *caller, unsigned long eventId, void *callData)
    {
        int max = viewer->GetSliceMax();//獲得最大切片數目,避免翻頁超出範圍//63,從0開始
        int cur = viewer->GetSlice();//獲得當前切片
        if (eventId == vtkCommand::MouseWheelForwardEvent && cur >= 0)//向前翻頁
        {
            if(cur == 0)//切換到第一張,滾輪繼續向前,保持顯示第一張切片
                viewer->SetSlice(0);
            else
                viewer->SetSlice(--cur);
            viewer->SetSliceOrientationToXY();
            Interactor->SetInteractorStyle((vtkInteractorObserver *)style);
        } 
        if (eventId == vtkCommand::MouseWheelBackwardEvent &&  cur  <= max)//向後翻頁
        {
            if(cur == max)//切換到最後一張,滾輪繼續向後,保持顯示最後一張切片
                viewer->SetSlice(max);
            else
                viewer->SetSlice(++cur);
            viewer->SetSliceOrientationToXY();
            Interactor->SetInteractorStyle((vtkInteractorObserver *)style);
        }
    }
};

(2) 讀入MHD三維醫學圖片,通過滾輪切換單張圖片,源碼如下:

    mhdReader = vtkMetaImageReader::New();
    mhdReader->SetFileName(inputFileName);
    mhdReader->Update();
    //統計最大最小灰度值 (或者數據類型),自適應設置窗寬&窗位
    //當灰度值高於該範圍的最大值時,均以白影顯示;而低於該範圍時均顯示爲黑色
    dataType =  mhdReader->GetDataScalarType();//獲得數據類型
    imgSize = mhdReader->GetOutput()->GetExtent();//顯示圖像尺寸
    rotate = vtkImageFlip::New();//圖像反轉
    rotate->SetInputConnection(mhdReader->GetOutputPort());
    rotate->SetFilteredAxis(1);//y軸反轉
    originalVtkViewer->SetInputConnection(rotate->GetOutputPort());
    //交互
    renWinInteractor = vtkRenderWindowInteractor::New();
    originalVtkViewer->SetRenderer(originalRenderder);//設置爲同一個渲染場景
    originalVtkViewer->SetRenderWindow(ui->originalQVTKViewer->GetRenderWindow());
    pCall = vtkNextSliceCallbk::New();//實例化自定義類
    style = vtkInteractorStyleImage::New();
    style->AddObserver(vtkCommand::MouseWheelBackwardEvent, pCall); 
    style->AddObserver(vtkCommand::MouseWheelForwardEvent, pCall);
    renWinInteractor->SetInteractorStyle(style);
    renWinInteractor->AddObserver(vtkCommand::MouseWheelBackwardEvent, pCall);//通過交互窗口去監聽
    renWinInteractor->AddObserver(vtkCommand::MouseWheelForwardEvent, pCall);
    pCall->SetInteractorStyle(style);
    pCall->SetViewer(originalVtkViewer);
    pCall->SetInteractor(renWinInteractor);
    ui->originalQVTKViewer->GetRenderWindow()->SetInteractor(renWinInteractor);
    originalVtkViewer->SetupInteractor(ui->originalQVTKViewer->GetRenderWindow()->GetInteractor());//設置交互方式
    originalVtkViewer->SetSliceOrientationToXY();//設置切片方向
    originalVtkViewer->SetColorLevel(128);//窗位
    originalVtkViewer->SetColorWindow(256);//窗寬

QVTKWidget控件顯示三維圖片效果如下:

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章