1

如您所知,Ptr<Filter> cv::cuda::createMedianFilter (int srcType, int windowSize, int partition=128)OpenCV3.1.0 中添加了功能。

我正在尝试对具有自定义窗口大小(最多 21 个)的 8 位大图像(6000 * 6000)进行中值过滤。我比较cv::medianBlurcv::cuda::createMedianFilter结果是

windowSize    cv::medianBlur    cv::cuda::createMedianFilter
    3             0.071 sec         3.637 sec
    5             0.285 sec         3.679 sec
    11            2.641 sec         3.652 sec
    19            2.566 sec         3.719 sec

1) 为什么 cuda::createMedianFilter 比 cv::medianBlur 慢?

2) 我如何编写内核代码来实现使用具有自定义内核大小的 opencv Mat 的中值滤波器?

4

2 回答 2

1

当图像大小不变时,卷积运算的速度主要取决于滤波器核的大小。考虑到排序比求和更复杂,中值滤波将花费更长的时间。

要下层实现自定义过滤内核的CUDA卷积函数,需要获取图像数据的原始指针

MyConv(char* image, int width, int height, int stride)

然后编写 CUDA 代码。

这是关于 cuda 卷积的教程。

http://igm.univ-mlv.fr/~biri/Enseignement/MII2/Donnees/convolutionSeparable.pdf

这个问题也举了一个例子。

cuda 卷积映射

于 2016-07-03T16:07:56.193 回答
1

我也用cuda::createMedianFilter()了发现,MedianFilter::apply()每次调用都会新分配两个GpuMat filter->apply(),GPU内存分配非常耗时,所以我把这两个Mats移到MedianFilter类中作为成员变量(除非图像大小发生变化,否则不要再次分配) .

使用 1000 张图像 (400 * 300) 加速 4 倍测试。此外,似乎参数分区可以设置为 src.rows / 2,这将比原始参数 128 更快。

src 代码中的两个 mat是GpuMat devHist; GpuMat devCoarseHist

于 2016-09-12T10:05:19.550 回答