OpenCv 3.3 Cuda Medianfilter 生成图像黑色的 2/3

Posted

技术标签:

【中文标题】OpenCv 3.3 Cuda Medianfilter 生成图像黑色的 2/3【英文标题】:OpenCv 3.3 Cuda Medianfilter generates 2/3 of image black 【发布时间】:2017-10-23 13:28:55 【问题描述】:

我正在尝试使用 OpenCV 库中的 cv::cuda::createMedianfilter 函数。

这个简单的代码生成了一个 2/3 黑色的图像,只有 1/3 被过滤了。

using namespace cv;
int main(int argc, char** argv)

  Mat src; Mat dst;
  src = imread("test.bmp", 1);
  cuda::GpuMat imageGpu(src),imageGpuOut;
  cuda::Stream stream;
  try
    
        Ptr<cuda::Filter> filterX = cuda::createMedianFilter(CV_8UC1, 31);
        filterX->apply(imageGpu, imageGpuOut,stream);
        imageGpuOut.download(dst,stream);
        stream.waitForCompletion();
        imwrite("test_cuda31.bmp", dst);
    
    catch (cv::Exception& e)
    
        const char* err_msg = e.what();
        std::cout << "exception caught: " << err_msg << std::endl;
    

输入图像如下所示:Input image 输出图像如下:Output image

我在中值滤波器上尝试了其他几个不同大小和不同内核大小的图像。结果都一样。

关于我做错了什么有什么想法吗?

【问题讨论】:

我认为这是因为您将图像读取为 RGB -> 即 3 个通道,并在创建中值滤波器函数时使用 CV_8UC1 -> 即 1 个通道....因此它将处理 1 /3 的图像...你应该先将其转换为灰度或加载它 0 而不是 1,也许我错了,我没有使用那么多 OpenCV 的 CUDA 模块 @api55... 这是观察到问题的正确原因。请添加您的评论作为答案,以便将问题标记为已解决。 【参考方案1】:

您正在加载 3 个通道 (BGR) 的图像

src = imread("test.bmp", 1);

那么,您就好像源只有 1 个频道一样使用

Ptr<cuda::Filter> filterX = cuda::createMedianFilter(CV_8UC1, 31);

那么它将只处理 1/3 的像素,并且可能图像被初始化为全 0,因此图像其余部分中的黑色像素。

遗憾的是,cuda::createMedianFilter 仅支持CV_8UC1,因此无法更改,但您可以将图像加载为CV_8UC1

src = imread("test.bmp", 0);

或在加载后将其转换为灰度。

希望能解决你的问题

【讨论】:

以上是关于OpenCv 3.3 Cuda Medianfilter 生成图像黑色的 2/3的主要内容,如果未能解决你的问题,请参考以下文章

opencv进阶-OpenCV4.4 CUDA加速

我需要哪个 opencv cuda 库来运行一个简单的 opencv cuda 程序?

opencv+cuda 编译

opencv进阶-OpenCV4 CUDA开发环境配置

CUDA(GPU) 作为 OpenCV 后端

使用支持 CUDA 的 OpenCV 编译 ROS 节点时不支持 CUDA