Fischauge



  • Hi,

    Ich will mit OpenGL ne echte Kamera simulieren und brauch dazu n'moeglichst realitaetnahes Fischauge.
    Wie sieht ein Fischauge mathematisch aus? Weiss das einer?



  • zur abbildungsgleichung kommen stärkere verzeichnungsparameter als in nichtsphärischen Abbildungen

    x_bild=Abbildung_x+x_bild*(r2*A01+r4*A02+r^6A03)
    y_bild=Abbildung_y+y_bild
    (r2*A01+r4*A02+r^6*A03)



  • b7f7 schrieb:

    zur abbildungsgleichung kommen stärkere verzeichnungsparameter als in nichtsphärischen Abbildungen

    x_bild=Abbildung_x+x_bild*(r2*A01+r4*A02+r^6A03)
    y_bild=Abbildung_y+y_bild
    (r2*A01+r4*A02+r^6*A03)

    Hae? Kannst das mal uebersetzen? 🙂



  • Normalerweise ergibt sich der Bildpunkt als Projektion von §D koordinaten in die ebene.
    Meist Lochkamera model.
    um jetzt die spherischen Störungen modelieren zu können wird noch ein Term angehängt, welcher in abhängigkeit vom Abstand zur optischen Achse das Bild verzeichnet.
    meist dieser simple A01*r2+A02*r4+A03*r^6 Term, wobei r=sqrt(x_bild2+y_bild2)
    A01..A03 liegen im Bereich von 10^1-3 bis 10^-12 für handelsübliche CCD Chips. A01>A02>A03 kannst ja mal mit nem Bild testen was passiert wenn man son term drauf anwendet sieht recht chick aus



  • Achso 🙂
    Ich hab das mal implementiert in OGL und werd nun einfach mal ausprobieren, wie's aussieht..

    thx!



  • Es hat wunderbar hin 🙂 sieht cool aus..



  • durito schrieb:

    Es hat wunderbar hin 🙂 sieht cool aus..

    Darf man code haben? *lieb guck und lernen will*



  • Hm, den ganzen code kann ich hier nicht rausrücken, ist Teil von nem grösseren Projekt, aber Fischauge geht so:
    -Du renderst alles ganz normal, aber vor "SwapBuffer" kopierst Du das Gerenderte (mit glCopyTexImage2D) in eine Textur.
    -Buffer löschen und ein Bildschirmfüllendes Rechteck zeichnen, bestehend aus möglichst vielen kleinen Rechtecken (Umso mehr, desto bessere "Fischauge-Auflösung).
    -Gerendertes Bild (von Punkt1) auf das Rechteck pappen und Textur-Koordinaten z.B. so berechnen:

    pxnew = 0.6*(px + (0.3*pow(r,2) + 0.3*pow(r,4)+0.3*pow(r,6))*(px));
    pynew = 0.6*(py + (0.3*pow(r,2) + 0.3*pow(r,4)+0.3*pow(r,6))*(py));
    

    wobei px/py die Texturkoordinaten des nicht verzogenen Rechtecks sind. pxnew/pynew sind die Koordinaten, welche das Bild verzerren.



  • Kannst du noch einen Screenshot zeigen zur Demonstration, das würd mich schon interessieren wie es aussieht 🙂



  • Hab vier screenshots auf
    http://home.zhwin.ch/~bcd/fisheye/

    Das erste Bild ist ohne Verzerrung, die anderen mit. Beim letzten sieht man anhand der Linien (Licht) ziemlich schön, wie verzerrt wird.
    Hab nur ne alte GraKa hier, desshalb inkl. Grafikfehler 😉

    PS: Hm, dieser Thread gehört wohl bald ins Grafikforum..


Anmelden zum Antworten