OpenGL结合OpenCV进行计算机视觉教程

发布于 2025-01-01 12:49:25 字数 1539 浏览 0 评论 0原文

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

酒废 2025-01-08 12:49:25

混合 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。确实有很多教程可以做到这一点。

There is nothing difficult in mixing OpenGL and OpenCV. These are just two libraries, one for graphics and the other for computer vision. There is no overlap so you can just include both in your project.

Then it should be a matter of rendering some rectangle or a box (or whatever you wish to locate using OpenCV) - there are plenty of tutorials for that, and then copying the rendered data using the glReadPixels() function to client memory and passing that to OpenCV.

There is no tutorial most likely because it is so simple ...

You can just:

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);

    // ...
}

If you're happy with default OpenGL window, you can use the Init(false). If you want fancy bit depths and stencil buffers and whatnot, initialize OpenGL yourself using the OS' window handle. There are really really many tutorials for doing that.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文