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的主要内容,如果未能解决你的问题,请参考以下文章