erstellen opencv Kameramatrix für iPhone 5 solvepnp

8

Ich entwickle eine Anwendung für das iPhone mit opencv. Ich muss die Methode solvePnPRansac verwenden:

Ссылка

Für diese Methode muss ich eine Kameramatrix bereitstellen:
 __ __
| fx 0 cx

| 0 fy cy | _0 0 1 _ |

wobei cx und cy die mittleren Pixelpositionen des Bildes darstellen und fx und fy Brennweiten darstellen, aber das ist die gesamte Dokumentation. Ich bin mir nicht sicher, was ich für diese Brennweiten bereitstellen soll. Das iPhone 5 hat eine Brennweite von 4,1 mm, aber ich denke nicht, dass dieser Wert so verwendet werden kann.

Ich habe eine andere Website überprüft:

Ссылка

zeigt, wie opencv Kameramatrizen erstellt. Hier wird angegeben, dass Brennweiten in Pixeleinheiten gemessen werden.

Ich habe eine andere Website überprüft:

Ссылка

(ungefähr auf halbem Weg) es besagt, dass die Brennweite unter Verwendung der folgenden Gleichung von Millimetereinheiten in Pixel umgerechnet werden kann: fx = fy = focalMM * pixelDensity / 25.4;

Ein weiterer Link, den ich gefunden habe, besagt, dass fx = focalMM * width / (sensorSizeMM); fy = focalMM * Länge / (sensorSizeMM);

Ich bin unsicher über diese Gleichungen und wie man diese Matrix richtig erstellt.

Jede Hilfe, Beratung oder Links zum Erstellen einer genauen Kameramatrix (speziell für das iPhone 5) wäre sehr willkommen,

Isaac

ps. Ich denke, dass (fx / fy) oder (fy / fx) gleich dem Seitenverhältnis der Kamera sein könnte, aber das könnte völlig falsch sein.

UPDATE:

Pixelkoordinaten zur 3D-Linie (opencv)

Mit diesem Link kann ich herausfinden, wie sie wollen, dass fx und fy formatiert werden, weil sie Winkel relativ zu ihrer Entfernung von der Mitte skalieren. daher sind fx und fy wahrscheinlich in Pixeln / (Einheitslänge), aber ich bin immer noch nicht sicher, was diese Einheitslänge sein muss, kann es beliebig sein, solange x und y zueinander skaliert sind?

    
Isaac 04.02.2013, 05:35
quelle

5 Antworten

10

Sie können eine anfängliche (grobe) Schätzung der Brennweite in Pixeln erhalten, indem Sie die Brennweite in mm durch die Breite eines Pixels des Kamerasensors (CCD, CMOS, was auch immer) dividieren.

Sie erhalten das erste aus dem Kameramanual oder lesen es aus dem EXIF-Header eines Bildes, das mit voller Auflösung aufgenommen wurde. Letzteres herauszufinden, ist ein wenig komplizierter: Sie können auf das Interweb-Datenblatt des Sensors schauen, wenn Sie seinen Hersteller und seine Modellnummer kennen, oder Sie teilen nur die Gesamtbreite seines sensiblen Bereichs durch die Anzahl der Pixel auf dem Seite.

Wenn keine anderen Informationen vorliegen, ist es normalerweise sicher anzunehmen, dass die Pixel quadratisch sind (dh fx == fy) und dass der Sensor orthogonal zur Brennpunktachse des Objektivs ist (dh dass der Ausdruck in der ersten Zeile und zweiten Spalte des Kameramatrix ist Null). Außerdem sind die Pixelkoordinaten des Hauptpunkts (cx, cy) normalerweise ohne ein sorgfältig entworfenes Kalibrierungsgerät und ein sorgfältig durchgeführtes Kalibrierungsverfahren schwer zu schätzen (weil sie intrinsisch mit der Kameratranslation parallel zum Bild verwechselt werden) Ebene). Es ist also am besten, sie gleich dem geometrischen geometrischen Mittelpunkt des Bildes zu setzen, es sei denn, Sie wissen, dass das Bild asymmetrisch abgeschnitten wurde.

Daher hat Ihr einfaches Kameramodell nur einen unbekannten Parameter, die Brennweite f = fx = fy.

Tipp: In Ihrer Anwendung ist es normalerweise bequemer, den horizontalen (oder vertikalen) Sichtfeldwinkel als die Brennweite in Pixeln mitzuführen. Dies liegt daran, dass das FOV für die Bildskalierung invariant ist.

    
Francesco Callari 05.02.2013, 13:29
quelle
6

Die "Brennweite", mit der Sie es hier zu tun haben, ist einfach ein Skalierungsfaktor von Objekten in der Welt zu Kamerapixeln, die in dem Lochkamera-Modell verwendet werden ( Wikipedia-Link) . Deshalb sind seine Einheiten Pixel / Einheitslänge. Für ein gegebenes f wäre ein Objekt der Größe L in einem Abstand (senkrecht zur Kamera) z f * L / z Pixel.

Sie können also die Brennweite schätzen, indem Sie ein Objekt bekannter Größe in bekannter Entfernung von Ihrer Kamera platzieren und dessen Größe im Bild messen. Sie könnten auch annehmen, dass der Mittelpunkt der Mittelpunkt des Bildes ist. Sie sollten die Linsenverzerrung auf jeden Fall nicht ignorieren ( dist_coef -Parameter in solvePnPRansac ).

In der Praxis besteht der beste Weg, um die Kameramatrix und die Verzerrungskoeffizienten zu erhalten, in der Verwendung eines Kamera-Kalibrierungstools. Sie können die MRPT-Software camera_calib von diesem Link herunterladen und verwenden, außerdem gibt es ein Video-Tutorial hier . Wenn Sie Matlab verwenden, gehen Sie zur Kamera-Kalibrierungs-Toolbox .

    
Milo 08.02.2013 10:05
quelle
4

Hier haben Sie einen Tisch mit den Spezifikationen der Kameras für iPhone 4 und 5. Die Berechnung ist:

%Vor%     
user2743760 05.08.2014 23:18
quelle
1

Versuchen Sie Folgendes:

%Vor%     
Gigi 20.11.2015 10:49
quelle
1

Alter Thread, vorhandenes Problem.

Wie Milo und Isaac nach Milos Antwort erwähnt haben, scheint es keine "gemeinsamen" Parameter für das iPhone 5 zu geben.

Was es wert ist, hier ist das Ergebnis eines Laufs mit dem MRPT-Kalibrierungswerkzeug, mit einem guten alten iPhone 5:

%Vor%

Beachten Sie, dass dist hier eine Verzerrung bedeutet.

Ich führe Experimente an einem Spielzeugprojekt durch, mit diesen Parametern - irgendwie ok. Wenn Sie sie für Ihr eigenes Projekt verwenden, denken Sie bitte daran, dass sie möglicherweise nicht gut genug sind, um loszulegen. Das Beste wird sein, Milos Empfehlung mit eigenen Daten zu befolgen. Das MRPT-Tool ist sehr einfach zu bedienen, mit dem Schachbrett, das sie zur Verfügung stellen. Hoffe, das hilft beim Einstieg!

    
Eric Platon 30.06.2017 02:02
quelle