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
- vtkImageData转化为cv::Mat
- vtkImageData转换成cv::Mat
- 把cv::Mat转化为QImage
- OpenCV学习(2)--cv::Mat转化为QImage
- QPixmap Qimage cv::mat转化
- OpenCV中IplImage*转化为cv::mat时出现的问题
- IplImage和cv::Mat的转化
- qimage 与cv::mat 转化--> QPixmap
- 把QImage转换为cv::Mat
- vector转化为Mat矩阵
- opencv cv::MAT 和 QT QImage 相互转化代码
- cv::Mat和CvMat的区别及相互转化
- cv::Mat和std::vector的相互转化
- cv...Mat...
- cv:Mat
- cv::mat
- cv:mat
- cv::Mat
- Mat、cvMat与IplImage
- 前端开发必须知道的ES6的十大特征
- |洛谷|贪心|P2813 母舰
- 数据挖掘10大算法及详解
- 基础总结篇之:Intent详细介绍
- vtkImageData转化为cv::Mat
- eclipse常用的快捷键--------(真正常用的)
- 前端学习(20161016-1022)
- ASCII码表
- Lasso算法理论介绍
- Python 断言assert用法
- 模拟网页行为之实践篇
- Logistic回归
- 4850. 【GDOI2017模拟11.3】记忆的轮廓