Ich versuche eine perspektivische Transformation auf einer Bitmap durchzuführen, die ich über die Kamera aufnehme. Der Benutzer passt einen Begrenzungsviereck (wie durch das weiße Feld dargestellt) um ein rechteckiges Objekt an. Ich versuche dann, dies mit dem folgenden Code in ein rechteckiges Bild umzuwandeln:
%Vor%Allerdings enthält mein Ergebnisbild Bilddaten, die außerhalb der Grenzen meines Quads liegen. Dies wäre akzeptabel, wenn ich herausfinden könnte, wie die Koordinaten des Quads nach der Transformation sind, so dass ich das Ergebnis zuschneiden konnte, aber ich habe absolut keine Ahnung, wie das geht.
Jede Hilfe wäre sehr hilfreich, entweder die Koordinaten des Quads nach der Transformation zu finden oder idealerweise einen Weg zu finden, um zu verhindern, dass diese Situation überhaupt auftritt.
Eingabe:
Ausgabe:
Ich hatte das gleiche Problem und löste es, indem ich die Koordinaten des Rechtecks nach der Umwandlung fand.
Um diese Koordinaten zu finden, müssen Sie verstehen, was vor sich geht. Die Matrix definiert eine perspektivische Transformation, die durch die 4 Kantenpunkte des Quads und die entsprechenden Punkte gegeben ist. Sie haben dies mit dem folgenden Code getan:
%Vor% Dies bedeutet zum Beispiel, dass der obere linke Punkt Ihres Quads in den Punkt (0,0) umgewandelt wird. Sie können dies überprüfen, indem Sie die Matrix auf die Punkte anwenden und die resultierenden Werte überprüfen. Um die Matrix anzuwenden, können Sie die Methode mapPoints(...)
verwenden. Die definierte Transformationsmatrix funktioniert einwandfrei. Das (auf den ersten Blick) seltsame Verhalten dieser Transformation ergibt sich aus der Erstellung der Bitmap:
Die resultierende Bitmap scheint falsch zu sein, weil einige Punkte (zum Beispiel alle Punkte links vom oberen linken Punkt des Quads) in negative Koordinaten umgewandelt werden und wenn Sie etwas in eine Bitmap zeichnen wollen, haben die Koordinaten positiv sein. Aus diesem Grund sind die transformierten Punkte verschoben und das führt zu seltsamen Koordinaten der transformierten Punkte in der Bitmap.
Zum Schluss: Die Punkte werden korrekt in die neuen Koordinaten transformiert, können aber nicht angezeigt werden und sind deshalb verschoben und die verschobenen Koordinaten der transformierten Punkte in der Bitmap sind nicht die Koordinaten, die in der Transformation definiert sind -Matrix.
Um dieses Problem zu lösen und die richtigen Koordinaten der transformierten Punkte in der Bitmap zu erhalten, müssen Sie die Werte der Verschiebung berechnen. Die Verschiebung besteht aus einem x-Wert und einem y-Wert.
Um den x-Wert zu berechnen, transformierte ich den x-Wert des oberen linken Punktes und den x-Wert des unteren linken Punktes des ursprünglichen Bildes mit der vorher definierten Matrix. Entweder der obere linke Punkt oder der linke untere Punkt wird in die linke Grenze der resultierenden Bitmap transformiert, und deshalb ist der x-Wert der Bitmap-Koordinate dieses Punktes gleich 0 und der negierte (weil die x- Wert muss positiv sein) x-Wert der transformierten Koordinaten ist der x-Wert der Verschiebung. Der Punkt, der zur linken Grenze der resultierenden Bitmap transformiert wird, ist der Punkt mit dem maximalen negierten x-Wert. Daher ist der x-Wert der Verschiebung das Maximum der negierten x-Werte des transformierten oberen linken und unteren linken Punktes.
Um den y-Wert zu berechnen, habe ich den y-Wert des oberen linken Punktes und den y-Wert des oberen rechten Punktes des ursprünglichen Bildes transformiert, weil dies die möglichen Punkte sind, die in die obere Grenze transformiert werden der resultierenden Bitmap und der y-Wert des transformierten Punktes ist gleich 0 in der resultierenden Bitmap. Indem Sie wieder das Maximum der negierten Werte der transformierten y-Werte nehmen, erhalten Sie den y-Wert der Verschiebung.
Der resultierende Code sieht folgendermaßen aus:
%Vor% Nachdem Sie Ihr neues Bitmap
-Bild erstellt haben, können Sie Androids integrierte Crop-Funktionalität aufrufen, indem Sie eine 'crop'-Absicht erstellen und sie aufrufen, Beispiel:
Weitere Informationen zum Bildbeschneiden in Android erhalten Sie hier .
Sie müssen außerdem Folgendes in der Manifestdatei Ihrer App hinzufügen, damit dies funktioniert:
%Vor%