vtkImageData转化为cv::Mat

来源:互联网 发布:交通组织优化定义 编辑:程序博客网 时间:2024/06/05 00:28

         前面用opencv实现了基于凹点匹配重叠图像分割(凹点匹配分割)。现在因为项目要求要在VTK中完成类似的功能,但是VTK主要是做三维可视化方面,但是图像分析上就差一些。现希望通过数据格式转换来时这两中库包有机结合使用。最简单的一种方法就以访问像素的方式,一点点将vtkImageData像素全部复制到Mat中,下面介绍另一种方法:

描述:通过vtk来读图和显示,中间使用Opencv做图像处理:

cv::Mat vtkImage2Mat(vtkImageData *image);vtkImageData* Mat2vtkImage(cv::Mat &image);int main(int argc, char *argv[]){    QCoreApplication a(argc, argv);    //[1] --read image    QString str="F:/bw_0034.png";    QByteArray ba=str.toLocal8Bit();    const char *fileName=ba.data();    vtkSmartPointer<vtkPNGReader> reader            =vtkSmartPointer<vtkPNGReader>::New();    if(!reader->CanReadFile(fileName))    {        qDebug()<<"can not reader!";        return a.exec();    }    reader->SetFileName(fileName);    reader->Update();    //[1]    //[2] --灰度化    vtkSmartPointer<vtkImageLuminance> luninanceFilter=            vtkSmartPointer<vtkImageLuminance>::New();    luninanceFilter->SetInputConnection(reader->GetOutputPort());    luninanceFilter->Update();    //[2]    cv::Mat matSrc;    matSrc=vtkImage2Mat(luninanceFilter->GetOutput()); cv::threshold(matSrc,matSrc,127,255,CV_THRESH_BINARY); vtkSmartPointer<vtkImageActor> imgActor=            vtkSmartPointer<vtkImageActor>::New();    imgActor->SetInputData(lunianceFilter->getOutPut());    vtkSmartPointer<vtkRenderer> renderer =            vtkSmartPointer<vtkRenderer>::New();    renderer->AddActor(imgActor);    renderer->SetBackground(1.0, 1.0, 1.0);    vtkSmartPointer<vtkRenderWindow> renderWindow =            vtkSmartPointer<vtkRenderWindow>::New();    renderWindow->AddRenderer(renderer);    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =            vtkSmartPointer<vtkRenderWindowInteractor>::New();    renderWindowInteractor->SetRenderWindow(renderWindow);    renderWindow->SetSize(640, 320);    renderWindow->Render();    renderWindow->SetWindowName("contour extract");    renderWindow->Render();    renderWindowInteractor->Start();}// vtkImageData==>Matcv::Mat vtkImage2Mat(vtkImageData *image){    int dim[3];    image->GetDimensions(dim);    int imgType=CV_8UC1;    if(image->GetNumberOfScalarComponents()==1)        imgType=CV_8UC1;    if(image->GetNumberOfScalarComponents()==3)        imgType=CV_8UC3;    cv::Mat matSrc(dim[1],dim[0],imgType,image->GetScalarPointer());    return matSrc;}


描述:

这种形式转化是创建一个Mat类型的矩阵头,然后用指针指向图像数据首地址。不存在数据复制,提高了效率。同时,其后续任何处理过程都是在原数据中做处理,用vtk显示时候只需要把一开始读入的图像显示出来就可以看到处理后的效果。

实际操作时候,发现传递给Mat类型的数据必须是灰度图像,如果是彩色图像,使用Opencv灰度变化函数不能正确处理。



1 0
原创粉丝点击