OpenCV-OpenGL-OpenCL互操作

sgtfey8w  于 2022-10-18  发布在  其他
关注(0)|答案(1)|浏览(203)

我正在编写一个非常基本的程序来监视从cv::ogl::Texture2D复制到cv::ogl::Buffer(使用Copto函数)以及从那里复制到OpenCL cv::UMAT(使用cv::ogl::mapGLBuffer)时的性能。在我看来,理论上这应该完全可以在GPU上运行,但我在保留GPU上的东西方面遇到了一些麻烦:

//OpenGL / OpenCL interop objects
cv::ogl::Texture2D cvGLTexture;
cv::ogl::Buffer cvGLBuffer;

//OpenGL texture
cvGLTexture = cv::ogl::Texture2D(cv::Size(frameWidth,frameHeight),cv::ogl::Texture2D::Format::DEPTH_COMPONENT,textureHandle,false);

//OpenGL pack PBO; set autorelease to true so the underlying OpenGL resource is destroyed
cvGLBuffer = cv::ogl::Buffer(cv::Size(frameWidth,frameHeight),CV_32FC1,cv::ogl::Buffer::Target::PIXEL_PACK_BUFFER/*,true*/);

//Copy from texture to PBO
cvGLTexture.copyTo(cvGLBuffer,CV_32F); //This should be purely a GPU copy??? But it uses a lot of CPU also

//Map PBO to OpenCL and use the UMat
//cvUMat = cv::ogl::mapGLBuffer(cvGLBuffer);    //GPU copy (does not work)
cvGLBuffer.copyTo(cvUMat);

纹理到缓冲复制的工作,但它使用了大量的CPU的操作,应该只是一个图形处理器的副本,从我的理解。
UMAT复制的缓冲区只能使用OpenGL缓冲区的Copto()方法工作,该方法是一个CPU操作。方法cv::ogl::mapGLBuffer()导致崩溃,表明无法创建OpenCL缓冲区。
我已经验证了我的GPU(我有一个集成的和一个独立的)分别支持OpenCL 1.2和2.0,我还验证了OpenCV成功地创建和使用了OpenCL上下文。关于如何让cv::ogl::mapGLBuffer()将OpenGL缓冲区复制到OpenCL UMAT,您有什么想法吗?

相关问题