簡體   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