OpenGL 与 OpenCV 相结合的计算机视觉教程 [关闭]

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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 会很有帮助。我没有找到“这很容易,真的没什么好解释的”这个有用的答案。

以上是关于OpenGL 与 OpenCV 相结合的计算机视觉教程 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

openmv与opencv区别

Opencv vs Opengl用于图像过滤器

opengl和opencv的区别

OpenCV 为啥勾搭上 OpenGL

OpenCV相机标定与畸变校正

如何在openCV python中将背景减法与密集光流跟踪相结合