我在Linux下编译了OpenCV 2.4.4,支持OpenGL,但是我不知道如何使用opengl_interop.hpp函数(其中一些甚至没有文档记录!,至少在我的文档版本上是这样的)查看启用OpenGL的部分中的windowidocpp,我发现了一些关于使用函数setOpenGLContext的提示,setOpenGLDrawCallback和updateView,但我甚至无法使用这段非常简单的代码:
# include <opencv2/opencv.hpp>
# include <GL/gl.h>
# include <GL/glut.h>
# include <opencv2/core/opengl_interop.hpp>
using namespace cv;
void on_opengl(void* userdata);
int main(void)
{
VideoCapture webcam(CV_CAP_ANY);
Mat frame;
namedWindow("window", CV_WINDOW_OPENGL);
setOpenGlContext("window");
while(waitKey(30) < 0)
{
webcam >> frame;
setOpenGlDrawCallback("window", on_opengl);
imshow("window", frame);
updateWindow("window");
}
return 0;
}
void on_opengl(void* userdata)
{
glLoadIdentity();
glTranslated(0.0, 0.0, 1.0);
glRotatef( 55, 1, 0, 0 );
glRotatef( 45, 0, 1, 0 );
glRotatef( 0, 0, 0, 1 );
static const int coords[6][4][3] = {
{ { +1, -1, -1 }, { -1, -1, -1 }, { -1, +1, -1 }, { +1, +1, -1 } },
{ { +1, +1, -1 }, { -1, +1, -1 }, { -1, +1, +1 }, { +1, +1, +1 } },
{ { +1, -1, +1 }, { +1, -1, -1 }, { +1, +1, -1 }, { +1, +1, +1 } },
{ { -1, -1, -1 }, { -1, -1, +1 }, { -1, +1, +1 }, { -1, +1, -1 } },
{ { +1, -1, +1 }, { -1, -1, +1 }, { -1, -1, -1 }, { +1, -1, -1 } },
{ { -1, -1, +1 }, { +1, -1, +1 }, { +1, +1, +1 }, { -1, +1, +1 } }
};
for (int i = 0; i < 6; ++i) {
glColor3ub( i*20, 100+i*10, i*42 );
glBegin(GL_QUADS);
for (int j = 0; j < 4; ++j) {
glVertex3d(0.2*coords[i][j][0], 0.2 * coords[i][j][1], 0.2*coords[i][j][2]);
}
glEnd();
}
}
在网络视频流中使用opengl的正确方法是什么?
2条答案
按热度按时间jm81lzqq1#
OpenGL是为渲染图形而设计的,OpenCV是为计算机视觉而设计的。因此,我建议你在基于GL的应用程序中使用CV,而不是使用CV API来渲染、回调等。
如果你想要的只是一个简单的演示,那么你可以使用freeGLUT编写一个非常简单的程序,带有一些回调,freeGLUT将处理窗口回调和GL上下文创建。(GLFW或Qt也可以)在程序中,使用
cv::ogl::Texture2D
类来处理纹理对象。使用Texture2D::copyFrom(...)
和Texture2D::copyTo(...)
来处理设备/主机内存传输。在渲染回调中,使用标准的GL程序来绘制一个全屏矩形。2虽然这个方法效率不高,但它可以工作。注意事项:
1.建议使用freeGLUT而不是GLUT,它们是两件事。GLUT已经过时了。但是freeGLUT在扩展GLUT的同时继续支持最新的OpenGL版本。
1.您可能需要像GLEW这样的GL loading library来获取GL函数指针
1.较新的OpenGL(3.1+)不再支持固定管线渲染,因此需要VBO和着色器。如果您的目标是较低版本的GL,则需要指定上下文版本。这可以通过
glutInitContextVersion( int major, int minor )
完成。网上有很多教程。35g0bw712#
我已经编写了一个完整的演示,完全做到了这一点(好处是在GPU上完成所有操作-步骤之间没有复制)
https://github.com/kallaballa/GCV/blob/main/src/camera/camera-demo.cpp
关键代码部分:
缩短的互操作函数:
请注意repo的README,因为演示需要您构建我的OpenCV-4.x fork(https://github.com/kallaballa/opencv/tree/GCV)。无论如何,我正在努力将这些更改放到主线中: