Wie erhalte ich die genaueste Kamerakalibrierung?


16

Zunächst einmal hoffe ich, dass dies die richtige Stack Exchange-Karte ist. Ich entschuldige mich, wenn es nicht ist.

Ich arbeite an etwas, bei dem ich die Kamera kalibrieren muss. Ich habe den Code dafür erfolgreich in OpenCV (C ++) implementiert. Ich verwende die eingebauten Schachbrettfunktionen und ein Schachbrett, das ich ausgedruckt habe.

Es gibt viele Tutorials im Internet, in denen angegeben wird, dass mehr als eine Ansicht des Schachbretts angezeigt und die Ecken aus jedem Frame extrahiert werden sollen.

Gibt es eine optimale Anzahl von Ansichten für die Funktion, um die genaueste Kamerakalibrierung zu erzielen? Was beeinflusst die Genauigkeit der Kalibrierung?

Wenn ich zum Beispiel 5 Bilder der gleichen Ansicht gebe, ohne etwas zu bewegen, führt dies zu eindeutigen Ergebnissen, wenn ich versuche, den Webcam-Feed zu verzerren.

Zu Ihrer Information: Ich habe kürzlich herausgefunden, dass Sie eine bessere Kamerakalibrierung erzielen können, indem Sie ein Raster aus asymmetrischen Kreisen und die entsprechende OpenCV-Funktion verwenden.

Antworten:


8

Sie müssen Bilder für die Kalibrierung aus verschiedenen Blickwinkeln und Blickwinkeln aufnehmen, wobei der Unterschied zwischen den Winkeln so groß wie möglich sein muss (alle drei Euler-Winkel sollten variieren), damit der Musterdurchmesser dennoch zum Sichtfeld der Kamera passte. Je mehr Ansichten Sie verwenden, desto besser ist die Kalibrierung. Dies ist erforderlich, da während der Kalibrierung Brennweiten- und Verzerrungsparameter erfasst werden. Um diese nach der Methode der kleinsten Quadrate zu erhalten, sind verschiedene Winkel erforderlich. Wenn Sie die Kamera überhaupt nicht bewegen, erhalten Sie keine neuen Informationen, und die Kalibrierung ist nutzlos. Beachten Sie, dass Sie in der Regel nur die Brennweite benötigen und die Verzerrungsparameter selbst für Consumer-, Web- und Handykameras vernachlässigbar sind. Wenn Sie die Brennweite bereits aus der Kamera-Spezifikation kennen, müssen Sie möglicherweise nicht einmal kalibrieren.

Verzeichnungskoeffizienten sind in "speziellen" Kameras wie Weitwinkel oder 360 ° vorhanden.

Hier ist der Wikipedia-Eintrag zur Kalibrierung . Und hier ist nichtlineare Verzerrung , die für die meisten Kameras vernachlässigbar ist.


Mit Euler-Winkeln meine ich, dass Sie die Kamera um das Schachbrett (mit dem Schachbrett als Drehpunkt) in x, y drehen und die Kamera in z auf das Schachbrett zu und von diesem weg bewegen? Ich habe von jemandem gelesen, der einfach verwandelte Schachbretter ausgedruckt und die Kamera am selben Ort aufbewahrt hat. Zum Beispiel: i.imgur.com/rYzV4.png und i.imgur.com/McG9z.png . Ist die Verwendung von Dingen wie diesem eine schlechte Entscheidung, da sie möglicherweise nicht darstellt, wie die Dinge in der Realität verlaufen würden?
Gepard

Ja zum Bewegen der Kamera. Ja nochmal, um an seinem Platz zu bleiben.
mirror2image

@ mirror2image Du meinst, im praktischen Betrieb ist es besser, verschiedene Blickwinkel zu ändern. Das bedeutet jedoch, dass unterschiedliche Ansichten unterschiedliche Weltkoordinationssysteme haben. Muss ich ein gemeinsames Weltkoordinationssystem verwenden, um die Objektpunkte im selben Koordinationssystem zu halten?
Richard

3

@Ben - Die Anzahl der Ansichten hängt von der Kamera und der endgültigen Genauigkeit ab.

Bei sehr hochwertigen Objektiven mit geringer Verzerrung (High-End-Spiegelreflexkamera mit 35 mm), die viele Schachbrettbilder zur Abbildung der Verzerrungen verwenden, können diese instabil sein, da die Verzerrungen Bruchteile eines Pixels sind.
Bei gedrehter Tafel (oder Kamera) müssen noch mehrere Aufnahmen gemacht werden, da die Bildmitte normalerweise nur wenige Pixel von den nominalen Werten x / 2, y / 2 entfernt ist und sich mit dem Fokus ändert. Und natürlich ändert Zoom alles.

Sobald Sie die Mitte und Brennweite des Objektivchips (in X und Y) haben, benötigen Sie nur ein einziges Schachbrett in der Aufnahme, um die Kameraposition zu bestimmen


