3 通道图像上的 OpenCV CUDA 拉普拉斯滤波器

OpenCV CUDA Laplacian Filter on 3 channel image

我想使用 OpenCV 的 CUDA(当前版本 4.3.0)命名空间将拉普拉斯过滤器应用于图像。目前 CUDA 版本的拉普拉斯滤波器不接受 3 通道图像:

https://docs.opencv.org/4.3.0/dc/d66/group__cudafilters.html#gabf85fe61958bb21e93211a6fcc7c5c3b

我对此的想法是拆分通道,单独应用过滤器,然后重新合并在一起。但是,我在尝试将过滤器应用于各个频道时遇到错误。

我的第一个问题来自创建过滤器函数中的 type() 转换。我手动将其设置为 CV_8U 以解决该问题,但随后 运行 进入另一个应用过滤器的问题。我做错了吗?

//Setup  GPU and GPU Mats
cv::cuda::setDevice(0);
cv::cuda::GpuMat src, dst;
std::vector <cv::cuda::GpuMat> channels, lines;
src.upload(ImageCV);

//Start stream
cv::cuda::Stream stream1;

//Split channels
cv::cuda::split(src, channels, stream1);

//Filter image
//FAILING HERE
cv::Ptr<cv::cuda::Filter> lapFilter0 = cv::cuda::createLaplacianFilter(channels[0].type(), lines[0].type(), cv::Size(Sz, Sz));
cv::Ptr<cv::cuda::Filter> lapFilter1 = cv::cuda::createLaplacianFilter(channels[1].type(), lines[1].type(), cv::Size(Sz, Sz));
cv::Ptr<cv::cuda::Filter> lapFilter0 = cv::cuda::createLaplacianFilter(channels[2].type(), lines[2].type(), cv::Size(Sz, Sz));

//Apply Filter
//FAILING HERE
lapFilter0 ->apply(channels[0], lines[0], stream1);
lapFilter1 ->apply(channels[1], lines[1], stream1);
lapFilter2 ->apply(channels[2], lines[2], stream1);

//Merge channels
cv::cuda::merge(lines, dst, stream1);
dst.download(ImageCV);

这是对一个简单错误的简单修复:)

需要分配频道和线路:

std::vector <cv::cuda::GpuMat> channels(3), lines(3);