使用OpenGL在OpenCV图像上绘制对象

使用OpenGL在OpenCV图像上绘制对象,opencv,opengl,augmented-reality,Opencv,Opengl,Augmented Reality,我一直在尝试使用opengl在opencv的摄像头流上绘制3D立方体,但没有成功。添加了setOpenGlDrawCallback,但它没有将opengl图像覆盖到opencv图像上。下面是代码 trackingmanager.h是负责设备/帧等的类的头文件。 frameprocessor.h是类的头文件,用于对从相机获取的帧执行某些处理 namedWindow正在trackingmanager.cpp中初始化 namedWindow(wnd_name,WINDOW_OPENGL) 如果我不将o

我一直在尝试使用opengl在opencv的摄像头流上绘制3D立方体,但没有成功。添加了setOpenGlDrawCallback,但它没有将opengl图像覆盖到opencv图像上。下面是代码

trackingmanager.h是负责设备/帧等的类的头文件。 frameprocessor.h是类的头文件,用于对从相机获取的帧执行某些处理

namedWindow正在trackingmanager.cpp中初始化

namedWindow(wnd_name,WINDOW_OPENGL)

如果我不将opencv fram渲染到此窗口,我可以看到opengl图像被绘制到同一窗口。(注释掉tm->renderFrame()

此外,我在跑步时会看到以下消息

1] 初始化完成 2] Opengl支持可用

#包括
#包括“trackingmanager.h”
#包括“frameprocessor.h”
#包括
使用名称空间std;
静态void renderObject(void*param);
矢量平方;
int main(int argc,字符**argv)
{
TrackingManager*tm=新的TrackingManager();
FrameProcessor*处理器=新的FrameProcessor();
setOpenGlContext(tm->wnd_名称);
setOpenGlDrawCallback(tm->wnd_名称,renderObject,NULL);
而(tm->getFrame()){
正方形=处理器->进程(&tm->帧);
tm->renderFrame();
更新域名(tm->wnd_name);
int key=waitKey(10);
如果(键==27){
tm->释放摄像头();
打破
}
}
setOpenGlDrawCallback(tm->wnd_name,NULL,NULL);
返回0;
}
静态void renderObject(void*param)
{
glLoadIdentity();
glClearColor(0.0,0.0,0.0,0.0);
glClear(GLU颜色缓冲位);
GL3F(1.0,1.0,1.0);
格洛托(0.0,1.0,0.0,1.0,-1.0,1.0);
(0.0,0.0,-1.0);
glRotatef(55,1,0,0);
glRotatef(45,0,1,0);
glRotatef(0,0,0,1);
静态常数int坐标[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 } }
};
对于(int i=0;i<6;++i){
glColor3ub(i*20、100+i*10、i*42);
glBegin(GL_QUADS);
对于(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];
}
格伦德();
}
}

如果您同意使用python,那么可以通过pip获得一个名为scikit surgeryvtk的库。此库允许您轻松地将任意对象覆盖到opencv背景上。该库实现了VisualToolkit(VTK)来完成所有3D重载。这个库比openGL更高级(更容易使用)

您还需要一个带有CV\u WINDOW\u OPENGL标志的名称窗口。另外,
cerr@berak:已经通过trackingmanager对其进行了初始化。wnd_名称正用于初始化它。如果我不将opencv fram渲染到此窗口,我可以看到opengl图像被绘制到同一窗口。此外,您可以渲染图像或3d场景。它不会自动覆盖东西(如果你期望的话)@berak:好的。有没有办法把它们结合起来?或者我会说,我应该如何组合它们呢?嗯。渲染一个额外的地平面,用你的视频流作为纹理?(顺便说一句,有用的编辑)
#include <iostream>
#include "trackingmanager.h"
#include "frameprocessor.h"
#include <GL/glut.h>

using namespace std;
static void renderObject(void *param);
vector<vector<Point> > square;

int main(int argc, char **argv)
{
    TrackingManager *tm = new TrackingManager();
    FrameProcessor *processor = new FrameProcessor();
    setOpenGlContext(tm->wnd_name);
    setOpenGlDrawCallback(tm->wnd_name, renderObject, NULL);

    while(tm->getFrame()){
        square = processor->process(&tm->frame);
        tm->renderFrame();
        updateWindow(tm->wnd_name);

        int key = waitKey(10);
        if(key == 27){
            tm->releaseCamera();
            break;
        }
    }
    setOpenGlDrawCallback(tm->wnd_name, NULL, NULL);
    return 0;
}

static void renderObject(void* param)
{
     glLoadIdentity();
     glClearColor (0.0, 0.0, 0.0, 0.0);
     glClear (GL_COLOR_BUFFER_BIT);
     glColor3f (1.0, 1.0, 1.0);
     glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
     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();
    }
}