如何在opencv中使用gpu :: pyrdown?

时间:2016-02-16 14:30:26

标签: opencv computer-vision gpu nvidia

我发现使用pyrDown和pyrUp会使我的DownUp充满零,原因有些奇怪。但是,当我在cpu上正常执行此操作时,结果非常好。

注意:如果重要的话,我在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上下调/上传。

1 个答案:

答案 0 :(得分:2)

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