我发现由于某些奇怪的原因,使用 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 上向下/向上采样。
最佳答案
OpenCV 2.4 中的 gpu::pyrDown
和 gpu::pyrUp
都不能原地运行。请使用单独的 GpuMat
对象进行输入和输出。
关于opencv - 如何在 opencv 中使用 gpu::pyrdown?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35435221/