Bitmap Pixel Koordinaten ändern

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...

Re: Bitmap Pixel Koordinaten ändern

Beitragvon wp_xyz » 13. Feb 2020, 12:01 Re: Bitmap Pixel Koordinaten ändern

Wegen der Geschwindigkeit habe ich mein Demo-Programm von oben für LazIntfImage umgeschrieben, und das ist jetzt erheblich schneller. Ich habe auch einmal das Original-Bild aus dem Beitrag weiter oben verwendet, und auch da erscheint das berechnete Bild augenblicklich.

Zum Testen einfach auf den "Entzerren"-Button klicken; die Referenzpunkte sind bereits eingetragen. Die Entzerrung funktioniert korrekt, es gibt keine "Löcher" (wie sollte es auch, denn die x/y-Schleife läuft ja über die Pixel des Zielbildes).
Dateianhänge
Entzerrung_LazIntfImage.zip
(677.2 KiB) 9-mal heruntergeladen
wp_xyz
 
Beiträge: 3080
Registriert: 8. Apr 2011, 08:01

Beitragvon ErnstVolker » 13. Feb 2020, 19:18 Re: Bitmap Pixel Koordinaten ändern

Hallo wp_xyz, hallo Winni,

zunächst einmal vielen Dank für die Hilfe.

Ich habe das Beispiel mal etwas abgeändert um meinen Hintergrund der Überlegungen, warum ich überhaupt das Programm bastel darzulegen. Im Anhang dazu eine Textadtei die in Das Stringgrid geladen werden kann. Das sind die Eckpunkte des roten Qadrates in Bildmitte.

Wenn man hier im Quelltext:
Code: Alles auswählen
const
  PD: T4Points = (          // Ziel-Bild ("D" = destination)
    (x:  0;   y:    0),
    (x:  0;   y:30),
    (x:30; y:30),
    (x:30; y:    0)
  );


die Kantenlängen des Quadrates (das meinte ich immer mit "wahren Längen" bzw. "Weltkoordinate") vorgibt und den weiteren Quelltext etwas ändert:
Code: Alles auswählen
        destImg.SetSize(round(7*PD[2].X), round(6*PD[2].Y)); //----------------------->>>> Die "7" und die "6" sind frei gewählt, damit es passt. Setzt man die "6" auf "7", dann wird denom zu Null (zumindest bei mir)
        for y := 0 to destImg.Height - 1 do
        begin
          for x := 0 to destImg.Width - 1 do
          begin
            denom := (c[6] * x + c[7] * y + 1);
            u := (c[0] * x + c[1] * y + c[2]) / denom - destImg.Width / 3// ---------->>>> Auch hier ist das "1/3" bzw. in der nächsten Zeile "1/2" einfach durch Ausprobieren gesetzt.
            v := (c[3] * x + c[4] * y + c[5]) / denom - destImg.Height / 2;
 

dann erhält man das komplett entzerrte Bild.

Lässt man "7 * " und "6 * " sowie "- destImg.Width / 3" und " - destImg.Height / 2" weg, dann wird in Image2 nur das kleine Quadrat angezeigt.

Das angehängte Bild zeigt auch, dass das entzerrte Bild kleiner als das Ausgangsbild ist. Ich hätte es gerne genauso groß bei identischer Bildqualität.

Ich muß noch nachtragen, dass das Bild hier nur ein Testbild ist. Man kann sich aber vorstellen, dass es sich bei so einer Aufnahme um ein Stück Straße handelt, wo neben einem Wassereinlauf (das rote Quadrat dessen Abmessungen man kennt) eine Reifenspur verläuft (der Bogen rechts unterhelb daneben). Länge und Lage des Bogens sind dann das Interessante.
Klar kann man vier "Hütchen" oder ähnliches auf die Straße stellen und die vier Passpunkte gegeneinander vermessen (im Bild die vier Ecken mit den Diagonalen) aber das ist häufig nicht der Fall. Manchnal steht eben einfach nur ein Bild zur Verfügung und man muß sich, was die "wahren Längen" angeht, mit dem begnügen was da ist. Mittenmarkierung, Blockmarkierung, Kanaldeckel etc. Man ist nicht unbedingt zugegen wenn eine Spur noch frisch ist. Man wird häufig ein halbes oder 3/4 Jahr oder noch später damit konfrontiert. Dann ist die Spur längst weg, der Deckel oder die Markierungen aber noch da.

