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[1],
                        dim[0],
                        CV_8UC3,
                        windowToImageFilter->GetOutput()->GetScalarPointer());

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

首先我们要获得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的转换完成。

猜你喜欢

转载自blog.csdn.net/wzheng92/article/details/80724424
今日推荐