如您所知,Ptr<Filter> cv::cuda::createMedianFilter (int srcType, int windowSize, int partition=128)
函数已添加到OpenCV3.1.0。
我正在尝试使用自定义窗口大小(最多21个)对8位大图像(6000 * 6000)进行中值滤波。我比较了cv::medianBlur
和cv::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和自定义内核大小的中值过滤器?
答案 0 :(得分:1)
当图像大小恒定时,卷积操作的速度主要取决于滤波器内核的大小。考虑到排序比求和更复杂,中值滤波器将花费更长的时间。
要使用自定义过滤器内核实现自己的CUDA卷积功能,需要获取图像数据的原始指针
ReactDOM.findDOMNode(this.refs.query).value
然后编写CUDA代码。
这是关于cuda卷积的教程。
http://igm.univ-mlv.fr/~biri/Enseignement/MII2/Donnees/convolutionSeparable.pdf
这个问题也举了一个例子。
答案 1 :(得分:0)
我还使用了cuda::createMedianFilter()
并发现每次调用MedianFilter::apply()
时在filter->apply()
中新分配了两个GpuMat,并且GPU内存分配非常耗时,所以我移动了两个Mats将MedianFilter类作为成员变量(除非图像大小发生变化,否则不再分配)。
使用1000张图像(400 * 300)加速测试4倍。此外,似乎参数分区可以设置为src.rows / 2,这将比原始参数-128更快。
src code中的两个席位是GpuMat devHist; GpuMat devCoarseHist