【发布时间】:2016-07-06 09:23:36
【问题描述】:
在以前的 OpenCV 版本中,有函数 Stream::enqueueUpload 可用于将数据与 CudaMem 一起异步上传到 GPU(比较:how to use gpu::Stream in OpenCV?)。但是,这个函数在 OpenCV 3 中不再存在。CudaMem 类也消失了,但似乎已被 HostMem 类取代。
谁能告诉我如何在 OpenCV 3 中执行异步上传?
【问题讨论】:
在以前的 OpenCV 版本中,有函数 Stream::enqueueUpload 可用于将数据与 CudaMem 一起异步上传到 GPU(比较:how to use gpu::Stream in OpenCV?)。但是,这个函数在 OpenCV 3 中不再存在。CudaMem 类也消失了,但似乎已被 HostMem 类取代。
谁能告诉我如何在 OpenCV 3 中执行异步上传?
【问题讨论】:
现在可以通过void GpuMat::upload(InputArray arr, Stream& stream)方法完成:
cv::cuda::GpuMat d_mat;
cv::cuda::HostMem h_mat;
cv::cuda::Stream stream;
d_mat.upload(h_mat, stream);
【讨论】:
cuda::HostMem 提供静态getAllocator 方法,该方法返回MatAllocator 对象。您可以使用cv::Mat::setDefaultAllocator 方法使用它来覆盖cv::Mat 的默认分配器。之后,您可以使用 cv::Mat 对象而不是 cuda::HostMem。
cv::Mat::setDefaultAllocator(NULL) 应该回到默认分配器。
cv::Mat 被分配为页面锁定,您可以使用 cv::cuda::GpuMat::upload(cv::Mat, cv::cuda::Stream)。
cv::fastAlloc。