2017-08-27 16 views
0

cv::Umatを既に割り当てられているGPUバッファ(OpenCL、Cuda、またはOpenGLから)のデータで初期化する方法を探していました。データをCPU側にコピーし直します。OpenCV 3.x - UMat用に既に割り当てられたバッファ(CudaまたはOpenCLで)を使用

コピー操作は不要で、GPAT(以前はCUDA/OpenCL/OpenGLを使用して割り当てられていた)上の既存のデータをUMatが「ラップ」することが理想的です。それでも問題が解決しない場合は、データをホスト側に転送することなく、GPU上のOpenCL/CUDAバッファを直接UMatにコピーすることもできます(GPUデバイスのコピー操作はCPUよりもはるかに高速です)側)。

OpenCV APIは、既存のUMatのデータに対してOpenCLハンドルを取得する方法を説明しますが、それ以外の方法はありません。すでにこれをやっている人や、それをやり遂げる方法がある人はいますか?ありがとう! (opencl-opencv-interop.cpp)から

+0

マイケル - >なぜ私の質問に投票しましたか? – Martin1988a

答えて

0

私も同じ答えを探しています、私はしかし、それらすべてを設定する、働くかもしれない何かを持っている挑戦的な証明することがあります... :

// this function is an example of interoperability between OpenCL buffer 
// and OpenCV UMat objects. It converts (without copying data) OpenCL buffer 
// to OpenCV UMat and then do blur on these data 
int App::process_cl_buffer_with_opencv(cl_mem buffer, size_t step, int rows, int cols, int type, cv::UMat& u) 
{ 
    cv::ocl::convertFromBuffer(buffer, step, rows, cols, type, u); 

    // process right half of frame in OpenCV 
    cv::Point pt(u.cols/2, 0); 
    cv::Size sz(u.cols/2, u.rows); 
    cv::Rect roi(pt, sz); 
    cv::UMat uroi(u, roi); 
    cv::blur(uroi, uroi, cv::Size(7, 7), cv::Point(-3, -3)); 

    if (buffer) 
     clReleaseMemObject(buffer); 
    m_mem_obj = 0; 

    return 0; 
} 

次のことができるようにすべきですCL buffer from GLに変換するか、CLバッファを直接使用し、上記の関数またはconvertFromBuffer()を使用してください。

関連する問題