Ist es möglich, die Kamerakalibrierung zu hacken, ohne Zugriff auf die Kamera zu haben?

8

Oft müssen wir einen Videostream ohne Zugriff auf die Kamera verarbeiten. Der Zugriff auf die Kameramatrix wäre für verschiedene Verarbeitungstechniken von Vorteil. Ist es möglich, die Kamerakalibrierung zu hacken, ohne Zugriff auf die Kamera zu haben?

Ich habe einen Videostream von einer einzelnen Kamera, die auf einem fahrenden Auto montiert ist und die Straße aufzeichnet (daher mehrere parallele Linien auf der Grundebene, Ecken von Fahrspurmarkierungen, aber keine Kreise). Ich möchte eine Ansicht von oben nach unten erstellen, habe jedoch keinen Zugriff auf die Kamera. Ist es möglich? Wenn das so ist, wie?

Ich verstehe aus dem Lernen von OpenCV: Computer Vision mit dem OpenCV Library- Buch, dass ich die folgenden Matrizen benötige:

  1. Intrinsics und
  2. Verzerrung

.. zum cv2.undistort()Bild, Homographie berechnen cv2.getPerspectiveTransform()und cv2.warpPerspective()endlich die Draufsicht bekommen.

Frage

  1. Wie kann ich Intrinsics oder Distortion Matrices / Parameter berechnen / approximieren / erraten? Sind alle Parameter wichtig?
  2. Wäre es in Ordnung, Parameter von anderen Kameras (wie OpenCV-Quellcodebeispielen) zu kopieren?

Frühere Forschung:

  • OpenCV Python Camera Calibration Tutorial - Erfordert Zugriff auf die Kamera
  • Automatische Kalibrierung der Kamera - Gibt Hoffnung "Eine Kalibrierung kann erreicht werden, wenn mehrere Sätze paralleler Linien oder Objekte mit einer bekannten Form (z. B. kreisförmig) identifiziert werden."
  • Der Versuch, die mit der Kamerakalibrierung verbundenen Antworten [ 1 ] [ 2 ] [ 3 ] auf SO zu verstehen, versucht, Antworten auf mein Problem zu finden.

Irgendwelche Ideen? Schätzen Sie Ihre Hilfe im Voraus!


Update 1: Perspektiventransformationsexperiment

Ich hatte mit versucht getPerspectiveTransform(pts1,pts2)und dst = cv2.warpPerspective(img,M,(x,y), flags=flags)vier Punkten von Eingangsbild entspricht , eine Art von Top-Down - Ansicht zu erhalten. Aber ich bin mir nicht sicher, wie ich mit den Verzerrungen umgehen soll:

Auswählen von Punkten: Zuerst habe ich die Eingabe vergrößert und versucht, genau passende Außenpunkte auf den Fahrspurmarkierungen auszuwählen, um die Homografiematrix zu erstellen, und eine Vorschau des perspektivisch transformierten Bildes mit angezeigt warpPerspective. Ich sah, dass die Fahrspuren verzerrt waren, wusste aber nicht, wie schlimm sie waren. Um eine Vorstellung zu bekommen, habe ich Punkte ausgewählt, die an jedem Ende weiter durch Delta (50px) flach sind. Das bekomme ich:

Bildexperiment

Kann ich die Verzerrungen beheben, ohne Zugriff auf die Kamera zu haben? Gibt es eine andere Möglichkeit, dies zu beheben?

Nur wenige Eingabebilder zum Spielen: Imgur Imgur


Update 2: Nicht paralleler (gestreuter) optischer Fluss in der Ansicht von oben nach unten

Liegt das an Verzerrungen oder etwas anderem?: Imgur

Manav Kataria
quelle
1
mobileye.com/technology/mobileye-research - Alles hier könnte für Sie relevant sein
Andrey Rubshtein
Dies ist eine dieser Fragen, die gleichzeitig lehren. Es sieht so aus, als ob der Link zur Mobileye-Forschung nicht mehr besteht. Es gibt das aber; mobileye.com/our-technology
uhoh

Antworten:

5

Wenn ich das richtig verstehe, brauchen Sie weder die Intrinsics noch die Extrinsics, um dies zu erreichen, wenn Sie nur eine Ansicht von oben nach unten wünschen. Sie können im Grunde 4 Punkte auf Ihren parallelen Linien definieren und dann das gesamte Bild in eine kanonische Ansicht verwandeln (z. B.){{0,0},{480,960}}).

Um dies in OpenCV zu tun, müssen Sie lediglich die Homografie findHomographywie hier beschrieben berechnen . Verwenden Sie dann warpPerspective(siehe hier ), um Ihre Bilder zu verzerren.

Das einzige, was Sie beachten müssen, ist die Auswahl der Abmessungen der fronto-parallelen Ansicht, nach der Sie suchen. Es sollte mehr oder weniger dem Seitenverhältnis des ursprünglichen Bildbereichs entsprechen.


Zum zweiten Teil Ihrer Frage: Ja. Lassen Sie mich zunächst daran erinnern, dass viele Werke wie dieses die Verzerrungsschätzung ignorieren. Ich kann mir jedoch zwei Möglichkeiten vorstellen, um dies zu erreichen:

  1. Verwenden Sie die Fahrspuren selbst, um die Verzerrung zu korrigieren: Erstellen Sie in der fronto-parallelen Ansicht eine weitere perspektivische Verzerrung, sodass die Fahrspuren selbst vertikal sind. Stellen Sie sich in dieser Einstellung die Fahrspurlinien als verschwindende Linien im Bild vor (wie in einer perspektivischen Ansicht immer). Von dort aus können Sie sogar Ihre Kamera kalibrieren. Schauen Sie hier , hier und hier zum Beispiel.

  2. Die Autos sollten mehr oder weniger einer geraden / glatten Flugbahn folgen. Wenn Sie die Bewegung aller Autos berechnen, sollten sie Ihnen ähnliche Bewegungen parallel zu den Fahrspuren geben. Diese Informationen sind wiederum nützlich, um eine Transformation einzuschränken und zu generieren, die Ihr Bild auf eine reduzierte Verzerrung verzerren würde.

Tolga Birdal
quelle
Danke @tbirdal: (0) "Ignoriere die Verzerrungsschätzung" - ich habe damit faire Ergebnisse erzielt. Siehe Update 2 (1) Die Papiere scheinen sehr nützlich zu sein. Es kann jedoch eine Weile dauern, bis ich sie vollständig verstehen und antworten kann. (2) "[Autos] sollten Ihnen ähnliche Bewegungen parallel zu den Fahrspuren geben" - Gute Idee! Aber ich bekomme einen gestreuten (nicht parallelen) optischen Fluss auf den Spuren, sogar in der Ansicht von oben nach unten (siehe Update 2); Sie müssen herausfinden, wie Sie dies umgehen können.
Manav Kataria
Es ist schwierig, den optischen Fluss der Fahrspuren zu berechnen, da sie sich nicht sehr oft bewegen. Edge-Tracking-Ansätze wären wohl besser. (Wie bewegliche Kanten usw. oder sogar aktive Konturen)
Tolga Birdal
Ich habe einen Videostream, in dem die Kamera an der Vorderseite eines fahrenden Fahrzeugs montiert ist. Daher bewegen sich die Spurmarkierungen mit jedem Frame (Ausnahme: eine Spurendmarkierung, die durchgehend "---" und nicht "- - -" gestrichelt ist).
Manav Kataria