2016-05-01 5 views
1

ich einen Bildpunkt in der linken Kamera bekommen (Pointl) und den entsprechenden Bildpunkt in der rechten Kamera (pointR) von meine Stereokamera mit Feature-Matching. Die beiden Kameras sind parallel und sind gleichzeitig "high". Es gibt nur eine x-Übersetzung zwischen ihnen.OpenCV Stereo-Vision-3D-Koordinaten auf 2D-Kamera-Ebene Projektion anders als 2D-Punkte auf 3D-Triangulation

Ich kenne auch die Projektionsmatrizen für jede Kamera (projL, projR), die ich während der Kalibrierung mit initUndistortRectifyMap erhalten habe.

Für den Punkt Triangulation, ich rufe: triangulatePoints(projL, projR, pointL, pointR, pos3D) (documentation), wobei pos3D die Ausgabe 3D-Position des Objekts ist.

Nun, ich will Projekt der 3D-Koordinaten in das 2D-Bild der linken Kamera:

2Dpos = projL * 3dPos

Die resultierenden x-Koordinate ist richtig . Aber das Y-Coodinate ist ungefähr 20 Pixel falsch.

Wie kann ich das beheben?

Edit: Natürlich, ich brauche homogene Koordinaten zu verwenden, um es mit der Projektionsmatrix (3x4) zu multiplizieren. Aus diesem Grund habe ich eingestellt:

3dPos[0] = x; 
3dPos[1] = y; 
3dPos[2] = z; 
3dPos[3] = 1; 

Ist es falsch, zu setzen 3dPos[3] zu 1?

Hinweis:

  1. Alle Bilder neu zugeordnet werden, das tue ich dies in einer Art Schritt Vorverarbeitung.
  2. Natürlich verwende ich immer die homogenen Koordinaten

Antwort

1

Sie sind wahrscheinlich in die entzerrten Kamera zu projizieren. Sie müssen die Umkehrung der Verzerrungskette anwenden, um den Punkt in den ursprünglichen (unverzerrten) linearen Kamerakoordinaten zu erhalten, und dann die Verzerrung anwenden, um in das Originalbild zu gelangen.

+0

Wissen Sie, wie man das in OpenCV macht? Ich habe versucht, irgendeine Lösung zu finden; habe keine gefunden. – black

+0

Zeigen Sie, was Sie versucht haben. –

+0

Ich verstehe, dass ich meine 2pos, die ich mit der Formel in der Frage bekommen habe, nicht entziffern soll, oder? Aber auf dieser Seite (http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html) habe ich keine Lösung gefunden, um einen bestimmten Punkt zu entschärfen. Es gibt nur die Lösung, eine Rektifikationskarte auf eine ganze Matte anzuwenden. – black