繁体   English   中英

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 文档提供了GPU upload功能。

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

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

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

没有必要弄清楚步长,因为在给定图像的宽度和高度的情况下,构造函数会自动计算它。 希望当对OpenCV GPU功能的支持变得更好时,这篇文章可能对某些人有用。

编辑

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM