天天看點

vtkImageData轉換為cv::Mat

在使用VTK的過程中,我們經常需要用vtkWindowToImageFilter對象來輸出渲染結果到圖檔。如果我們需要用OpenCV對圖像進行進一步的處理和運用,需要先将其轉換為cv::Mat形式。本文将介紹如何将vtkImageData轉換為cv::Mat。

核心的代碼如下:

int dim[3];
    windowToImageFilter->GetOutput()->GetDimensions(dim);
    // convert vtkImageData to cv::Mat
    cv::Mat renderedImg(dim[],
                        dim[],
                        CV_8UC3,
                        windowToImageFilter->GetOutput()->GetScalarPointer());

    cv::cvtColor(renderedImg, renderedImg, CV_BGR2GRAY);
    cv::flip(renderedImg, renderedImg, );
           

首先我們要獲得vtk圖檔尺寸,也就是代碼段前兩行。

之後我們利用指針接口建立一個cv::Mat對象。注意,VTK的尺寸按照x, y, z的順序存儲,而cv::Mat按照rows (對應y), cols (對應x)的順序存儲。是以這裡是先

dim[1]

dim[0]

。VTK輸出的是unsign char三通道資料,是以對應的,這裡我們設定cv::Mat的格式為”CV_8UC3”。最後一個參數也就是把VTK圖檔的位址值指定給Mat的指針。是以,這一個轉換過程沒有發生複制或占用新的記憶體空間,而僅僅是對一段記憶體資料做一個新的指向和解讀,是以速度非常快。

然後使用

cvtColor()

完成向灰階圖的轉化。這一步并不非必要。當然,也可以在VTK中進行灰階轉化,然後在上一步使用”CV_8UC1”。但是據我觀察,opencv轉換更快。

最後還要記得用

cv::flip()

翻轉圖檔,因為圖像在VTK模式下縱坐标方向朝上(0行在最下面),而OpenCV下縱坐标朝下(0行在最上面),是以需要沿水準軸翻轉。至此vtkImageData向為cv::Mat的轉換完成。

繼續閱讀