opencv - 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 的任何想法?
解决方案
推荐阅读
- php - 是否可以在 Laravel 中返回响应并与其一起调用函数?
- javascript - 纯文本无限滚动
- mysql - Laravel 条件选择 ->get
- python - 有没有办法枚举共享相同索引的列表或字典?
- css - 材质 UI 中的相同高度卡片
- laravel-5.8 - 如何覆盖 Laravel Voyager 的 Actions 目录文件?
- javascript - 按其值对数组元素进行排序
- google-data-studio - Google Data Studio - 我可以在创建连接器视图上验证配置参数吗?
- php - 每个 php 页面都没有加载到我的网站中
- gosu - 当我们在 SQL 中编写 %like% 来匹配一些细节时,我们如何在 gosu 查询中实现 %like% 呢?