有没有办法直接将以前分配的CUDA设备数据复制到OpenCV GPU Mat中?我想将以前初始化并由CUDA填充的数据复制到OpenCV GPU垫中.我想这样做是因为我想Ax = B通过A使用OpenCV 计算矩阵的逆来求解线性方程组.
我想做的是这样的:
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
Run Code Online (Sandbox Code Playgroud)
编辑:
OpenCV 文档提供GPU upload功能.
设备指针是否可以作为参数传递给该函数?如果没有,是否没有其他方法可以进行这样的数据传输?我不想在主机和设备内存之间来回复制数据,在普通的OpenCV Mat容器上进行计算,然后复制结果; 我的申请是实时的.我假设因为没有a的.at()函数GPU Mat,就像在普通的OpenCV中一样Mat,没有办法访问矩阵中特定位置的元素?此外,GPU Mat是否存在显式矩阵求逆运算?该文档未提供GPU Mat inv()功能.
正如评论中发布的talonmies一样,GPU垫结构的标题中有一个构造函数,允许创建指向我之前分配的CUDA设备数据的GPUMat标头.这是我用过的:
cv::gpu::GpuMat dst(height, width, CV_32F, d_Ptr);
Run Code Online (Sandbox Code Playgroud)
没有必要弄清楚步长,因为在给定图像的宽度和高度的情况下,构造函数会自动计算它.希望当对OpenCV GPU功能的支持变得更好时,这篇文章可能对某些人有用.
编辑
另一种(可能)有用的方法是在CUDA中使用统一内存.将数据传递到OpenCV GPU和CPU垫,然后从那里继续操作.
| 归档时间: |
|
| 查看次数: |
3855 次 |
| 最近记录: |