我正在设计自己的增强现实应用程序。
我已经检测到我正在使用的模式的4个角。在按正确的顺序检测到四个角之后,我将它们传递给cvFindExtrinsicCameraParams2。
对于对象相对于相机框架的旋转和平移,我得到了很好的结果。
现在,我必须将该信息(“旋转向量”和“翻译向量”)放入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();
}

好的,作为我MainWindow构造函数中的补充说明,我有类似以下内容:
windowGL = new GLWidget();
windowGL.setParent(this);

为了将GL窗口放入MainWindow内。我也在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投影和Modelview矩阵...嗯,那将非常有帮助...这是因为我找到了以下示例:
http://old.uvr.gist.ac.kr/wlee/web/techReports/ar/Camera%20Models.html

我遵循了所有步骤以成功实现2个相机型号之间的转换...
如果有人拥有有效的代码,我将不胜感激,谢谢!!!

最佳答案

我曾与CV合作对The Artvertiser进行自我姿势估计,而这些东西可以助您一臂之力。

首先,您需要弄清楚为什么看不到任何东西。可能有多种原因,最有可能是摄影机注视方向的反转(惯用性混淆),因此几何图形实际上是在OpenGL空间中的摄影机“后”。但是,我首先尝试的调试工作是:

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

  • 另外:这看起来有点令人怀疑:this->modelViewMatrix[i] = cameraMatrix[i];您是否尝试过首先反转cameraMatrix?

    10-08 04:16