0

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

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

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

我的第一个问题来自 create filter 函数中的 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);
4

1 回答 1

1

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

需要分配通道和线路:

std::vector <cv::cuda::GpuMat> channels(3), lines(3);
于 2020-08-20T19:00:55.060 回答