我想使用 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);