Samstag, Juni 6, 2020

Wie erstellen Sie perspektivische Projektion-matrix, gegeben, Schwerpunkte und Kamera principal center

Konnte ich erwerben, die Kamera intrinsische und extrinsische Parameter mit Hilfe von OpenCV, also fx, fy, cx und cy. Und ich habe auch den Bildschirm /Bild-Breite und Höhe.

Aber wie erstelle ich ein OpenGL-Perspektive-Projektion-matrix aus diesen Parametern?

glFrustrum zeigt, wie Projektions-matrix, gegeben Z in der Nähe, weit Z und die Bildbreite und-Höhe. Aber wie füge ich die Schwerpunkte und Kamera-Zentren in dieser matrix?

Wie erstellen Sie perspektivische Projektion-matrix, gegeben, Schwerpunkte und Kamera principal center

InformationsquelleAutor sub_o | 2014-02-27

5 Kommentare

  1. 9

    Hier ist der code zu erhalten, der OpenGL-Projektions-matrix entspricht einer computer-vision-Kamera mit Kamera-matrix K=[fx, s, cx; 0, fy, cy; 0, 0, 1] – und Bild-Größe [W, H]:

    glMatrixMode(GL_PROJECTION); //Select The Projection Matrix
    glLoadIdentity();            //Reset The Projection Matrix
    GLdouble perspMatrix[16]={2*fx/W,0,0,0,2*s/W,2*fy/H,0,0,2*(cx/W)-1,2*(cy/H)-1,(zmax+zmin)/(zmax-zmin),1,0,0,2*zmax*zmin/(zmin-zmax),0};
    glMultMatrixd(perspMatrix);
    

    NB: zmin und zmax darstellen, die nahen und die Fernen Z-clipping-Ebenen. Bei dieser Formulierung wird davon ausgegangen, dass die OpenGL-Welt coordinate frame ist wie folgt:

    Wie erstellen Sie perspektivische Projektion-matrix, gegeben, Schwerpunkte und Kamera principal center

    Den OpenGL-Kamera wird davon ausgegangen, dass sich an der Herkunft, Blick in Richtung positive Z-Achse, mit einem down-Vektor kollinear, und die Richtung der positiven Y-Achse.

    • sorry für die Wiederaufnahme eine alte post, aber ich denke, dass perspMatrix[8]=2/imgWidthcx-1 und nicht 1-2/imgWidthcx. Meine Gedanken basieren auf Gleichung (7) von diesem link: kgeorge.github.io/2014/03/08/… , können Sie mir ein feedback zu meinem Kommentar?
    • Die OpenGL-Projektionsmatrix ist eine Zusammensetzung mehrerer logischer Transformationen (Welt-Koordinaten-focal-Koordinaten Bild-Koordinaten der normalisierten device-Koordinaten), so dass sich die form der endgültigen matrix hängt wirklich davon ab, was world coordinate frame, den Sie wählten. Ich arbeitete auf, dass vor kurzem, also werde ich Bearbeiten, meine Antwort zu machen, die dazugehörigen world coordinate frame klarer.
    • In Fall müssen Sie eine andere Konvention für die Eingabe world coordinate frame, Sie müssen zur Ableitung der Gleichung selbst. Ich fand Song Ho Ahn ‚ s Seite sehr hilfreich in dieser Hinsicht.
    • kann mir jemand erklären, wie das Projektions-matrix erzeugt wurde?
    • es ist ein wenig mühsam, nicht von hand, so dass ich gezielt abgeleitet die entsprechende transformation Gleichungen und verwendet ein computer-algebra-system zu vereinfachen.
    • Ich bin immer fast die gleichen Projektions-matrix mit Sie, aber die einzigen Unterschiede sind, diese Parameter : 2*(cx/W)+1, 2*(cy/H)+1 die Gleichung, Die ich verwendet habe, ist : Projektions-matrix = NDC * Persp. Projektion, wo NDC-matrix ist eine matrix generiert aus den glOrtho Funktion in OpenGL und perspektivische Projektion-matrix wurde erzeugt, indem geändert wird, ein wenig die intrinsischen Parameter der Kamera (die Erhaltung der Z-Tiefe der Informationen und für die korrekte clipping).
    • Unterschiedliche Konventionen koordinieren wird, zu unterschiedlichen Ergebnissen führen (siehe Luca ‚ s Antwort), so dass ich kann Ihnen nicht sagen, warum Sie Ihre matrix ist anders. Aber wenn Ihr Projektions-matrix die für Sie arbeitet, dann ist alles gut 🙂

  2. 3

    In Bezug auf die AldurDisciple Antwort dies ist die Formulierung, die Sie verwenden müssen, wenn die Welt coordinate frame gewählt mit invertierten z-axe

    Wie erstellen Sie perspektivische Projektion-matrix, gegeben, Schwerpunkte und Kamera principal center

    glMatrixMode(GL_PROJECTION); //Select The Projection Matrix
    glLoadIdentity();            //Reset The Projection Matrix
    GLdouble perspMatrix[16]={2*fx/w,0,0,0,0,2*fy/h,0,0,2*(cx/w)-1,2*(cy/h)-1,-(far+near)/(far-near),-1,0,0,-2*far*near/(far-near),0};
    glMultMatrixd(perspMatrix);
    
    • sorry für die Kommentare auf einen alten Beitrag, aber ich würde gerne wissen, den Matrizen, Sie haben multipliziert, um zu verstehen, wie Sie erzeugt die Projektions-matrix. Ich sah ein paar tutorials bereits erwähnt, aber ich kann immer noch nicht herausfinden, wie der Wert -1 (fand ich, dass Wert +1) generiert wird, der in Parameter 2*(cx/w)-1 und 2*(cy/h)-1. Wenn ich mit Ihr Projektions-matrix, in meine AR-Anwendung ist die Projektion korrekt.
    • warum Ihr Bezugsrahmen ist der LINKEN hand? Nicht opengl definieren einen RECHTEN frame of reference?
    • Außerdem, wenn Sie umkehren der Z-Achse als @AldurDisciple Antwort, warum Sie nicht negieren 2*(cx/w)-1,2*(cy/h)-1? ist das ein Fehler???
  3. 1

    Open GL arbeitet mit einem Pyramidenstumpf die im Zusammenhang mit der perspektiv-Projektion mit einige Grenzen in der Tiefe bezeichnet als near-und far-Werte. Stellen Sie sich eine Pyramide auf der Seite liegend – dies ist pyramidenstumpfs. Eine andere Analogie ist ein Projektor, der Balken, erstreckt sich in Ihrer Breite und Höhe mit der Distanz, das ist pyramidenstumpfs zu. Also rechts, Links, unten und oben sind Ihre Bild-Koordinaten, während in der Nähe und weit sind Ihre Tiefe Grenzen mit der in der Nähe beint Ihr focal-plane. OpenGL setzen wird, Cx und Cy in der Mitte der Bildebene so kann man Sie überspringen. Die alternative und Natürliche Art und Weise angeben, Pyramidenstumpf basiert auf der Blickwinkel-oder field of view (50-60 Grad (typisch); die Funktion, die Sie nennen, ist glPerspective(), wo Sie noch in der Nähe und weit, aber anstelle von Größen angeben, die Winkel und Seitenverhältnis. Viel Glück.

  4. -1

    Haben Sie cx, cy, fx, fy, width, height.

    Und Sie benötigen left, right, top, bottom in Ihre Gleichungen.
    Berechnen Sie diesen Wert mit diesem Weg.

    left = cx * near /-fx
    top = cy * near /fy
    right = -(width - cx) * near /-fx
    bottom = -(height - cy) * near /fy
    

Kostenlose Online-Tests