Wie zeichnet man eine, die die Perspektive Korrigieren-Gitter in 2D
Ich habe eine Anwendung, die definiert, eine Reale Welt Rechteck auf einem Bild/Foto, natürlich in 2D kann es nicht sein, ein Rechteck, denn Sie betrachten es aus einem Winkel.
Das problem ist, sagen, dass das Rechteck muss Gitterlinien gezeichnet ist, zum Beispiel, wenn es 3x5, also muss ich zeichnen 2 Linien von Seite 1 zu Seite 3, und 4 Zeilen von Seite 2 auf Seite 4.
Ab jetzt bin ich brechen jede Zeile in äquidistante Teile, um die start-und end-Punkt aller Linien des Rasters. Doch je mehr von einem Winkel, das Rechteck ist, desto mehr "falsche" diese Zeilen, werden als horizontale Linien weiter aus, Sie sollten näher zusammen.
Kennt jemand den Namen des Algorithmus, den ich suchen sollte?
Ja, ich weiß, Sie können dies tun, in 3D, allerdings bin ich beschränkt auf 2D für diese spezielle Anwendung.
ja, das wäre ein Beispiel
hatten Sie kein Glück mit diesem Projekt? Ich brauche etwas, das sehr ähnlich! danke
InformationsquelleAutor Neil N | 2009-02-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist die Lösung:
http://freespace.virgin.net/hugo.elias/graphics/x_persp.htm
Die Grundidee ist, finden Sie die richtige Perspektive "Zentrum" des Rechtecks durch das verbinden der Ecken Diagonal. Der Schnittpunkt der beiden resultierenden Linien ist Ihre Perspektive korrigieren Zentrum. Von dort werden Sie unterteilen das Rechteck in vier kleinere Rechtecke, und wiederholen Sie den Vorgang. Die Anzahl der Zeiten hängt davon ab, wie genau Sie es wollen. Sie können unterteilen, um nur unterhalb der Größe eines pixels, um effektiv perfekte Perspektive.
Dann in Ihre subrectangles Sie nur Ihre standard-unkorrigiert "strukturierte" Dreiecke, oder Rechtecke oder was auch immer.
Können Sie führen Sie diesen Algorithmus, ohne auf die komplexen Probleme des Aufbaus einer 'echten' 3d-Welt. es ist auch gut, denn wenn Sie tun haben eine echte 3d-Welt modelliert, sondern Ihre textriangles nicht die Perspektive korrigiert werden, die in hardware oder benötigen Sie einen leistungsfähigen Weg, um perspektivisch korrekte Flugzeuge ohne pro-pixel-rendering-Tricks.
Ich nehme an, so, aber, wenn Sie ein anständig genug, Mathematiker, wahrscheinlich könnte man ableiten, eine nicht-lineare transformation die matrix spiegelt die gleiche Beziehung zwischen Quell-und Ziel-Pixel. Ich bin nicht so der Mathematiker, aber ich zumindest wissen, die magischen Worte zu untersuchen, und nun, so tun Sie.
Hier ein aktualisierter link, der funktioniert: web.archive.org/web/20160413080849/http://freespace.virgin.net/...
InformationsquelleAutor Breton
Bild: Beispiel für eine Bilineare & Sicht-Transformation (Hinweis: Die Höhe der oberen & unteren horizontalen grid-Linien tatsächlich die Hälfte der übrigen Linien Höhe, auf beide Zeichnungen)
========================================
Ich weiß, das ist eine alte Frage, aber ich habe eine generische Lösung, so dass ich beschloss, es zu veröffentlichen-hopping, es wird nützlich sein, um den zukünftigen Lesern.
Der code Balg ziehen können eine beliebige Perspektive Netz ohne die Notwendigkeit von sich wiederholenden Berechnungen.
Beginne ich eigentlich mit einem ähnlichen problem: zeichnen Sie eine 2D-Perspektive, Netz-und dann verwandeln Sie das unterstreichen-image zum wiederherstellen der Perspektive.
Ich begann zu Lesen, hier:
http://www.imagemagick.org/Usage/distorts/#bilinear_forward
und dann hier (die Bibliothek Leptonica):
http://www.leptonica.com/affine.html
waren, fand ich dies:
Ist die transformation nicht linear, wie viele Menschen bereits darauf hingewiesen, in diesem thread. Es beinhaltet die Lösung eines linearen system von 8 Gleichungen (einmalig) berechnen Sie die 8 benötigten Koeffizienten und dann können Sie Sie zu verwandeln, so viele Punkte wie Sie wollen.
Zu vermeiden, einschließlich aller Leptonica Bibliothek in mein Projekt, ich nahm ein paar Stücke von code, das ich entfernt alle speziellen Leptonica Datentypen & Makros, ich reparierte einige Speicherlecks und ich baute es zu einer C++ - Klasse (meist aus Gründen der Kapselung), die nicht nur eine einzige Sache:
Es ordnet ein (Qt) QPointF float - (x,y) - Koordinate in der entsprechenden Perspektive zu Koordinieren.
Wenn Sie anpassen möchten, den code zu einem anderen C++ - Bibliothek, das einzige, was neu zu definieren/ersetzen ist die QPointF koordinieren Klasse.
Ich hoffe, dass auch zukünftige Leser würden es nützlich finden.
Der code unten wird in 3 Teile unterteilt:
A. Ein Beispiel dafür, wie die genImageProjective C++ - Klasse zum zeichnen eines 2D-Perspektive Grid
B. genImageProjective.h-Datei
C. genImageProjective.cpp Datei
Danke für die info. Ich war eigentlich denken, & Experimentieren mit OpenCV irgendwann in der Zukunft, so dass dies eine zusätzliche Motivation, es zu tun.
Also, wenn keine zwei Kanten kollinear, diese Lösung funktioniert. Wenn jede Kante ist kollinear mit dem gegenüber, finde ich eine affine transformation. Aber was ist, wenn ein paar von Kanten kollinear, und ein paar nicht? Wie soll ich es machen?
die Lösung, die ich oben dargestellt, funktioniert im Fall, den Sie beschreiben. Es funktioniert auch, wenn die beiden Rand-Paare sind colinear (d.h. in einem normalen Rechteck Fall) aber in diesem letzteren Fall wird eine lineare ransformation 😉 (PS: ich gehe davon aus, dass durch die 'kollinearer' du meinst parallel. Wenn Sie eigentlich kollinear, liefern Sie bitte eine Zeichnung, denn das ist jenseits meiner Vorstellungskraft)
Ich bin sehr Leid, ich hatte einen Fehler in meiner eigenen Implementierung gaussjordan(), die fehlgeschlagen, wenn zwei Kanten parallel ... ich habe es behoben und es funktioniert jetzt 🙂 BTW. Ich benutze es zum transformieren eines Fotos, Benutzer können ziehen Sie jede Ecke des Bildes einzeln 🙂 i.imgur.com/tCDfhZx.png
InformationsquelleAutor Fivos Vilanakis
Während mein google-fu hat, konnte nicht produzieren jede solide mathematische Lösung, vielleicht ist diese Zeichnung, die ich fand konnte dir ein wenig helfen.
http://studiochalkboard.evansville.edu/lp-diminish.html
Ich denke, es könnte tatsächlich ziemlich schwierig zu kommen mit der richtigen Mathematik auf Ihre eigene, es ist wahrscheinlich eine Art von logarithmischer oder Summierung Ausdruck. Hoffentlich ist die Zeichnung und der Bezug zu diesem link, könnte etwas ein wenig mehr durchsuchbar für Sie.
InformationsquelleAutor Cheese Daneish
Mit Breton 's subdivision-Methode (die mit Mongo' s extension-Methode), erhalten Sie präzise beliebige Kraft-der-zwei Divisionen. Aufgeteilt in non-power-of-zwei Divisionen mit diesen Methoden haben Sie zu unterteilen, um sub-pixel-Abstand, das kann sehr teuer werden.
Allerdings glaube ich, dass Sie anwenden können eine variation der Haga ' s Theorem (welches in origami-teilen Sie eine Seite in Nths gegeben, eine Seite unterteilt sich in (N-1)ths) an der Perspektive-Quadrat Unterabteilungen zu produzieren willkürlichen Trennungen von der nächsten Potenz von 2 ist die zimmerreserviereung, ohne das weiter zu unterteilen.
Anstatt das sub-pixel-acuracy, ich denke, ich werde tun, eine "binäre Suche" für jede Unterteilung. Also wenn ich spaltete meine rect in Drittel, würde ich im Grunde tun eine binäre Suche innerhalb einer gewissen Genauigkeit von 33.33% und 66.66%, dann eine gewichtete bisection mit jedem "Teil" (und durch das Teil-ich meine, wenn ich die halbierten 4 mal, es ergäben sich eine perspektivisch korrekte 16)
InformationsquelleAutor Sparr
Die eleganteste und Schnellste Lösung wäre, dass Sie die homography matrix, welche Karten Rechteck-Koordinaten, Foto Koordinaten.
Mit einer anständigen matrix-Bibliothek-es sollte nicht eine schwierige Aufgabe, solange Sie wissen, Ihre math.
Keywords: Collineation, Homography, Direkte Lineare Transformation
Jedoch der rekursive Algorithmus oben sollte funktionieren, aber wahrscheinlich nur, wenn die Ressourcen begrenzt sind, projektive geometrie ist der einzige Weg zu gehen.
InformationsquelleAutor Ugauga
In dem speziellen Fall, wenn man sich senkrecht zu den Seiten 1 und 3, teilen Sie jene Seiten zu gleichen teilen. Zeichnen Sie dann eine Diagonale, parallelen zu ziehen zu Seite 1 durch jeden Schnittpunkt der diagonalen und die Trennlinien gezogen früher.
InformationsquelleAutor stevenvh
Diese eine geometrische Lösung, die ich dachte. Ich weiß nicht, ob der 'Algorithmus' hat einen Namen.
Sagen, dass Sie möchten, starten Sie durch Division der 'Rechteck' in n Stücke mit vertikalen Linien zuerst.
Das Ziel ist, platzieren Sie die Punkte P1..Pn-1 auf der oberen Linie, die wir verwenden können, zum zeichnen von Linien durch Sie die Punkte, wo die linke und Rechte Linie treffen oder parallel zu Ihnen, wenn dieser Punkt nicht vorhanden.
Wenn die Obere und untere Zeile sind parallel zueinander legen Sie einfach thoose Punkte aufgeteilt die Obere Linie zwischen den Ecken zentriert ist.
Sonst Platz n Punkte Q1..Qn auf der linken Linie, so dass diese und der oberen linken Ecke sind gleich weit und ich < j => Qi ist näher an der oberen linken cornern als Qj.
Um einen überblick über die Q-Punkte der oberen Zeile finden Sie den Schnittpunkt S der Linie von Qn durch den oberen-rechten Ecke und die parallel zu der Linie durch den Schnittpunkt von oben und unten line. Verbinden Sie nun S mit Q1..Qn-1. Der Schnittpunkt der neuen Linien mit der obersten Zeile sind die wollten, P-Punkte.
Tun dies analog für die horizontalen Linien.
InformationsquelleAutor a427
Gegeben ist eine rotation um die y-Achse, vor allem, wenn die rotation Flächen sind planar, der Perspektive generiert wird, die durch vertikale Gradienten. Diese bekommen zunehmend näher in Sicht. Anstelle der Verwendung von diagonalen zu definieren, die vier Rechtecke, die Befugnisse von zwei... definieren Sie zwei Rechtecke, Links und rechts. Werden Sie höher als breit sind, schließlich, wenn man weiterhin unterteilen Sie die Fläche in schmaler vertikaler Segmente. Dieser bietet Platz für Oberflächen, die nicht rechteckig sind. Wenn eine rotation um die x-Achse, dann die horizontalen Gradienten benötigt werden.
InformationsquelleAutor Brian Coyle
Ich denke, dass die ausgewählte Antwort ist nicht die beste Lösung. Eine bessere Lösung ist die Anwendung der Perspektive der (projektiven) transformation eines Rechtecks auf einfache raster folgende Matlab-Skript und Bild zeigen. Implementieren Sie diesen Algorithmus mit C++ und OpenCV als gut.
InformationsquelleAutor Tae-Sung Shin
Das problem ist, dass es die transformation von 3D nach 2D, die immer Sie.
Hier's eine Anleitung, wie es gemacht wird.
InformationsquelleAutor Charlie Martin
Was Sie tun müssen, ist, stellen es in 3D (Welt) und projizieren es auf 2D (Bild).
Dies erfordert die Verwendung eines 4D-transformation matrix, die die Projektion auf eine 4D homogene unten, um eine homogene 3D-Vektor, die Sie dann konvertieren nach unten auf einem 2D screen space vector.
Ich konnte ihn nicht finden in Google, aber ein guter computer graphics Bücher haben die details.
Keywords Projektions-matrix, Projektion, transformation, affine transformation, homogene Vektor, Welt, Raum, Platz auf dem Bildschirm, eine perspektivische transformation, 3D-transformation
Und durch die Art und Weise, dies dauert in der Regel ein paar vorlesungen zu erklären. Also auf gut Glück.
Es ist nur ein Haufen von Mathematik, die nicht benötigt keine IO. Es wäre also super schnell.
"super schnell" ist relativ. Nicht mit 3D-Mathematik wäre "super schnell"ER. Werfen Millionen von Prozessor-Zyklen auf ein problem, das sollte Tausende ist nur ärger bringen. Was passiert, wenn er beschließt, zu einem 1024x1024 Gitter anstelle von 5x5?
InformationsquelleAutor Pyrolistical