我正在尝试在VTK(3D可视化库)和OpenCV(图像处理库)之间桥接。
目前,我正在做以下操作:
vtkWindowToImageFilter
将vtkRenderWindow
(场景)转换为vtkImageData
(渲染窗口的像素)。
i然后必须将vtkImageData
的每个像素复制到cv::Mat
中进行处理,并使用OpenCV显示。
此过程需要实时运行,因此冗余副本(在ImageData
中进入Mat
)会严重影响性能。我想直接从场景像素到cv::Mat
映射。
随着场景的变化,我希望cv::Mat
自动引用场景。本质上,我想要一个cv::Mat<uchar *>
,而不是cv::Mat<uchar>
。那有意义吗?还是我过度复杂化?
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
之类的功能不起作用。