// ConfigurableController methods protected override void Configuring() { base.Configuring(); stereoCameraParameters = CameraParameters.StereoCameraParameters; if (stereoCameraParameters == null) { throw new Exception("The camera parameters must contains a valid StereoCameraParameters to undistort and rectify a StereoArucoCamera."); } }
// ArucoCameraCalibration methods protected override void Calibrate(Std.VectorVectorPoint2f[] imagePoints, Std.VectorVectorPoint3f[] objectPoints) { // Calibrate first each camera var cameraParameters = CameraParametersController.CameraParameters; for (int cameraId = 0; cameraId < ArucoCamera.CameraNumber; cameraId++) { Std.VectorVec3d rvecs, tvecs; cameraParameters.ReprojectionErrors[cameraId] = Cv.CalibrateCamera(objectPoints[cameraId], imagePoints[cameraId], ArucoCamera.Images[cameraId].Size, cameraParameters.CameraMatrices[cameraId], cameraParameters.DistCoeffs[cameraId], out rvecs, out tvecs, calibrationFlags.Flags); Rvecs[cameraId] = rvecs; Tvecs[cameraId] = tvecs; } // Stereo calibration int cameraId1 = StereoArucoCamera.CameraId1; int cameraId2 = StereoArucoCamera.CameraId2; var cameraMatrix1 = cameraParameters.CameraMatrices[cameraId1]; var distCoeffs1 = cameraParameters.DistCoeffs[cameraId1]; var cameraMatrix2 = cameraParameters.CameraMatrices[cameraId2]; var distCoeffs2 = cameraParameters.DistCoeffs[cameraId2]; var imageSize = ArucoCamera.Images[cameraId1].Size; var stereoCameraParameters = new StereoArucoCameraParameters(); Cv.Vec3d rvec, tvec; Cv.Mat rotationMatrix, essentialMatrix, fundamentalMatrix; stereoCameraParameters.ReprojectionError = Cv.StereoCalibrate(objectPoints[cameraId1], imagePoints[cameraId1], imagePoints[cameraId2], cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, imageSize, out rotationMatrix, out tvec, out essentialMatrix, out fundamentalMatrix, calibrationFlags.Flags); Cv.Rodrigues(rotationMatrix, out rvec); stereoCameraParameters.RotationVector = rvec; stereoCameraParameters.TranslationVector = tvec; stereoCameraParameters.CalibrationFlagsValue = calibrationFlags.Value; cameraParameters.StereoCameraParameters = stereoCameraParameters; }