我正在设计自己的增强现实应用程序。
我已经检测到我正在使用的模式的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空间中的摄影机“后”。但是,我首先尝试的调试工作是:
另外:这看起来有点令人怀疑:
this->modelViewMatrix[i] = cameraMatrix[i];
您是否尝试过首先反转cameraMatrix?