vtkImageData转化为cv::Mat
2016-11-14 22:02
1431 查看
前面用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==>Mat
cv::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灰度变化函数不能正确处理。
描述:通过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==>Mat
cv::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灰度变化函数不能正确处理。
相关文章推荐
- vtkImageData转换成cv::Mat
- opencv cv::MAT 和 QT QImage 相互转化代码
- vtkDataObject 与vtkImageData
- vtkImageData处理之阈值分割
- cv::Mat和CvMat的区别及相互转化
- 【VTK】vtkImagedata像素值的访问与修改
- 把cv::Mat转化为QImage
- OpenCV的cvReleaseImage释放内存出错解决方法及Mat格式与IplImage格式相互转换
- cv::Mat||cvCreateImage||cvcopy ||GetTickCount函数||cvFloor||CV_EXPORTS .
- Realsense(二)实现pxcimage到mat转化的另一种代码方案
- cv::Mat||cvCreateImage||cvcopy ||GetTickCount函数||cvFloor||CV_EXPORTS
- VTK修炼之道17:图像基本操作_图像信息的访问与修改(vtkImageData)
- [UIImage imageWithCVMat:(const cv::Mat&)cvMatt] 内存问题
- 【温故知新C/C++】cv::Mat||cvCreateImage||cvcopy ||GetTickCount函数||cvFloor||CV_EXPORTS!
- (vtk——The Visualization Toolkit)Visulizing Image & Volume Data(图像及三维体数据的可视化)
- OpenCV学习(2)--cv::Mat转化为QImage
- QImage 与 cv::Mat 之间的相互转换
- 11 - 改变vtkImageData中的Manipulation 方法 VTK 6.0 迁移
- ImageMagick 的 Image 和 OpenCV 的 cv::Mat 如何转换
- cvSetImageROI 和 cv::Mat.copyTo 和 addWeighted