【问题标题】:Tutorial on OpenGL combined with OpenCV for Computer Vision [closed]OpenGL 与 OpenCV 相结合的计算机视觉教程 [关闭]
【发布时间】:2012-02-01 11:38:26
【问题描述】:

有没有人知道一个很好的教程或文档来处理在 C++ 中混合 OpenCVOpenGL,与 Computer Vision 和 3D 渲染有关?

我想用对象创建虚拟场景,然后使用 OpenCV 找到object's 3D poses,这样我可以与已知的 OpenGL 位置进行比较,但到目前为止我没有找到太多“质量”信息。例如,我需要 opengl 相机的内在参数才能使用 OpenCV 检测 3D 世界中的物体等。

【问题讨论】:

    标签: c++ opencv opengl computer-vision


    【解决方案1】:

    混合 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 帧。但问题不在于混合它们,而是我想要一些关于如何处理相机参数、纹理过滤器如何影响识别等的信息
    • 那么您可能应该重新表述这个问题。目前尚不清楚您是否想使用 OpenGL 进行 3D 渲染并在其上调用 OpenCV,或者您是否想使用 OpenGL 对图像进行后处理并将它们传递给 OpenCV,或者您是否想研究纹理插值过滤器的效果(如双线性过滤器)关于 OpenCV 识别率。如果是最后一个,那么您可能根本不需要使用 OpenGL,纹理过滤就像弱低通过滤器一样工作。只需使用它。如果是第二个,那么你需要一些关于 OpenGL 着色器的教程来实现你想要的效果。
    • “最有可能没有教程,因为它太简单了”这很蹩脚。如果真是这样,人们会认为会有很多新手教程。
    • 使用 OpenGL 需要一些设置和上下文的创建。帧缓冲区、深度缓冲区、模板缓冲区、着色器等……需要设置并与窗口连接。问题可能是如何将 OpenGL 上下文与 OpenCV 窗口连接起来……
    • @the-swine 关于如何打开具有相关深度缓冲区(也可能是模板缓冲区和累积缓冲区)的 OpenCV namedWindow 的快速代码 sn-p 会很有帮助。我没有找到“这很容易,真的没什么好解释的”这个有用的答案。
    猜你喜欢
    • 2017-08-26
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2012-04-02
    • 2011-07-25
    • 2018-03-19
    • 2011-02-14
    相关资源
    最近更新 更多