opengl cv::ogl::mapGL缓冲区报告错误CL_INVALID_CONTEXT

2lpgd968  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(157)

我想利用OpenCV的OpenGL/OpenCL集成,直接在GPU上实现图像的快速失真,同时避免GPU/CPU图像传输。

// m_pub is of type QOpenGLBuffer
cv::ogl::Buffer b(512, 512, CV_8UC4, m_pub.bufferId());

但是下一行抛出了一个异常:

cv::UMat m = cv::ogl::mapGLBuffer(b);

OpenCV报告的错误最初是:
OpenCV(4.5.5)错误:未知错误代码-220(OpenCL:文件D:\OpenCV\opencv-4.5.5\modules\core\src\opengl.cpp中第1886行的cv::ogl::mapGLBuffer中创建自GL缓冲区的clCreateFromGLBuffer失败)
为了获得进一步的信息,我在opengl.cpp中调用cv::ocl::getOpenCLErrorString(status);,重新生成,然后发现错误是CL_INVALID_CONTEXT。
我已经检查了cv::ocl::Contextcv::ocl::Devicecv::ocl::Platform,添加了cv::ocl::attachContext,所有都不起作用。我被困在这里,不知道如何前进。任何建议都非常感谢。谢谢。

wkftcu5l

wkftcu5l1#

在初始化阶段需要调用cv::ogl::ocl::initializeContextFromGL(),我的项目是基于Qt的,窗口继承自QOpenGLWindow,所以我在initializeGL()中调用那个函数。
我猜想,如果没有此调用,OpenCV也会自动创建OpenCL上下文,但这与从OpenGL创建的上下文不同,这就是发生CL_INVALID_CONTEXT错误的原因。
作为提醒,我使用cv::remap处理了一张512x512的图像,发现通过OpenCL在GPU上的处理速度并不比在CPU上快多少。平均仍需要大约12ms。如果应用程序需要高帧速率并需要为其他处理留出时间,这仍然太慢了。

相关问题