gpt4 book ai didi

c++ - 通过转换 OpenCV UMat 的句柄来实例化 OpenCL cl_mem

转载 作者:太空宇宙 更新时间:2023-11-03 22:55:32 26 4
gpt4 key购买 nike

我在 OpenGL 中渲染并获取纹理,我已将其绑定(bind)到 FrameBuffer、OpenCL cl_mem,在 OpenCL 中进行一些修改,然后将修改后的图像返回到 FrameBuffer 以供显示。我试图用 OpenCV cv::UMat 做同样的事情,唯一的变化如下所示。最后一行,call to acquire the GLObjects,是错误发生的地方...

UMat cvImage(480,640,CV_8UC4, ACCESS_RW);
cl_mem clImage = (cl_mem)cvImage.handle(ACCESS_RW);
--- generate/bind/etc glFrameBuffer
--- render stuff
clEnqueueAcquireGLObjects(ocl_queue, 1, &clImage , 0, NULL, NULL); //

我之前使用以下方法实例化 clImage:

clImage = clCreateFromGLTexture2D(context, CL_MEM_READ_ONLY, GL_TEXTURE_2D, 0, g_fb_tex, &err);

它运行良好。在调试中,我可以看到 cvImage 和 clImage 的内存地址相同,所以也许我没有为 cvImage 创建足够大的图像大小?不知道clCreateFromGLTexture2D怎么用电话就可以了。或者,我可以保持原来的方式,并在调用 AcquireGLObjects 后将 cl_mem 传输到 UMat。

--------更新1--------

根据 boiler96 的响应,我尝试了以下过程,它没有出现故障,但只给我一个漂亮的蓝屏(不是 BSOD,而是 CV 窗口中的类似阴影)和一个 INVALID_CONTEXT 错误:

UMat cvImage(480,640,CV_8UC4, cv::ACCESS_RW);
cl_mem clImage = clCreateFromGLTexture2D(context, CL_MEM_READ_ONLY, GL_TEXTURE_2D, 0, g_fb_tex, &err);
clEnqueueAcquireGLObjects(ocl_queue, 1, &clImage, 0, NULL, NULL); //
clEnqueueCopyImageToBuffer(ocl_queue, clImage, (cl_mem)cvImage.handle(ACCESS_RW), origin, region,0,0,NULL,NULL);
imshow("window", me);
waitKey(0);

还有更多工作要做...下一次尝试将改为尝试 clCreateFromGLBuffer。谢谢!

最佳答案

我认为这里有几个问题。

首先,当与 OpenGL 共享 OpenCL 对象时,OpenGL 是必须在其中创建对象的 API。在上面的代码块中,OpenCV 似乎正在创建对象作为 cvImage 构造函数的一部分(也许如果我们看到绑定(bind)到 glFrameBuffer,这个问题会更加明显。)

其次,OpenCV 3.0 UMat 对象具有 OpenCL 缓冲区 句柄,而共享 OpenGL 帧缓冲区会生成 OpenCL 图像 句柄。这有点欺骗性,因为两种类型的对象都由 cl_mem 句柄表示。但实际上,它们是不同的。因此,我看不到 OpenCV 可以直接在 OpenGL 帧缓冲区上运行的方法。

相反,我认为您可能被迫将 OpenCL 图像句柄和 OpenCV UMat 创建为完全独立的实体。当 OpenCV 完成填充 UMat 时,获取表示渲染缓冲区的 OpenCL 图像,排队复制命令以将数据从 UMat 的 OpenCL 缓冲区复制到 OpenCL 图像,并释放 OpenCL 图像以便 OpenGL 可以使用它。

关于c++ - 通过转换 OpenCV UMat 的句柄来实例化 OpenCL cl_mem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31364672/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com