OpenCV - 将 CUDA 设备数据复制到 GPU Mat
OpenCV - copy CUDA device data into GPU Mat
有没有办法直接将之前分配的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()
函数。
正如talonmies post在评论中提到的,在GPU mat结构的header中有一个构造函数允许创建GPUMat header pointing 到我之前分配的 CUDA 设备数据。这是我用过的:
cv::gpu::GpuMat dst(height, width, CV_32F, d_Ptr);
无需计算步长,因为构造函数会根据图像的宽度和高度自动计算步长。
希望当对 OpenCV GPU 函数的支持变得更好时,这个 post 可能对某些人有用。
编辑
另一种(可能)有用的方法是在 CUDA 中使用统一内存。将数据传递到 OpenCV GPU 和 CPU mat,然后从那里继续操作。
有没有办法直接将之前分配的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()
函数。
正如talonmies post在评论中提到的,在GPU mat结构的header中有一个构造函数允许创建GPUMat header pointing 到我之前分配的 CUDA 设备数据。这是我用过的:
cv::gpu::GpuMat dst(height, width, CV_32F, d_Ptr);
无需计算步长,因为构造函数会根据图像的宽度和高度自动计算步长。 希望当对 OpenCV GPU 函数的支持变得更好时,这个 post 可能对某些人有用。
编辑
另一种(可能)有用的方法是在 CUDA 中使用统一内存。将数据传递到 OpenCV GPU 和 CPU mat,然后从那里继续操作。