【问题标题】:OpenCv 3.3 Cuda Medianfilter generates 2/3 of image blackOpenCv 3.3 Cuda Medianfilter 生成图像黑色的 2/3
【发布时间】: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... 这是观察到问题的正确原因。请添加您的评论作为答案,以便将问题标记为已解决。

标签: c++ image opencv


【解决方案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);

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

希望能解决你的问题

【讨论】:

    猜你喜欢
    • 2018-02-16
    • 2016-02-24
    • 2017-03-13
    • 2014-08-11
    • 1970-01-01
    • 2014-05-15
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多