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

标签 c++ opencv opengl segmentation-fault opencl

我在 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/

相关文章:

c++ - 动态规划(事件组织)

c++ - 通过引用为 Bool 设置默认值

ios - 在 iOS 上使用 openCV 的高动态范围成像产生乱码输出

java - 在 LWJGL 中使用 glTexImage2D 和 ByteBuffer 时出现空纹理

c++ - GC 可以用 C++ 原始指针实现吗?

c++ - 具有高概率数字的随机)?

javascript - 如何在 Node.js 中将 OpenCV 图像矩阵编码为 base64

python - 错误 'the source does not appear to contain CMakeLists.txt'

c++ - GLSL 着色器无法编译,有人可以帮我找出原因吗?

linux - Clang OpenGL 和 Max