首页 > 解决方案 > 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,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 进行操作,据我所知,这应该只是 GPU 副本。

UMat 复制的缓冲区只能使用 OpenGL 缓冲区的 copyTo() 方法工作,该方法是 CPU 操作。方法 cv::ogl::mapGLBuffer() 导致崩溃,说它无法创建 OpenCL 缓冲区。

我已经验证了我的 GPU(我有一个集成的和一个独立的)分别支持 OpenCL 1.2 和 2.0,并且我还验证了 OpenCV 成功地创建和使用了 OpenCL 上下文。关于如何让 cv::ogl::mapGLBuffer() 工作以将 OpenGL 缓冲区复制到 OpenCL UMat 的任何想法?

标签: opencvmachine-learningopenglcomputer-visionopencl

解决方案


推荐阅读