मैं अपना खुद का बढ़िया वास्तविकता अनुप्रयोग तैयार कर रहा हूं। मैं पहले से ही उन पैटर्न के लिए 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 कैमरा मॉडल के बीच है कि रूपांतरण प्राप्त करने के लिए सभी चरणों का अनुसरण सफलता ... अगर कोई कामकाजी कोड है तो मैं वास्तव में सराहना करूंगा ... धन्यवाद !!!
आपको glDrawPixels का उपयोग नहीं करना चाहिए क्योंकि आमतौर पर यह अजीब रूप से धीमा है। इसके बजाय आपको अपनी छवि बनावट के साथ एक बनावट वस्तु प्रस्तुत करना चाहिए। Http://www.opengl.org/resources/faq/technical/performance.htm देखें। पृष्ठभूमि को चित्रित करते समय गहराई बफर (या बाद में साफ़ करें) को अक्षम करना सुनिश्चित करें। – ypnos
हाँ, मैंने कोशिश की है, वास्तव में मुझे बनावट के साथ भी अच्छे परिणाम मिल रहे हैं ... हालांकि बात यह है कि: मेरे पास रोटेशन मैट्रिक्स (जो अच्छा है) और एक अनुवाद वेक्टर (जो अनसुलझा है) है क्योंकि ओपनजीएल ऐसा लगता है कि -1 और 1 के बीच कैमरा स्थिति के लिए केवल GL_MODELVIEW मानों के लिए स्वीकार किया जाता है ... मेरा मतलब है, ओपनजीएल एक्स अक्ष -1 के लिए बाईं ओर के रूप में ले रहा है और दाईं ओर +1 है ... वाई अक्ष ले रहा है - 1 नीचे और शीर्ष के लिए +1 ... तो मामला यह है कि अगर कोई जानता है कि उसे कैसे स्केल करना है क्योंकि मुझे – daleotar
'glMatrixMode (GL_TEXTURE) नहीं पता; 'एक एवेन्यू हो सकता है, या आप अपने बनावट निर्देशांक कैसे घोषित कर सकते हैं एक और। यही कहना है, अपने निर्देशांक को हाथ से बदल दें, फिर परिवर्तित समन्वय को दबाएं। – EnabrenTane