OpenCV + OpenGL + Qt

8

Ich entwerfe meine eigene Augmented-Reality-Anwendung. Ich habe bereits die 4 Ecken für die Muster entdeckt, mit denen ich arbeite. Nachdem ich die 4 Ecken in der richtigen Reihenfolge erkannt habe, übergebe ich sie an cvFindExtrinsicCameraParams2. Ich bekomme schöne Ergebnisse für die Rotation und Translation des Objekts bezüglich des Kamerarahmens. Jetzt muss ich diese Informationen (Rotationsvektor und Translation Vector) in OpenGL einfügen, um etwas zu zeichnen. Natürlich verwende ich cvRodrigues2, um die Rotationsmatrix vom Rotationsvektor zu erhalten. Außerdem beobachte ich die Kamera mit QGlWidget auf diese Weise:

GLWidget.h

%Vor%

GLWidget.cpp

%Vor%

Ok, also, als zusätzliche Notiz im Konstruktor meines MainWindows habe ich etwas wie:

%Vor%

Um das GL-Fenster in das MainWindow zu bringen. Außerdem habe ich eine neue Variable in GLViewer.h erstellt:

%Vor%

Um ein 3D-Objekt anzuzeigen, habe ich also eine Methode in GLViewer erstellt:

%Vor%

Danach setze ich die GLViewer :: paintGL () -Methode so etwas nach dem Zeichnen des Bildes mit glDrawPixels () und offensichtlich nach dem Auflösen von Matrizen:

%Vor%

Also, für ModelViewMatrix berücksichtige ich, dass ich in Spalten anstelle von Zeilen ordern muss, oder transponiere, was immer du willst ... Als letzten Schritt rufe ich natürlich die erstellte Funktion GLWidget :: setModelView auf, nachdem ich die intrinsische und extrinsische Kamera in ein Array konvertiert habe:

%Vor%

Ich sehe jedoch nichts ... Ich habe einen Code ausprobiert und ich bekomme das Zeichnen der Achsen, aber ohne die Projektionsmatrix ... Aber wenn ich glutPerspective () verwende (offensichtlich nach glMatrixMode (GL_PROJECTION)) Ich kann einfach nichts sehen ... also, ich weiß nicht, ob jemand da draußen einen funktionierenden Code in Qt mit Augmented Reality hat, ohne ARToolkit zu benutzen, weil ich, wie gesagt, die extrinsischen Kameraparameter für meine eigenen bekomme ... Also, wenn jemand einen Arbeitscode hat, in dem du die extrinsischen Kameraparameter bekommst und sie in OpenGL-Projektion und Modelview-Matrizen übersetzt ... hmm, wäre sehr hilfreich ... das liegt daran, dass ich dieses Beispiel gefunden habe:

%Vor%

Ich habe alle Schritte befolgt, um diese Konvertierung zwischen den 2 Kameramodellen ohne Erfolg zu erreichen ... Ich werde es wirklich schätzen, wenn jemand einen funktionierenden Code hat ... danke !!!

    
daleotar 29.05.2011, 07:37
quelle

1 Antwort

2

Ich habe mit CV für die Schätzung der Ich-Pose auf Der Artvertiser zusammengearbeitet, und dieses Zeug kann dir dabei helfen.

>

Zuerst müssen Sie herausfinden, warum Sie nichts sehen können. Dies kann verschiedene Gründe haben, am wahrscheinlichsten ist eine Umkehrung der Blickrichtung der Kamera (Verwirrung der Händigkeit), so dass die Geometrie tatsächlich im OpenGL-Raum hinter der Kamera liegt. Aber die ersten Debugging-Dinge, die ich ausprobieren würde, wären:

  • Zeichnen Sie ein Grundraster durch Schleifen von -1 nach 1 in Schritten von 0.1f in x- und z-Dimensionen und zeichnen Sie glLines, um einen Teil der y-Ebene zu definieren (rechtshändiges Koordinatensystem mit y = auf / ab: x ist rechts) , y ist oben, z zeigt auf dich aus dem Bildschirm) (auf diese Weise kannst du ein Gefühl für die Größe der Welt und die Orientierung bekommen, die dir deine Kameramatrix gibt)
  • Geometrie 'hinter' der Kamera (Fang Tasten drücken, um die Kamera vor und zurück zu bewegen, und bewegen Sie sich ein wenig und sehen, ob Sie die Geometrie finden können)
  • Geometrieskala zu groß / zu klein (fangen Sie die Tastenanschläge ein, um die globale Skalierung mit Hilfe von glScalef direkt nach dem Einrichten der Kamera anzupassen)
  • Geometrie außerhalb der Clipping-Ebene (Anpassen der Clipping-Ebene)

Auch: Das sieht ein bisschen suspekt aus: this->modelViewMatrix[i] = cameraMatrix[i]; Hast du schon mal versucht, cameraMatrix zu invertieren?

    
damian 10.06.2011 17:19
quelle