Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV-将CUDA设备数据复制到GPU Mat中_Opencv_Cuda - Fatal编程技术网

OpenCV-将CUDA设备数据复制到GPU Mat中

OpenCV-将CUDA设备数据复制到GPU Mat中,opencv,cuda,Opencv,Cuda,有没有办法直接将先前分配的CUDA设备数据复制到OpenCV GPU Mat中?我想将之前由CUDA初始化和填充的数据复制到OpenCV GPU mat中。我想这样做是因为我想通过使用OpenCV计算矩阵a的逆来求解线性方程组Ax=B 我想做的是这样的: float *dPtr; gpuErrchk( cudaMalloc( (void**) &dPtr, sizeof(float) * height * width)); gpuErrchk( cudaMemset(dPtr,

有没有办法直接将先前分配的CUDA设备数据复制到OpenCV GPU Mat中?我想将之前由CUDA初始化和填充的数据复制到OpenCV GPU mat中。我想这样做是因为我想通过使用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
上传
功能


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

正如评论中发布的Talonmes一样,GPU mat结构的头中有一个构造函数,允许为我以前分配的CUDA设备数据创建GPUMat头。这就是我用过的:

cv::gpu::GpuMat dst(height, width, CV_32F, d_Ptr);
无需计算步长,因为给定图像的宽度和高度,构造函数会自动计算步长。 希望,当对OpenCV GPU功能的支持变得更好时,这篇文章可能对某些人有用

编辑


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

@Downvoter:为什么要投否决票?我做了关于提问的研究,我的问题是一个有效的问题,因为我的CUDA算法运行在GPU上。我想用我的代码连接OpenCV的GPU模块;这样,我就不必浪费时间在设备和主机内存之间来回复制。没有清晰的接口将以前分配的CUDA设备内存复制到OpenCV GPU Mat容器,这与使用CUDA的OpenCV Mat容器的一般易用性形成对比。我发布这个问题是因为其他知识渊博的人可能知道我的问题的答案。无论OpenCV能不能做到(我猜它不能做到),通过显式计算逆解一组线性方程几乎总是错误的。我认为openCV->CUDA的情况正好相反,但这可能是一个开始。@Talonmes我同意,但他没有要求一个好的线性求解方法。只是如何实现一个低效的。不,我的意思是用指针实例化一个GpuMat。看看标题定义,你会发现一个构造函数,我相信有人会说:这个构造函数不会复制你的数据。它只会为提供的指针创建一个GpuMat头,这个GpuMat不会控制内存,也不会在自己的析构函数中释放内存。@jet47是的,头只会创建一个指向我的数据的GpuMat头。编辑。