[英]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.