Transformieren eines Rechteckbildes in ein Viereck mit einem CATransform3D
Habe ich ein Bild und ein Satz von vier Punkten (Beschreibung eines Vierecks Q). Ich will verwandeln Sie das Bild so, dass es passt das viereck f: Photoshop nennt diese transformation "Verzerren." Aber laut der Quelle von diesem viereck (die Perspektive des Bildes im Raum bewegt), es ist in der Tat die Kombination aus einer Skalierung, Drehung und Perspektive matrix.
Frage ich mich, ob dies möglich ist, mit einem CATransform3D 4x4-matrix. Haben Sie irgendwelche Tipps, wie zu tun? Ich habe versucht, zu nehmen die vier Punkte und bauen 16-Gleichungen (aus A' = A x u) aber es hat nicht funktioniert: ich bin mir nicht sicher was ich verwenden soll, wie z, z', w und w' - Koeffizienten...
Das folgende Bild zeigt, was ich tun will:
Hier sind einige Beispiele für Punkte:
276.523, 236.438, 517.656, 208.945, 275.984, 331.285, 502.23, 292.344
261.441, 235.059, 515.09, 211.5, 263.555, 327.066, 500.734, 295
229.031, 161.277, 427.125, 192.562, 229.16, 226, 416.48, 256
cvFindHomography()
OpenCV-Funktion auch funktionieren würde für diesen Weg. InformationsquelleAutor der Frage MonsieurDart | 2012-02-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich einen kit, dies zu tun, auf iOS: https://github.com/hfossli/AGGeometryKit/
Stellen Sie sicher, dass Ihr Ankerpunkt ist oben Links (
CGPointZero
).Ich nehme keinen Kredit für diesen code. Alles was ich getan habe scheuern im internet und stellen gemeinsam verschiedene unvollständige Antworten.
InformationsquelleAutor der Antwort hfossli
Hier ist ein Beispielprojekt, das gilt code von hfossli die obige Antwort und legt eine Kategorie UIView, die setzt den Rahmen, und wendet die Transformation in einen Aufruf:
https://github.com/joshrl/FreeTransform
UIView+Viereck-code :
InformationsquelleAutor der Antwort joshrl
Wir haben schließlich diese Arbeit. Wir habe versucht verschiedene Methoden, aber die meisten versagten. Und einige waren sogar abrufen einer nicht-Identität berufen, wenn er die gleichen Punkte wie ein-und Ausgänge (zum Beispiel, der eine, von KennyTM... wir müssen etwas fehlt dort).
Mit OpenCV wie folgt, erhalten wir ein
CATransform3D
bereit benutzt zu werden auf einem CAAnimation Schicht:InformationsquelleAutor der Antwort MonsieurDart
Mit 100% Dank JoshRL, hier ist ein Swift-version von JoshRL s-Klasse.
Dieser wurde komplett und vollständig ausgetestet. Linien, die leiden, die "zu lange in Swift" - Ausgabe wurden überarbeitet und Zerstörung getestet. Es funktioniert einwandfrei in high-volume-Produktion.
Könnte nicht einfacher sein zu verwenden. Dieses Beispiel zeigt, wie die Verwendung im Swift unten.
2016 Swift version... voll arbeiten, kopieren und einfügen-Lösung
Zur Verwendung im Swift:
sagen, Sie haben eine container-Ansicht "QuadScreen".
Drop die Ansicht, die Sie wollen, zu Strecken, wird eine JoshQuadView in der Szene. "jqv" in dem Beispiel hier.
Einfach ausgedrückt: vier Eck-Griffe (also Bilder) in der Szene, als PNGs von Ihrem Griff-Symbolen. Den code einfach unten völlig Griffe diese Griffe; Folgen Sie einfach die Kommentare im code, wie auf sehr leicht stellen Sie Sie im storyboard.
Es ist nur eine Zeile code zu stretchen:
Als die Neugier, und für den Willen von google, es ist lächerlich einfach, dies zu tun in
Android
haben Sie einen eingebauten Befehl für die Neugestaltung polys. Diese ausgezeichnete Antwort kopieren und einfügen von code: https://stackoverflow.com/a/34667015/294884
InformationsquelleAutor der Antwort Fattie
ANKERPUNKT UNABHÄNGIGE Lösung:
Ich mag @joshrl Antwort, wo er macht eine Kategorie "UIView+Viereck" verwendet @hfossli ist die meisten ausgezeichnete Antwort oben. Jedoch, mehrere Anrufe, um die Kategorie zu ändern, das viereck schlägt fehl, und der code erfordert die AnchorPoint zu top-Links.
Meine Lösung (abgeleitet von den ihrigen):
UIView+Viereck.h:
UIView+Viereck.m:
Die oben genannte Kategorie ist so einfach und elegant ist, sollte Sie in jedem Werkzeugkasten. DANKEN YOUs, um die ultimativen Quellen der oben genannten code. Kein Kredit gegeben werden sollte, zu mir.
InformationsquelleAutor der Antwort John Fowler
Wenn Ihr neue viereck ist ein Parallelogramm, dann nennt man das "verbiegen" und getan werden kann leicht mit CGAffineTransform. Siehe Jeff LaMarche ' s exzellenten Artikel, CGAffineTransform 1.1.
Wenn Ihr neue viereck ist kein Parallelogramm, dann finden Sie die folgende Frage für wie sich zu bewerben CATransform3D: iPhone Bild Strecken (verzerren).
InformationsquelleAutor der Antwort Rob Napier
Mithilfe der integrierten Swift-matrix-Mathematik:
https://github.com/paulz/PerspectiveTransform#swift-code-example
InformationsquelleAutor der Antwort Paul Zabelin