Ich bekomme immer wieder eine sehr schlechte Kalibrierung und kann ehrlich gesagt nicht herausfinden, warum. Ich habe ein gedrucktes Schachbrett an der Wand und bewege die Kamera in verschiedene Positionen, so dass sie verschiedene Ansichten auf dem Schachbrett hat, aber wenn ich die Undistort-Funktion in opencv verwende, wirkt sie im Vergleich zum Original sehr seltsam und verzerrt. Meine Kamera ist eine Microsoft LifeCam Studio 1080p.
Cheetah

@Ben Deaktiviert den Autofokus. Bei winzigen Objektiv-Webcams ändern sich die Brennweite und der Objektivmittelpunkt mit dem Fokus. Drehen Sie sich so weit, dass es gut in die Mitte passt? Gehen Quadrate in die Ecken? Überprüfen Sie abschließend, ob auf allen Zielen alle Felder erkannt wurden.
Martin Beckett

Der Autofokus wurde bereits deaktiviert. Genug definieren? Ich versuche so extremen Winkeln wie möglich, um die Punkte aufzunehmen. Nicht sicher, was Sie mit "Quadraten, die in die Ecken gehen" meinen, wenn Sie die Funktion meinen, die die extrahierten Ecken auf dem Bild zeichnet - dann ja. Ich habe auch schon die Prüfung, ob alle Ecken erkannt wurden. Ich denke, mein Problem KANN darin liegen, auf was ich die anfängliche Brennweite in der intrinsischen Matrix eingestellt habe, die ich an die Kalibrierungsfunktion weitergebe. Ich habe versucht 1: 1, 16: 9 (was meiner Meinung nach das Webcam-Seitenverhältnis ist) und habe auch NICHTS versucht (was Sie tun können)
Gepard

@Martin Ist es möglich, eine Kalibrierung durchzuführen, indem die Kamera in der Schreibwarenposition gehalten und die Schachbrettausrichtung geändert wird, ohne den Abstand zwischen Kamera und Schachbrett zu ändern?

@ Santosh - ja das ist offensichtlich genau gleichwertig. Sie müssen sicherstellen, dass Sie viele verschiedene Blickwinkel abgedeckt haben
Martin Beckett

3

Ich habe mich dazu entschlossen, diese Antwort hier zu posten, da dies vor einiger Zeit als das beste Ergebnis in Google herauskam und mir die Vorschläge halfen. Also habe ich beschlossen, meine Erfahrungen auch zu teilen.

Nachdem ich unzählige Stunden damit verbracht hatte, die beste Stereokalibrierung für einen Kinect zu erzielen, teilte ich meine Tipps und Erkenntnisse in einem Blogbeitrag hier mit .

Obwohl es auf die Stereokalibrierung und insbesondere auf Kinect ausgerichtet ist, helfen die Tipps meiner Meinung nach jedem, der versucht, eine Kamera zu kalibrieren.

Auch für den Fall, dass ich eines Tages sterben oder vergessen sollte, mein Hosting zu verlängern, ist hier ein modifiziertes Zitat aus dem Beitrag:

  1. Stellen Sie sicher, dass Sie das größtmögliche Kalibrierungsmuster haben. Folgen Sie dem, was ich oben gesagt habe. Holen Sie sich ein schönes Muster professionell gedruckt. Stellen Sie sicher, dass jedes Quadrat mindestens 8 cm x 8 cm groß ist. Stellen Sie außerdem sicher, dass eine Seite des Kalibrierungsmusters eine ungerade Anzahl von Quadraten und die andere Seite eine gerade Anzahl von Quadraten aufweist (z. B. 9 × 6 oder 7 × 8). Es ist wichtig, um die Pose des Ziels richtig zu erkennen. Außerdem können einige Toolboxen das Muster nicht erkennen, wenn diese Anforderung nicht erfüllt ist. Wie bereits erwähnt, werden die von mir verwendeten Muster, die zum Drucken auf großen Blättern geeignet sind, hier (für 9-cm-Quadrate) und hier (für 10-cm-Quadrate) hochgeladen.
  2. Vergewissern Sie sich, dass das gedruckte Muster einen ausreichenden weißen Rand aufweist, da es ansonsten von den meisten Werkzeugkästen möglicherweise nicht leicht erkannt werden kann.
  3. Stellen Sie sicher, dass sich der Kinect nicht bewegt. Ich habe einen Mount verwendet, um meinen Kinect auf einem Stativ zu befestigen.
  4. Versuchen Sie, so viele Bilder des Kalibrierungsziels wie möglich zu erhalten. Meine beste Kalibrierung wurde mit 300 Bildern in Entfernungen von nur 0,5 Metern bis zu 10 Metern von der Kamera erzielt. Stellen Sie sicher, dass Sie das Muster um die X-, Y- und Z-Achse drehen. Versuchen Sie auch, die Ansicht mit Bildern, die im selben Abstand aufgenommen wurden, zu „kacheln“: Nehmen Sie ein Bild auf, bewegen Sie das Ziel zur nächsten Kachel im Sichtfeld, nehmen Sie eine weitere und wiederholen Sie den Vorgang, bis Sie alle aktuellen Bilder „gekachelt“ haben Sichtfeld. Ziel ist es, bei jeder Entfernung das gesamte Sichtfeld so weit wie möglich abzudecken.
  5. Verwenden Sie nach Möglichkeit die Stereo-Kalibrierungs-App von MATLAB. Damit können Sie die Ausreißer nach jeder Kalibrierungsphase beseitigen.

