我正在编写一个非常基本的程序来监视从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,您有什么想法吗?
1条答案
按热度按时间c7rzv4ha1#
我让OpenCV与OpenGL(以及VAAPI)互操作的唯一方法是使用forking OpenCV 4.x。我还根据我的修复编写了two demos。有两个GitHub问题解决了我的努力: