2011-05-29 10 views
8

मैं अपना खुद का बढ़िया वास्तविकता अनुप्रयोग तैयार कर रहा हूं। मैं पहले से ही उन पैटर्न के लिए 4 कोनों का पता लगा चुका हूं जिनके साथ मैं काम कर रहा हूं। एक उचित क्रम में 4 कोनों का पता लगाने के बाद मैं उन्हें cvFindExtrinsicCameraParams2 में भेज रहा हूं। मुझे कैमरे के फ्रेम के ऑब्जेक्ट सम्मान के घूर्णन और अनुवाद के लिए अच्छे परिणाम मिल रहे हैं। अब मुझे कुछ जानकारी खींचने के लिए ओपनजीएल में उस जानकारी (रोटेशन वेक्टर और ट्रांसलेशन वेक्टर) को रखना होगा। स्वाभाविक रूप से, मैं रोटेशन वेक्टर से रोटेशन मैट्रिक्स प्राप्त करने के लिए 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); 

जीडब्लू विंडो को मेनविंडो के अंदर रखने के लिए।

double modelViewMatrix[16] = {0.0}; 

तो, आदेश में एक 3D वस्तु प्रदर्शित करने के लिए मैं एक विधि GLViewer अंदर इस तरह बनाया: इसके अलावा, मैं GLViewer.h के भीतर एक नया चर कहा बनाई

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)) मैं बस कुछ भी नहीं देख सकता ... इसलिए, मुझे नहीं पता कि अगर किसी के पास एआरटूलकिट का उपयोग किये बिना बढ़ी हुई वास्तविकता के साथ क्यूटी में एक वर्किंग कोड है, जैसा कि मैंने कहा, मुझे बाहरी कैमरा मिल रहा है मेरे लिए पैरामीटर ... तो, अगर किसी के पास एक वर्किंग कोड है जिसमें आपको बाहरी कैमरा पैरामीटर और टीआर मिलता है उन्हें ओपन प्रक्षेपण और modelview मैट्रिक्स में nslate ... हम्म अच्छी तरह से, बहुत मददगार होगा ... इस वजह से मैं इस उदाहरण देखे हैं:

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

मैं बिना 2 कैमरा मॉडल के बीच है कि रूपांतरण प्राप्त करने के लिए सभी चरणों का अनुसरण सफलता ... अगर कोई कामकाजी कोड है तो मैं वास्तव में सराहना करूंगा ... धन्यवाद !!!

+0

आपको glDrawPixels का उपयोग नहीं करना चाहिए क्योंकि आमतौर पर यह अजीब रूप से धीमा है। इसके बजाय आपको अपनी छवि बनावट के साथ एक बनावट वस्तु प्रस्तुत करना चाहिए। Http://www.opengl.org/resources/faq/technical/performance.htm देखें। पृष्ठभूमि को चित्रित करते समय गहराई बफर (या बाद में साफ़ करें) को अक्षम करना सुनिश्चित करें। – ypnos

+0

हाँ, मैंने कोशिश की है, वास्तव में मुझे बनावट के साथ भी अच्छे परिणाम मिल रहे हैं ... हालांकि बात यह है कि: मेरे पास रोटेशन मैट्रिक्स (जो अच्छा है) और एक अनुवाद वेक्टर (जो अनसुलझा है) है क्योंकि ओपनजीएल ऐसा लगता है कि -1 और 1 के बीच कैमरा स्थिति के लिए केवल GL_MODELVIEW मानों के लिए स्वीकार किया जाता है ... मेरा मतलब है, ओपनजीएल एक्स अक्ष -1 के लिए बाईं ओर के रूप में ले रहा है और दाईं ओर +1 है ... वाई अक्ष ले रहा है - 1 नीचे और शीर्ष के लिए +1 ... तो मामला यह है कि अगर कोई जानता है कि उसे कैसे स्केल करना है क्योंकि मुझे – daleotar

+0

'glMatrixMode (GL_TEXTURE) नहीं पता; 'एक एवेन्यू हो सकता है, या आप अपने बनावट निर्देशांक कैसे घोषित कर सकते हैं एक और। यही कहना है, अपने निर्देशांक को हाथ से बदल दें, फिर परिवर्तित समन्वय को दबाएं। – EnabrenTane

उत्तर

2

मैं के लिए सीवी साथ काम किया है The Artvertiser पर अहंकार पैदा आकलन, और इस सामग्री में अपने सिर कर सकते हैं।

सबसे पहले, आप यह पता लगाने की क्यों तुम कुछ भी नहीं देख सकते हैं की जरूरत है।यह कई कारणों से हो सकता है, सबसे अधिक संभावना है कि कैमरा लुक-इन दिशा (सौहार्द भ्रम) का उलटा हो, इसलिए ज्यामिति वास्तव में ओपनजीएल स्पेस में कैमरे के पीछे है। लेकिन पहले डिबगिंग बातें मैं कोशिश करेगा होगा:

  • -1 एक्स और z आयामों में 0.1f की सीढ़ियों पर 1 से पाशन द्वारा एक जमीन ग्रिड आकर्षित, glLines ड्राइंग y विमान के एक हिस्से को परिभाषित करने के लिए (वाई = अप/डाउन के साथ राइथेंडेड समन्वय प्रणाली मानते हुए: एक्स सही है, वाई ऊपर है, जेड स्क्रीन से आपकी तरफ इशारा कर रहा है) (इस तरह आप दुनिया के पैमाने और अभिविन्यास के बारे में महसूस कर सकते हैं कि आपका कैमरा मैट्रिक्स आप)
  • ज्यामिति 'के पीछे' कैमरा (पकड़ keypresses कैमरा पीछे और आगे ले जाने के लिए, और एक सा चारों ओर ले जाने और देखते हैं आप ज्यामिति मिल सकता है)
  • दे रहा है
  • ज्यामिति पैमाने बहुत बड़ा/बहुत छोटा कतरन विमान के बाहर
  • ज्यामिति (पकड़ keypresses सही कैमरा सेट करने के बाद वैश्विक स्तर glScalef का उपयोग कर समायोजित करने के लिए) (कतरन विमान को समायोजित)

इसके अलावा: यह थोड़ा संदिग्ध दिखता है: this->modelViewMatrix[i] = cameraMatrix[i]; क्या आपने पहले कैमरा मैट्रिक्स को बदलने की कोशिश की है?

+0

नहीं, मुझे लगता है कि मुझे यह मिल गया है, बस मैं कैमरे के नकारात्मक और सकारात्मक के जेड अक्ष का अनुमान लगा रहा था ... – daleotar

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^