2

Hier ist eine Liste von 'Best Practices' für die Kamerakalibrierung, die ich ursprünglich hier gepostet habe: https://calib.io/blogs/knowledge-base/calibration-best-practices

  • Wählen Sie das richtige Kalibrierungsziel. Groß genug, um Parameter richtig einzuschränken. Vorzugsweise sollte es ca. die Hälfte der Gesamtfläche bei fronto-paralleler Betrachtung in den Kamerabildern.
  • Führen Sie die Kalibrierung im ungefähren Arbeitsabstand (WD) Ihrer endgültigen Anwendung durch. Die Kamera sollte auf diese Entfernung fokussiert sein und der Fokus sollte nach der Kalibrierung unverändert bleiben.
  • Das Ziel sollte eine hohe Anzahl von Features haben. Die Verwendung feiner Muster ist vorzuziehen. Irgendwann leidet jedoch die Robustheit der Erkennung. Wir empfehlen, bei Kameras über 3 MPx und bei kontrollierter und guter Beleuchtung feine Muster zu verwenden.
  • Sammeln Sie Bilder aus verschiedenen Bereichen und Neigungen. Bewegen Sie das Ziel, um den Bildbereich vollständig abzudecken, und streben Sie eine gleichmäßige Abdeckung an. Die Linsenverzerrung kann nur aus frontparallelen Bildern korrekt bestimmt werden, die Schätzung der Brennweite hängt jedoch von der Beobachtung der Verkürzung ab. Schließen Sie sowohl frontoparallele Bilder als auch Bilder ein, die mit einer Neigung der Platine um +/- 45 Grad in horizontaler und vertikaler Richtung aufgenommen wurden. Mehr Kippen ist normalerweise keine gute Idee, da die Genauigkeit der Feature-Lokalisierung darunter leidet.
  • Verwenden Sie eine gute Beleuchtung. Dies wird oft übersehen, ist aber enorm wichtig. Das Kalibrierungsziel sollte vorzugsweise mittels kontrollierter Fotobeleuchtung diffus beleuchtet werden. Starkpunktquellen verursachen eine ungleichmäßige Beleuchtung, die möglicherweise zu Fehlern bei der Erkennung führt, und nutzen den Dynamikbereich der Kamera nicht sehr gut aus. Schatten können dasselbe tun.
  • Haben Sie genug Beobachtungen. Normalerweise sollte die Kalibrierung an mindestens 6 Beobachtungen (Bildern) eines Kalibrierungsziels durchgeführt werden. Wenn eine Kamera höherer Ordnung oder ein Verzerrungsmodell verwendet wird, sind mehr Beobachtungen von Vorteil.
  • Erwägen Sie die Verwendung eindeutig codierter Ziele wie CharuCo-Karten. Auf diese Weise können Sie Beobachtungen von den Rändern des Kamerasensors und des Objektivs aus erfassen und somit die Verzerrungsparameter sehr gut einschränken. Außerdem können Sie damit Daten erfassen, auch wenn einzelne Feature-Points die anderen Anforderungen nicht erfüllen.
  • Die Kalibrierung ist nur so genau wie das verwendete Kalibrierungsziel. Verwenden Sie nur lasergedruckte Targets zum Validieren und Testen.
  • Richtige Montage von Kalibrierungsziel und Kamera. Um Verzerrungen und Verbiegungen bei größeren Zielen zu minimieren, montieren Sie diese entweder vertikal oder flach auf einer starren Unterlage. Ziehen Sie in diesen Fällen stattdessen in Betracht, die Kamera zu bewegen. Verwenden Sie ein hochwertiges Stativ und berühren Sie die Kamera während der Aufnahme nicht.
  • Entfernen Sie schlechte Beobachtungen. Prüfen Sie die Projektionsfehler sorgfältig. Sowohl pro Ansicht als auch pro Funktion. Wenn eines dieser Elemente als Ausreißer angezeigt wird, schließen Sie es aus und führen Sie eine Neukalibrierung durch.

Ein Online-Tool zum Generieren von PDFs für Kalibrierungsziele finden Sie hier: https://calib.io/pages/camera-calibration-pattern-generator


Hallo, willkommen bei DSP SE. Selbstfördernde Antworten sind hier in der Regel nicht erwünscht. Bitte überlegen Sie, ob Sie die Antwort von höherer Qualität erhalten möchten.
jojek
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.