Esempio n. 1
0
        /// <summary>
        /// Get the intrinsic calibration parameters for a given camera, this also aligns the camera intrinsics based
        /// on device orientation.
        ///
        /// For example, if the device orientation is portrait and camera intrinsics is in
        /// landscape. This function will inverse the intrinsic x and y, and report intrinsics in portrait mode.
        ///
        /// The intrinsics are as specified by the TangoCameraIntrinsics struct and are accessed via the API.
        /// </summary>
        /// <param name="cameraId">The camera ID to retrieve the calibration intrinsics for.</param>
        /// <param name="alignedIntrinsics">
        /// A TangoCameraIntrinsics filled with calibration intrinsics for the camera, this intrinsics is also
        /// aligned with device orientation.
        /// </param>
        public static void GetDeviceOrientationAlignedIntrinsics(TangoEnums.TangoCameraId cameraId,
                                                                 TangoCameraIntrinsics alignedIntrinsics)
        {
            TangoCameraIntrinsics intrinsics = new TangoCameraIntrinsics();

            GetIntrinsics(TangoEnums.TangoCameraId.TANGO_CAMERA_COLOR, intrinsics);

            float intrinsicsRatio = (float)intrinsics.width / (float)intrinsics.height;

            Tango.OrientationManager.Rotation rotation = TangoSupport.RotateFromAToB(
                AndroidHelper.GetDisplayRotation(),
                AndroidHelper.GetColorCameraRotation());

            switch (rotation)
            {
            case Tango.OrientationManager.Rotation.ROTATION_90:
                alignedIntrinsics.cx     = intrinsics.cy;
                alignedIntrinsics.cy     = intrinsics.width - intrinsics.cx;
                alignedIntrinsics.fx     = intrinsics.fy;
                alignedIntrinsics.fy     = intrinsics.fx;
                alignedIntrinsics.width  = intrinsics.height;
                alignedIntrinsics.height = intrinsics.width;
                break;

            case Tango.OrientationManager.Rotation.ROTATION_180:
                alignedIntrinsics.cx     = intrinsics.width - intrinsics.cx;
                alignedIntrinsics.cy     = intrinsics.height - intrinsics.cy;
                alignedIntrinsics.fx     = intrinsics.fx;
                alignedIntrinsics.fy     = intrinsics.fy;
                alignedIntrinsics.width  = intrinsics.width;
                alignedIntrinsics.height = intrinsics.height;
                break;

            case Tango.OrientationManager.Rotation.ROTATION_270:
                alignedIntrinsics.cx     = intrinsics.height - intrinsics.cy;
                alignedIntrinsics.cy     = intrinsics.cx;
                alignedIntrinsics.fx     = intrinsics.fy;
                alignedIntrinsics.fy     = intrinsics.fx;
                alignedIntrinsics.width  = intrinsics.height;
                alignedIntrinsics.height = intrinsics.width;
                break;

            default:
                alignedIntrinsics.cx     = intrinsics.cx;
                alignedIntrinsics.cy     = intrinsics.cy;
                alignedIntrinsics.fx     = intrinsics.fx;
                alignedIntrinsics.fy     = intrinsics.fy;
                alignedIntrinsics.width  = intrinsics.width;
                alignedIntrinsics.height = intrinsics.height;
                break;
            }

            alignedIntrinsics.distortion0      = intrinsics.distortion0;
            alignedIntrinsics.distortion1      = intrinsics.distortion1;
            alignedIntrinsics.distortion2      = intrinsics.distortion2;
            alignedIntrinsics.distortion3      = intrinsics.distortion3;
            alignedIntrinsics.distortion4      = intrinsics.distortion4;
            alignedIntrinsics.camera_id        = intrinsics.camera_id;
            alignedIntrinsics.calibration_type = intrinsics.calibration_type;
        }
Esempio n. 2
0
        /// <summary>
        /// Compute a rotation from rotation a to rotation b, in form of the OrientationManager.Rotation enum.
        /// </summary>
        /// <param name="b">Target rotation frame.</param>
        /// <param name="a">Start rotation frame.</param>
        /// <returns>The orientation index that follows Android screen rotation standard.</returns>
        public static Tango.OrientationManager.Rotation RotateFromAToB(Tango.OrientationManager.Rotation b,
                                                                       Tango.OrientationManager.Rotation a)
        {
            int ret = (int)b - (int)a;

            if (ret < 0)
            {
                ret += 4;
            }

            return((Tango.OrientationManager.Rotation)(ret % 4));
        }
Esempio n. 3
0
        /// <summary>
        /// Update current additional rotation matrix based on the display orientation and color camera orientation.
        ///
        /// Not that m_colorCameraPoseRotation will need to compensate the rotation with physical color camera.
        /// </summary>
        /// <param name="displayRotation">Orientation of current activity. Index enum is same same as Android screen
        /// orientation standard.</param>
        /// <param name="colorCameraRotation">Orientation of current color camera sensor. Index enum is same as Android
        /// camera orientation standard.</param>
        public static void UpdatePoseMatrixFromDeviceRotation(OrientationManager.Rotation displayRotation,
                                                              OrientationManager.Rotation colorCameraRotation)
        {
            Tango.OrientationManager.Rotation r = RotateFromAToB(displayRotation, colorCameraRotation);

            switch (r)
            {
            case Tango.OrientationManager.Rotation.ROTATION_90:
                m_colorCameraPoseRotation = ROTATION90_T_DEFAULT;
                break;

            case Tango.OrientationManager.Rotation.ROTATION_180:
                m_colorCameraPoseRotation = ROTATION180_T_DEFAULT;
                break;

            case Tango.OrientationManager.Rotation.ROTATION_270:
                m_colorCameraPoseRotation = ROTATION270_T_DEFAULT;
                break;

            default:
                m_colorCameraPoseRotation = Matrix4x4.identity;
                break;
            }

            switch (displayRotation)
            {
            case Tango.OrientationManager.Rotation.ROTATION_90:
                m_devicePoseRotation = ROTATION90_T_DEFAULT;
                break;

            case Tango.OrientationManager.Rotation.ROTATION_180:
                m_devicePoseRotation = ROTATION180_T_DEFAULT;
                break;

            case Tango.OrientationManager.Rotation.ROTATION_270:
                m_devicePoseRotation = ROTATION270_T_DEFAULT;
                break;

            default:
                m_devicePoseRotation = Matrix4x4.identity;
                break;
            }
        }