Meiner Meinung ist das auch sehr fehlerbehaftet. Ich denke man sollte hier beim Testbild nicht auf die Idee kommen das unterste linke 5 x 5 mm Kästchen als Referenz heran zu ziehen um dann die Abmessungen des roten Quadrates, des umgebenden Vielecks, der Ellipse oder des Bogens ermitteln zu wollen.

Viele Grüße

Volker
Dateianhänge
Ergebnis.PNG
EckenQuadrat.txt
(943 Bytes) 3-mal heruntergeladen
Zuletzt geändert von ErnstVolker am 13. Feb 2020, 22:34, insgesamt 1-mal geändert.
ErnstVolker
 
Beiträge: 239
Registriert: 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Winni » 13. Feb 2020, 21:14 Re: Bitmap Pixel Koordinaten ändern

Hallo!

Ich hab mal auf die Schnelle dem Project 3 Optionen hinzugefügt:

a) Mittels BGRA eine lineare Projection
b) Mittels BGRA eine perspectivische Projection
c) Danach kann man das Bild schärfen.

Ich wollte nur zeigen wie einfach es damit geht.

Winni
Dateianhänge
Entzerren.zip
(695.04 KiB) 12-mal heruntergeladen
Winni
 
Beiträge: 36
Registriert: 2. Mär 2009, 16:45
Wohnort: Fast Dänemark
OS, Lazarus, FPC: Laz2.06, fpc 3.04 | 
CPU-Target: 64Bit
Nach oben

Beitragvon ErnstVolker » 14. Feb 2020, 10:47 Re: Bitmap Pixel Koordinaten ändern

Wie kann man denn ein LazIntfImage vergrößern? Bei den BGRABitmap geht es mit Resample.
ErnstVolker
 
Beiträge: 239
Registriert: 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Winni » 14. Feb 2020, 12:24 Re: Bitmap Pixel Koordinaten ändern

Mit

TLazCanvas.StretchDraw

Winni
Winni
 
Beiträge: 36
Registriert: 2. Mär 2009, 16:45
Wohnort: Fast Dänemark
OS, Lazarus, FPC: Laz2.06, fpc 3.04 | 
CPU-Target: 64Bit
Nach oben

Beitragvon wp_xyz » 14. Feb 2020, 12:34 Re: Bitmap Pixel Koordinaten ändern

ErnstVolker hat geschrieben:Wie kann man denn ein LazIntfImage vergrößern?

Das steht im wiki: https://wiki.freepascal.org/Developing_ ... _LazCanvas

Ich finde, es ist falsch, wenn du die Koeffizienten der Transformationsgleichung berechnest und hinterher mit beliebigen Faktoren multiplizierst - dann sind das doch keine Lösungen mehr. Um mehr als das Zielviereck PD zu transformieren, musst du das Zielbitmap größer machen (das machst du), aber damit das rote Viereck nicht in die linke obere Ecke landet, musst du einen Offset auf die berechneten Koordinaten u, v addieren - das verschiebt quasi das transformierte Viereck im Zielbitmap. Auf diese Weise ist das rote Viereck immer gleich groß und im Zielbitmap sieht man, je nach Größe des Zielbitmaps mehr von der Umgebung. Allerdings muss bei jedem Zugriff auf Pixel nun geprüft werden, ob nicht der Bildbereich verlassen wird.

