2016-02-16 58 views
1

我发现使用pyrDown和pyrUp会让我的DownUp由于某种奇怪的原因而充满零。但是,当我通常在CPU上执行此操作时,结果非常好。如何在opencv中使用gpu :: pyrdown?

注意:我在jetson tk1上使用opencv4tegra,如果这很重要的话。

for (int i = 0; i < Pyramid_Size; i++) { 
    cv::gpu::pyrDown(DownUp, DownUp); 
} 

for (int i = 0; i < Pyramid_Size; i++){ 
    cv::gpu::pyrUp(DownUp, DownUp); 
} 

谁知道为什么这可能是?

编辑:

DownUp.upload(Input); 

GpuMat buffer; 
DownUp.copyTo(buffer); 

for (int i = 0; i < Pyramid_Size; i++, DownUp.copyTo(buffer)) { 
    cv::gpu::pyrDown(buffer, DownUp); 
} 

for (int i = 0; i < Pyramid_Size; i++, DownUp.copyTo(buffer)){ 
    cv::gpu::pyrUp(buffer, DownUp); 
    GpuMat a = GpuMat(DownUp.size(), CV_32F); 
    a.setTo(20.0f); 
    cv::gpu::add(DownUp, a, DownUp); 
} 

这是现在在我的代码工作,但它是显著比CPU版本慢。这个GPU版本需要大约1.6-2秒才能运行,而CPU需要0.1秒。

我也注意到从主机到设备发送数据花费的时间比在cpu上简单处理花费的时间长得多。无论如何在opencv加快这一点?我肯定是在做一些错误的事情,即使是大型的5mp图像也能在CPU上快速上下采样。

回答

2

OpenCV 2.4中的gpu::pyrDowngpu::pyrUp都无法就地运行。请使用separete GpuMat对象进行输入和输出。