OpenGL和OpenCV在计算机视觉中的教程

8

有没有人知道一个好的教程或文档,涉及使用C++混合OpenCVOpenGL,与计算机视觉和3D渲染相关?

我想创建虚拟场景,并使用OpenCV找到对象的三维姿态,以便与已知的OpenGL位置进行比较,但是目前我没有找到太多“高质量”的信息。例如,我需要opengl相机的内部参数,以便在3D世界中使用OpenCV检测对象。

1个回答

3

混合OpenGL和OpenCV并不难。这只是两个库,一个用于图形处理,另一个用于计算机视觉。它们没有重叠部分,因此您可以将两者都包含在项目中。

然后,您只需要渲染一些矩形或框(或您希望使用OpenCV定位的任何内容)-有很多教程可以做到这一点,然后使用glReadPixels()函数将渲染数据复制到客户端内存,并将其传递给OpenCV。

可能没有教程,因为它太简单了...

您可以:

void onDisplay(void* param)
{
    glClearColor(0, 1, 0, 1);
    glClear(GL_COLOR_BUFFER_BIT); // Make a green window.
}

...

void MyClass::MyInit(bool useCustomInit)
{
    std::string winname = "MyWnd";
    if (useCustomInit) {
        namedWindow(winname, CV_WINDOW_NORMAL);
        resizeWindow(winname, 640, 480);
        auto handle = cvGetWindowHandle(winname.c_str());
        InitializeOpenGL(handle); // your custom OpenGL initialization.
    } else {
        namedWindow(winname, CV_WINDOW_NORMAL | CV_WINDOW_OPENGL);
        resizeWindow(winname, 640, 480);
    }
    void *param_value = reinterpret_cast<void*>(this); // Can e.g. do this or just use nullptr.
    setOpenGlDrawCallback(winname, onDisplay, param_value);

    // ...
}

如果您对默认的OpenGL窗口感到满意,可以使用Init(false)。如果您想要更高级的位深度和模板缓冲区等功能,请使用操作系统的窗口句柄自行初始化OpenGL。有很多教程可以帮助您完成这个过程。

实际上,我能够使用openCV加载图像,然后将它们作为纹理传递给openGL,然后从openGL读取像素并显示和openCV帧。但问题不在于混合它们,而是我想了解如何处理相机参数,纹理过滤器如何影响识别等方面的信息。 - Jav_Rock
1
那么,您应该重新措辞问题。不完全清楚您是想使用OpenGL进行3D渲染并调用OpenCV,还是想使用OpenGL后处理图像并将其传递给OpenCV,或者您想研究纹理插值滤波器(如双线性滤波器)对OpenCV识别率的影响。如果是最后一个问题,则可能根本不需要使用OpenGL,因为纹理过滤器就像弱低通滤波器一样工作。只需使用它即可。如果是第二个问题,则需要一些关于OpenGL着色器的教程来实现您想要的效果。 - the swine
1
很可能是因为它太简单了,所以没有教程,这很糟糕。如果真的是这样的话,人们会认为会有很多新手教程。 - enthusiasticgeek
这么说有点不公平。实际上,这只是调用glTexImage2D()并使用从OpenCV图像结构中获取的一些参数。仅仅是一行代码而已。即使OP也承认他可以做到这一点(请参见他的第一个评论)。如果您需要关于此的教程,请在SO上提问并让我知道,我会为您填写答案。 - the swine
2
使用OpenGL需要进行一些设置并创建上下文。需要设置帧缓冲、深度缓冲、模板缓冲、着色器等,并将它们与窗口连接起来。问题可能是如何将OpenGL上下文与OpenCV窗口连接起来... - wcochran
1
@the-swine 一个快速的代码片段,展示如何打开一个具有相关深度缓冲区(也许还有模板缓冲区和累积缓冲区)的OpenCV“namedWindow”会非常有帮助。我并没有觉得“很容易,真的没有什么要解释的”是一个有用的答案。 - wcochran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接