opencvcameratransformationcoordinate-systemsextrinsic-parameters

OpenCV calibration parameters and a 3d point transformation from stereo cameras


I've 4 ps3eye cameras. And I've calibrated camera1 and camera2 using cvStereoCalibrate() function of OpenCV library using a chessboard pattern by finding the corners and passing their 3d coordinates into this function.

Also I've calibrated camera2 and camera3 using another set of chessboard images viewed by camera2 and camera3.

Using the same method I've calibrated camera3 and camera4.

So now I've extrinsic and intrinsic parameters of camera1 and camera2, extrinsic and intrinsic parameters of camera2 and camera3, and extrinsic and intrinsic parameters of camera3 and camera4.

where extrinsic parameters are matrices of rotation and translation and intrinsic are matrices of focus length and principle point.

Now suppose there's a 3d point(world coordinate)(And I know how to find 3d coordinates from stereo cameras) that is viewed by camera3 and camera4 which is not viewed by camera1 and camera2.

The question I've is: How do you take this 3d world coordinate point that is viewed by camera3 and camera4 and transform it with respect to camera1 and camera2's world coordinate system using rotation, translation, focus and principle point parameters?


Solution

  • OpenCV's stereo calibration gives you only the relative extrinsic matrix between two cameras.

    Acording to its documentation, you don't get the transformations in world coordinates (i.e. in relation to the calibration pattern ). It suggests though to run a regular camera calibration on one of the images and at least know its transformations. cv::stereoCalibrate

    If the calibrations were perfect, you could use your daisy-chain setup to derive the world transformation of any of the cameras.

    As far as I know this is not very stable, because the fact that you have multiple cameras should be considered when running the calibration.

    Multi-camera calibration is not the most trivial of problems. Have a look at:

    I'm also looking for a solution to this, so if you find out more regarding this and OpenCV, let me know.