我试图在VTK(3D可视化库)和OpenCV(图像处理库)之间架起桥梁。
目前,我正在做以下事情:
vtkWindowToImageFilter
将vtkRenderWindow
(场景)转换为vtkImageData
(渲染窗口的像素)。
然后我必须将vtkImageData
的每个像素复制到cv::Mat
中,以便使用OpenCV进行处理和显示。
此过程需要实时运行,因此冗余副本(ImageData
到Mat
的场景像素)会严重影响性能。我想直接从场景像素映射到cv::Mat
。
随着场景的变化,我希望cv::Mat
自动引用场景。基本上,我想要cv::Mat<uchar *>
,而不是cv::Mat<uchar>
。那有意义吗?还是我过度复杂了?
答案 0 :(得分:1)
vtkSmartPointer<vtkImageData> image = vtkSmartPointer<vtkImageData>::New();
int dims[3];
image->GetImageData()->GetDimensions(dims);
cv::Mat matImage(cv::Size(dims[0], dims[1]), CV_8UC3, image->GetImageData()->GetScalarPointer());`
我成功地将vtkimagedata*
直接实现到cv::Mat
指针数组..
cv::flip
或matImage -= cv::Scalar(255,0,0)
直接处理vtkimagedata。
但cv::resize
或cv::Canny
等功能不起作用。