In der beigefügten Abwandlung des obigen Demo-Programms sind die Koordinaten des roten Vierecks (vom Blatt abgelesen) schon im Grid eingetragen. Es kann nun ein größerer Ausschnitt als diese Viereck entzerrt werden. Mit den beiden Schiebereglern W und H kann das Zielbitmap breiter bzw. höher gemacht werden als das Referenzviereck PD fordert. Und mit den Schiebereglern dx und dy können die Koordinaten eines Zielpunktes in der Rechnung um einen entsprechenden Wert verschoben werden, wodurch man das Referenzviereck im Zielbitmap hinundherschiebt.

Aber: Man sieht auch dass das Referenz-Viereck zwar einigermaßen quadratisch ist, das Blatt Papier jedoch noch deutlich verzerrt ist. Ich denke, das kommt von der Perspektive: die rechten Winkel des Blattes werden unterschiedlich stark verzerrt, je nach dem, wie weit der entsprechende Eckpunkt vom Betrachter entfernt ist. Wahrscheintlich hängt das Ergebnis sehr empfindlich von der Wahl der koordinaten des roten Quadrats im Ausgangsbild ab. Nimmt man dagegen, wie bisher, die Koordinaten des alles einschließenden DIN A4 Blatts, tritt der Effekt nicht auf. Es könnte aber auch sein, dass die bisher verwendete Mathematik den Spezialfall der Extrapolation nicht richtig behandelt. (In winni's Demo gibt es einen Button "BGRA perspektivisch" - vielleicht kommt man hier weiter?)
Dateianhänge
Entzerrung.png
Entzerrung_LazIntfImage.zip
(680.61 KiB) 6-mal heruntergeladen
wp_xyz
 
Beiträge: 3080
Registriert: 8. Apr 2011, 08:01

Beitragvon ErnstVolker » 17. Feb 2020, 21:15 Re: Bitmap Pixel Koordinaten ändern

Hallo,

ich war das Wochenende nicht in der Nähe eines Rechners, deshalb erst jetzt meine Rückmeldung.

Vielen Dank für die Hilfe. Das mit den Schiebereglern ist optimal und bombig. Vor allem auch das Umgehen der Nulldivision und Darstellung der "Überbreite" mit schwarzem Rand Da wär' ich so schnell nicht drauf gekommen. Da fehlen mir schlicht die Ideen.

Das mit "Perspective Transformation" von BGRABitmap hatte ich damals nach dem Tutorial Nr. 10 mal probiert gehabt. Werde ich mir nochmal ansehen.

Nochmal vielen, vielen Dank Euch Beiden.

Viele Grüße
Volker
ErnstVolker
 
Beiträge: 239
Registriert: 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon ErnstVolker » 26. Feb 2020, 09:13 Re: Bitmap Pixel Koordinaten ändern

Hallo ich bin's nochmal zu dem Thema.

Mit BGRABitmap habe ich nach Winnis Vorschlag eine Entzerrung hinbekommen die der mit OpenCV ähnlet bzw. identisches liefert. Das Ergebnis ist nicht pixelig (siehe Anhang). Allerdings kann nur innerhalb der Vier Punkte entzerrt werden.

Innerhalb von "FillQuadPerspectiveMapping" findet doch die Lösung des (eines ähnlichen?) Gleichungssystemes statt, welches in den Beiträgen hier mit "slegen" gelöst wird. Kommt man die Lösung ran und kann da irgendwie den Lösungsvektor zwischenspeichern?
Dann könnte man die Berechnung nochmal mit neuen Zielpunkten durclaufen lassen und vorher den zwischengespeicherten Lösungsvektor vorgeben.

Bin beim Stöbern im Netz auf Graphics32 gestoßen. Da gibt es auch Transformationen aber die scheinen mir für das Problem hier nicht zielführend sein, oder muß man sie nur entsprechend anpassen?

Viele Grüße

Volker
Dateianhänge
Vieleck_Laz.jpg
ErnstVolker
 
Beiträge: 239
Registriert: 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon six1 » 26. Feb 2020, 12:44 Re: Bitmap Pixel Koordinaten ändern

...vielleicht denke ich völlig falsch, aber deine Zeichnung soll doch einem 2D Bild entsprechen, welches unter einem bestimmten Winkel der Sicht aus einer 3D Umgebung entstand...
Versuchst du jetzt, unter nicht Berücksichtigung, des Sichtwinkels aus der 3D Welt das Bild in 2D zu entzerren?

Ich hoffe, ich konnte meine Gedanken einigermaßen verständlich rüber bringen...
Gruß, Michael
six1
 
Beiträge: 144
Registriert: 1. Jul 2010, 18:01

Beitragvon ErnstVolker » 26. Feb 2020, 13:17 Re: Bitmap Pixel Koordinaten ändern

ich versuche eine perspektivische 2D Aufnahme in eine ebene 2D Aufnahme zu entzerren um die wahren Längen ausmessen zu können. Hier sind als Längen z.B. die Ellipse und/oder der Bogen interessant. Den Aufnahmewinkel und die Aufnahmehöhe sind nicht bekannt. Die Maße zwischen den äußeren Eckpunkten und die Diagonalen können bekannt sein und der Referenz dienen. Im allgemeinen würde man das zu fotografierende Areal einer Aufnahme so vermessen (Hütchen aufstellen, Kreuze aufsprühen etc.). Manchmal sind aber auch nur kleinere Bereiche in einem Bild als Referenz bekannt. Hier z.B. das rote Quadrat und man will trotzdem auf Bogen und Ellipse schließen können.
ErnstVolker
 
Beiträge: 239
Registriert: 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon six1 » 26. Feb 2020, 13:44 Re: Bitmap Pixel Koordinaten ändern

...und die Position der Aufnahmequelle zur 2D Aufnahme wäre doch aber eminent wichtig, oder nicht?
Sonst würde doch die Flucht verschiedener Objekte in der 2D Aufnahme nie stimmen nach meiner Meinung; naja, vielleicht habe ich einen Denkfehler...
Gruß, Michael
six1
 
Beiträge: 144
Registriert: 1. Jul 2010, 18:01

Beitragvon ErnstVolker » 26. Feb 2020, 15:36 Re: Bitmap Pixel Koordinaten ändern

...sie stehen aber nicht zur Verfügung. Teilweise hat man die Bilder nicht mal selbst gefertigt sondern erkennt nur den ein oder anderen markten Punkt/Abstand auf dem Bild, den man nachträglich vermisst
Die Abstände zwischen den Referenzpunkten sind ca. 6 - 8 Meter. Das Testbild hier in den Beiträgen ist nur ein mit dem Smartphone hinter der Balkontür schnell geschossen um das Prinzip zu verdeutlichen.

Die in den Beiträgen vorgestellten Lösungen von Winni und wp_xyz funktionieren sehr gut. Gerade die von wp_xyz. Lediglich dem fertigen Bild mangelt es an Auflösung. Es ist etwas pixelig. Man kann aber im CAD die entsprechenden Linien nachzeichnen. So viel erkennt man.

Ich dachte mit der Graphics32 wären evtl. besser aufgelöste Bilder hinzubekommen, aber die ProjectiveTransformation https://graphics32.github.io/Docs/Units ... /_Body.htm scheint gerade das Gegenteil von dem zu machen was ich vorhabe.
ErnstVolker
 
Beiträge: 239
Registriert: 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon wp_xyz » 26. Feb 2020, 18:45 Re: Bitmap Pixel Koordinaten ändern

ErnstVolker hat geschrieben:Die in den Beiträgen vorgestellten Lösungen von Winni und wp_xyz funktionieren sehr gut. Gerade die von wp_xyz. Lediglich dem fertigen Bild mangelt es an Auflösung. Es ist etwas pixelig.

Ich habe es nicht explizit erwähnt, aber ich hatte dein Originalbild durch Skalieren in einer Bildbearbeitung deutlich verkleinert, damit der Upload des Projekts ins Forum nicht zu groß wird. Das ist die Ursache für die Unschärfe.
wp_xyz
 
Beiträge: 3080
Registriert: 8. Apr 2011, 08:01

• Themenende •
Vorherige

Zurück zu Multimedia



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste

porpoises-institution
accuracy-worried