OpenCV + OpenGL + Qt



我正在设计自己的增强现实应用程序。我已经检测到了我正在使用的图案的4个角。在按正确的顺序检测到4个角之后,我将它们传递到cvFindExtrinicCameraParams2中。我得到了很好的结果,对象相对于相机帧的旋转和平移。现在我必须将这些信息(旋转矢量和平移矢量)放入OpenGL中来绘制一些东西。当然,我使用cvRodrigues2从旋转向量中得到旋转矩阵。除此之外,我正在用QGlWidget以这种方式观看相机:

GLWidget.h

#ifndef _GLWIDGET_H
#define _GLWIDGET_H
#include <QtOpenGL/QGLWidget>
#include <cv.h>
#include <cxcore.h>
class GLWidget : public QGLWidget {
    Q_OBJECT // must include this if you use Qt signals/slots
public:
    GLWidget(QWidget *parent = NULL);
    IplImage *img;
    void setImage(IplImage *imagen);
protected:
    void initializeGL();
    void resizeGL(int w, int h);
    void paintGL();
};
#endif  /* _GLWIDGET_H */

GLWidget.cpp

#include <QtGui/QMouseEvent>
#include "GLWidget.h"
GLWidget::GLWidget(QWidget *parent) : QGLWidget(parent) {
    this->img = 0;
}
void GLWidget::initializeGL() {
    glDisable(GL_TEXTURE_2D);
    glDisable(GL_DEPTH_TEST);
    glDisable(GL_COLOR_MATERIAL);
    glEnable(GL_BLEND);
    glEnable(GL_POLYGON_SMOOTH);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glClearColor(0, 0, 0, 0);
}
void GLWidget::resizeGL(int w, int h) {
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, w, 0, h); // set origin to bottom left corner
//    gluPerspective(52.0f, 1.3333f, 0.1f, 100.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
void GLWidget::paintGL() {
    if(this->img)
    {
        glClear (GL_COLOR_BUFFER_BIT);
        glClearColor(0.0,0.0,0.0,1.0);
        glMatrixMode(GL_PROJECTION);
        glPushMatrix();
        glLoadIdentity();
        gluOrtho2D(0.0,img->width, 0.0, img->width);
        glMatrixMode(GL_MODELVIEW);
        glPushMatrix();
        glLoadIdentity();
        glDrawPixels(img->width,img->height,GL_RGB,GL_UNSIGNED_BYTE,img->imageData);
        glMatrixMode(GL_PROJECTION);
        glPopMatrix();
        glMatrixMode(GL_MODELVIEW);
        glPopMatrix();
    }
}
void GLWidget::setImage(IplImage *imagen)
{
    this->img = imagen;
    this->updateGL();
}

好的,所以,在我的主窗口的构造函数中,我有一个额外的注释,比如:

windowGL = new GLWidget();
windowGL.setParent(this);

为了将总账窗口放在主窗口中。此外,我还在GLViewer.h中创建了一个新变量,名为:

double modelViewMatrix[16] = {0.0};

因此,为了显示3D对象,我在GLViewer中创建了一个方法,如下所示:

void GlViewer::setModelView(double cameraMatrix[]){
    for(int i=0;i<16;i++){
    this->modelViewMatrix[i] = cameraMatrix[i];
    }
    this->updateGL();
}

在那之后,我在用glDrawPixels()绘制图像后,显然在弹出矩阵后,将类似的东西放入GLViewer::paintGL()方法中:

    glMatrixMode(GL_MODELVIEW);
    glLoadMatrixd(this->modelViewMatrix);
    glPushMatrix();
    glColor3f(1,0,0);
    glPushAttrib(GL_COLOR_BUFFER_BIT | GL_POLYGON_BIT | GL_ENABLE_BIT) ;
    glDisable(GL_LIGHTING) ;
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) ;
    glLineWidth(3);
    glBegin(GL_LINES) ;
            glColor3f(1,0,0) ;
            glVertex3f(0,0,0) ;
            glVertex3f(100,0,0);
            glColor3f(0,1,0) ;
            glVertex3f(0,0,0) ;
            glVertex3f(0,100,0);
            glColor3f(0,0,1) ;
            glVertex3f(0,0,0) ;
            glVertex3f(0,0,100);
    glEnd() ;
    glLineWidth(1) ;
    glPopAttrib() ;
    glMatrixMode(GL_MODELVIEW);
    glPopMatrix();

所以,对于modelViewMatrix,我考虑到我必须按列而不是行排序,或者转置,无论你想要什么。。。因此,自然地,作为最后一步,在我将相机的内在和外在转换为数组后,我将调用创建的函数GLWidget::setModelView:

windowGL.setModelView(convertedFromIntrExtr);

然而,我什么也没看到。。。我试过一个代码,我能画出轴,但没有投影矩阵。。。然而,当我使用glutPerspective()时(显然是在glMatrixMode(GL_PROJECTION)之后),我什么都看不到。。。所以,我不知道是否有人在不使用ARToolkit的情况下,在Qt中有一个增强现实的工作代码,因为正如我所说,我正在为自己获取外部相机参数。。。所以,如果有人有一个工作代码,你可以在其中获得外部相机参数,并将其转换为openGL投影和模型视图矩阵。。。嗯,很有帮助。。。这是因为我发现了这个例子:

http://old.uvr.gist.ac.kr/wlee/web/techReports/ar/Camera%20Models.html

我遵循了所有步骤来实现两种相机型号之间的转换,但没有成功。。。如果有人有一个工作代码,我会非常感激。。。谢谢

我曾在The Artvertiser上使用CV进行自我姿势估计,这些东西可以让你大吃一惊。

首先,你需要弄清楚为什么你什么都看不见。这可能是由于多种原因,最有可能的是相机视角方向的反转(利手混淆),因此在OpenGL空间中,几何体实际上"在"相机后面。但我会尝试的第一个调试方法是:

  • 通过在x和z维度上以0.1f的步长从-1到1循环绘制地网格,绘制glLines来定义y平面的一部分(假设y=上/下的右手坐标系:x是右的,y是上的,z指向屏幕外的你)(这样你就可以感觉到世界的规模和相机矩阵给你的方向)
  • 几何体"在"摄影机(按下按键可前后移动摄影机,然后移动一点,看看是否能找到几何体)
  • 几何体比例太大/太小(设置相机后立即按下捕捉键以使用glScalef调整全局比例)
  • 剪裁平面外的几何体(调整剪裁平面)

另外:这看起来有点可疑:this->modelViewMatrix[i] = cameraMatrix[i];你有没有试过先反转cameraMatrix?

相关内容

  • 没有找到相关文章