【问题标题】:OpenCV - copy CUDA device data into GPU MatOpenCV - 将 CUDA 设备数据复制到 GPU Mat
【发布时间】:2015-04-22 20:12:08
【问题描述】:

有没有办法将之前分配的 CUDA 设备数据直接复制到 OpenCV GPU Mat 中?我想将之前由 CUDA 初始化和填充的数据复制到 OpenCV GPU 垫中。我想这样做是因为我想通过使用 OpenCV 计算矩阵 A 的逆来求解线性方程组 Ax = B

我想做的是这样的:

float *dPtr; 
gpuErrchk( cudaMalloc( (void**) &dPtr, sizeof(float) * height * width));    
gpuErrchk( cudaMemset(dPtr, 0, sizeof(float) * height * width));

// modify dPtr in some way on the GPU 
modify_dPtr(); 

// copy previously allocated and modified dPtr into OpenCV GPU mat? 

// process GPU mat later - e.x. do a matrix inversion operation. 

// extract raw pointer from GPU mat

编辑: OpenCV documentation 提供了一个 GPU upload 函数。

可以将设备指针作为参数传递给该函数吗?如果没有,是否没有其他方法可以进行此类数据传输?我不想在主机和设备内存之间来回复制数据,在普通的 OpenCV Mat 容器上进行计算,然后将结果复制回来;我的应用程序是实时的。我假设由于GPU Mat 没有.at() 函数,就像在普通的OpenCV Mat 中一样,没有办法访问矩阵中特定位置的元素?此外,GPU Mat 是否存在显式矩阵求逆运算?该文档不提供 GPU Mat inv() 函数。

【问题讨论】:

  • @Downvoter:为什么要投反对票?我在提出问题方面进行了研究,我的问题是一个有效的问题,因为我的 CUDA 算法在 GPU 上运行。我想将 OpenCV 的 GPU 模块与我的代码连接;这样,我就不必浪费时间在设备和主机内存之间来回复制。没有明确的接口可以将先前分配的 CUDA 设备内存复制到 OpenCV GPU Mat 容器,这与使用 CUDA 的 OpenCV Mat 容器的一般易用性形成对比。我发布这个问题是因为其他知识渊博的人可能知道我的问题的答案。
  • 无论 OpenCV 能不能做到(我猜不能),通过显式计算逆来求解一组线性方程几乎总是错误的做法。
  • stackoverflow.com/questions/25512354/… 我认为这与 openCV->CUDA 正好相反,但它可能是一个开始的地方。
  • @talonmies 我同意,但他没有要求一个好的线性求解器方法。只是如何实现一个低效的。
  • 不,我的意思是用你的指针实例化一个 GpuMat。查看标题定义,我相信你会找到一个构造函数

标签: opencv cuda


【解决方案1】:

正如 cmets 中发布的 talonmies 一样,GPU mat 结构的标头中有一个构造函数,允许为我之前分配的 CUDA 设备数据创建 GPUMat 标头 pointing。这是我用过的:

cv::gpu::GpuMat dst(height, width, CV_32F, d_Ptr);

不需要计算步长,因为构造函数会根据图像的宽度和高度自动评估它。 希望当对 OpenCV GPU 功能的支持变得更好时,这篇文章可能对某人有用。

编辑

另一种(可能)有用的方法是利用 CUDA 中的统一内存。将数据传递到 OpenCV GPU 和 CPU mat,然后从那里继续操作。

【讨论】:

  • 一些评论:这个构造函数不会复制你的数据。它只会为提供的指针创建一个 GpuMat 头,这个 GpuMat 不会控制内存,也不会在自己的析构函数中释放它。
  • @jet47 是的,标题只是创建了一个指向我的数据的 GPUmat 标题。已编辑。
猜你喜欢
  • 2019-01-02
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 2012-05-27
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
相关资源
最近更新 更多