2017-01-17 3 views
1

Ich habe wirklich eine schwere Zeit, um dieses Ding zu erfassen, ich bin nur ein Anfänger in Python, und ich kann keine Erklärung für diesen Code finden.Python OpenCV Stereo Kalibrieren Objekt Punkte

# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0) 
objp = np.zeros((6*9,3), np.float32) 
objp[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2) 

das Original ist, dass, 9 ist 7. I angenommen, dass 9 und 6 sind die inneren Ecken der Spalten und Zeilen des Schachbrettmuster jeweils. (so ist mein Schachbrett wirklich 10x7)

Jetzt weiß ich die Größe des Quadrats auf dem Schachbrett, was ich nicht herausfinden kann, ist, wo man es dort setzt.

Wie jeder Iteration für jedes Bild, fand der Code ich nur dies:

objpoints.append(objp) 

Und ich kann sehen, es sich immer das gleiche Objekt immer wieder schieben.

Zwei Fragen: Wie macht objpoints.append(objp) bei jeder Iteration einen Unterschied?

Wie kann ich im Code die Quadratgröße angeben? Wo soll ich es hinstellen?

Ich weiß, dass Objektpunkte sind die 3D-Punkte der einzelnen Quadrate im Schachbrett, deshalb bin ich sehr verwirrt es ist nicht einmal in jeder Iteration manipuliert.

Danke!

EDIT: Mein Code für stereocalib: http://pastebin.com/pw5n3pme

(Es ist nur eine modifizierte Version der einzelnen Kamerakalibrierung)

+0

Sie sollten den gesamten Code verknüpfen, wenn Sie eine vollständige Antwort benötigen und verstehen, was es tut. Ich werde versuchen, trotzdem zu antworten. – marcoresk

Antwort

1

Ich gehe davon aus werden Sie mit this code oder ein ähnliches arbeiten.

Erste Frage

wie objpoints.append hat (objp) bei jeder Iteration einen Unterschied machen? Es tut es nicht. Von der Linie geschrieben Sie, schauen Sie sich diese

objp[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2) 

Hier wird die Anordnung der Schachbrett Ecken Berechnung, die in einem bestimmten Schachbrett, sind immer gleich. Bei jeder Iteration finden Sie in Ihrer Kamera verschiedene Bildpunkte für die gleichen Punkte im Schachbrett.

Wenn das waren nicht die gleichen Punkte, können Sie die Kalibrierung nicht durchführen

Zweite Frage

wie kann ich im Code angeben, die quadratische Größe? Wo soll ich es hinstellen?

in dem Tutorial, das ich gepostet habe, sollten Sie für Python und OpenCV die Quadratgröße nicht angeben. Es ist Mono-Kalibrierung, so quadratische Größe ist nur auf Skalierungsfaktor bezogen, (ziemlich) nutzlos in Mono-Kamera. Sie erhalten eine korrekte Kameramatrix mit einem undefinierten Skalenfaktor (oder vielleicht gleich 1).

Wenn Sie einen anderen Code (z Stereo-Kalibrierung) haben, ist es posten und ich werde versuchen, zu finden, wo der Platz Dimension gesetzt werden muss.

+0

danke für die Antwort @marcoresk hier ist die Pastebin meiner stereocalib.py http://pastebin.com/pw5n3pme dort habe ich die individuell kalibrierten Matrizen für linke und rechte Kameras. Es funktionierte für mich, anstatt die beiden Kameras gleichzeitig zu kalibrieren. – Wreigh

+0

in der stereocalib, ich kopierte nur den Code, den Sie verknüpft, und tat es für die beiden Kameras auf einmal und nur StereoCalibrate Methode anstelle der Kameraalibrate – Wreigh

+0

@WreighChristianSantos, dass Code nur ein Tutorial war. Um die Größe der Quadrate einzugeben, müssen Sie sie mit objp verwenden. Lesen Sie [diese andere Antwort] (http://stackoverflow.com/questions/37310210/camera-calibration-with-opencv-how-to-adjust-chessboard-square-size) – marcoresk

1

Ich tue auch Stereo-Kamerakalibrierung in Python und OpenCV und ich kenne die Antwort auf Ihre zweite Frage (als erstes bereits beantwortet).

Wie kann ich im Code die Quadratgröße angeben? Wo soll ich es hinstellen?

Wenn Sie hier eine quadratische Größe von 30 mm annehmen, multiplizieren Sie diesen Wert mit objp[:,:2]. Wie diese

objp[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2)*30 # 30 mm size of square 

Als objp[:,:2] ist ein Satz von Punkten von Schachbrett Ecken gegeben als (0,0), (0,1), (0,2) .... (8,5). (0,0) Punkt ist die linke obere Ecke und (8,5) ist die niedrigste Ecke. In diesem Fall haben diese Punkte keine Einheit, aber wenn wir diese Werte mit der Quadratgröße multiplizieren (zum Beispiel 30 mm), dann werden diese (0,0), (0,30), ... (240,150) was sind die realen Welteinheiten. Ihr Übersetzungsvektor wird in diesem Fall in mm Einheiten sein.

Verwandte Themen