我想利用OpenCV对OpenGL/OpenCL的集成,在GPU上直接实现图像的快速失真,同时避免GPU/CPU图像传输。我可以从Qt中的一个cv::ogl::Buffer缓冲区对象创建一个OpenGL:
// 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报告的错误最初是:
D:\OpenCV\opencv-4.5.5\modules\core\src\opengl.cpp,OpenCV(4.5.5)错误:未知错误代码-220 (OpenCL: clCreateFromGLBuffer失败)在cv::ogl::mapGLBuffer中,文件
第1886行
为了获得更多信息,我在cv::ocl::getOpenCLErrorString(status);中调用opengl.cpp,重新构建,并发现错误是CL_INVALID_CONTEXT。
我检查了cv::ocl::Context,cv::ocl::Device,cv::ocl::Platform,cv::ocl::attachContext补充说,一切都不起作用。我被困在这里,不知道怎么前进。任何建议都是非常感谢的。谢谢。
发布于 2022-06-28 06:49:06
它需要在初始化阶段调用cv::ogl::ocl::initializeContextFromGL()。我的项目是基于Qt的,窗口是从QOpenGLWindow继承的,所以我在initializeGL()中调用了这个函数。
我猜如果没有这个调用,OpenCV也会自动创建OpenCL上下文,但这与从OpenGL创建的上下文不一样,这就是为什么会发生OpenCL错误。
作为提醒,我使用cv::remap来处理512x512图像,发现通过OpenCL在GPU上处理的速度并不比在CPU上快得多。它仍然平均花费大约12毫秒。如果应用程序需要较高的帧速率,并且需要为其他处理留出时间,这仍然太慢。
https://stackoverflow.com/questions/72771594
复制相似问题