juauer / modelcars

GNU General Public License v3.0
0 stars 1 forks source link

Vektor zwischen zwei Einzelbildern bestimmen #11

Open juauer opened 7 years ago

juauer commented 7 years ago

Es soll eine Funktion f geben (siehe auch #10 ), mit f:(NxN, NxN, R³)->R³

f bekommt zwei Bilder i1, i2 und einen Vektor (x,y,th) mit einer Vermutung wie man i2 um sein Zentrum drehen und relativ zum Zentrum von i1 verschieben muss, so dass man i1 und i2 stitchen könnte (was wir aber nicht wollen). Zurückgegeben wird eine Korrektur des übergebenen Vektors.

Das Problem ist nicht trivial und die Lösung nicht offensichtlich. Ich schlage folgenden Ansatz vor:

  1. Anhand der ersten Schätzung werden die Bilder übereinandergelegt und der Auschnitt bestimmt, der die überlappende Region definiert. Um Performanz zu gewährleisten, sollte man die maximale Größe einstellen können.
  2. Es werden die Helligkeits Gradienten für beide Bilder in der relevanten Region berechnet (Laplace). Der Unterschied zwischen den durchschnittlichen Gradientenrichtungen der beiden Bilder liefert die Korrektur des Winkels th. Das zweite Bild wird in der Rotation korrigiert.
  3. Zusätzlich wird jetzt ein dense optical flow berechnet um die (x,y) Verschiebung zu berechnen. Das gibt es bei opencv
juauer commented 7 years ago

Ich habe das nach cps2 gemerged. Wir brauchen es doch dringend! Kann das parallel zu #12 fertig werden? Ansonsten wär's mir lieber, Du machst zuerst das hier fertig.

Es gibt (vorerst) zwei TODOs in der Funktion selbst (in map.cpp), ein weiteres in der Testfunktion in test_image_distance.cpp und fehlende Parameter in test_image_distance.launch.

juauer commented 7 years ago

Ich habe mir gerade den Test-Code angeschaut und bin daraus nicht schlau geworden. Ich habe das deshalb in 3bc7619cab9c0d2d8baf1286982b91114d1a1c33 mal geändert. Ich berechne jetzt das zweite Bild aus dem ersten, damit ich die exakten Zahlen habe. Dann gebe ich einen beliebigen Guess ab und schaue die Korrektur an (Konsolen-Output beachten). Das Ergebnis ist aber nicht was ich erwartet hätte - wenn ich die Funktion auf diese Art aufrufe, sieht es aus, als würde er in die falsche Richtung korrigieren?

Vielleicht habe ich auch die Signatur falsch verstanden. Ich habe mal etwas ausführlicher in's doxy geschrieben, was ich von der Funktion erwarte. Falls das falsch ist, bitte einfach wieder ändern.

Was genau ist jetzt hier los? Wie kann ich das richtig benutzen?

juauer commented 7 years ago

Sieht jetzt besser aus.

juauer commented 7 years ago

Liegt aber immer noch ziemlich daneben. Irgendetwas stimmt da nicht - oder ich benutze es falsch?

juauer commented 7 years ago

Ich habe heute in 56e1f7bfc78b89f7e40577a03b6b00a8791e21a9 den brute force Ansatz gebaut. Das scheint zu funktionieren, ist aber vieeel zu langsam (der call bleibt deshalb auskommentiert).

Vielleicht kannst Du aber beim Vergleich mit dem 'smarten' Ansatz erkennen, wo dessen Fehler liegt. Ich habe z.B. heute überraschend (für mich) einmal durch 2 geteilt, um die abgeschnittenen Bilder logisch zusammen zu schieben. Sowas.

Mein Debug Code könnte auch für Dich wiederverwertbar sein.

Ansonsten werde ich erstmal versuchen, meine Kartenschnipsel noch etwas zu verkleinern.