如何解决OpenCV-OpenGL-OpenCL互操作
我正在编写一个非常基本的程序来监视从cv :: ogl :: Texture2D复制到cv :: ogl :: Buffer(使用copyTo函数),然后从那里复制到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,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);
缓冲复制的纹理可以工作,但是根据我的理解,该操作仅使用GPU进行复制就需要大量CPU。
到UMat复制的缓冲区只能使用OpenGL缓冲区的copyTo()方法(这是CPU操作)工作。方法cv :: ogl :: mapGLBuffer()导致崩溃,提示它无法创建OpenCL缓冲区。
我已经验证了我的GPU(具有集成的和分立的GPU)分别支持OpenCL 1.2和2.0,并且还验证了OpenCV成功创建和使用了OpenCL上下文。关于如何使cv :: ogl :: mapGLBuffer()将OpenGL缓冲区复制到OpenCL UMat的任何想法?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。