我想利用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::Context
,cv::ocl::Device
,cv::ocl::Platform
,添加了cv::ocl::attachContext
,所有都不起作用。我被困在这里,不知道如何前进。任何建议都非常感谢。谢谢。
1条答案
按热度按时间wkftcu5l1#
在初始化阶段需要调用
cv::ogl::ocl::initializeContextFromGL()
,我的项目是基于Qt的,窗口继承自QOpenGLWindow,所以我在initializeGL()
中调用那个函数。我猜想,如果没有此调用,OpenCV也会自动创建OpenCL上下文,但这与从OpenGL创建的上下文不同,这就是发生CL_INVALID_CONTEXT错误的原因。
作为提醒,我使用
cv::remap
处理了一张512x512的图像,发现通过OpenCL在GPU上的处理速度并不比在CPU上快多少。平均仍需要大约12ms。如果应用程序需要高帧速率并需要为其他处理留出时间,这仍然太慢了。