Esempio n. 1
0
        private CalculatedCameraExtrinsics CreateExtrinsicsFromArray(float[] extrinsicsArray, int offset = 0)
        {
            bool succeeded = (extrinsicsArray[offset + 0] > 0.01f);

            Vector3 rightHandedPosition = new Vector3(extrinsicsArray[offset + 1], extrinsicsArray[offset + 2], extrinsicsArray[offset + 3]);

            Vector3    rodriguesVector     = new Vector3(extrinsicsArray[offset + 4], extrinsicsArray[offset + 5], extrinsicsArray[offset + 6]);
            var        angle               = Mathf.Rad2Deg * rodriguesVector.magnitude;
            var        axis                = rodriguesVector.normalized;
            Quaternion rightHandedRotation = Quaternion.AngleAxis(angle, axis);

            var rightHandedMatrix = Matrix4x4.TRS(rightHandedPosition, rightHandedRotation, Vector3.one);
            var leftHandedMatrix  = rightHandedMatrix;

            leftHandedMatrix.m02 *= -1.0f;
            leftHandedMatrix.m12 *= -1.0f;
            leftHandedMatrix.m22 *= -1.0f;
            leftHandedMatrix.m32 *= -1.0f;

            var inverse         = leftHandedMatrix.inverse;
            var inversePosition = inverse.GetColumn(3);
            var inverseRotation = Quaternion.LookRotation(inverse.GetColumn(2), inverse.GetColumn(1)) * Quaternion.Euler(0, 0, 180);

            var calcExtrinsics = new CalculatedCameraExtrinsics();

            calcExtrinsics.ViewFromWorld = Matrix4x4.TRS(inversePosition, inverseRotation, Vector3.one);
            calcExtrinsics.Succeeded     = succeeded;
            return(calcExtrinsics);
        }
Esempio n. 2
0
        public static CalculatedCameraExtrinsics LoadCameraExtrinsics(string path)
        {
            if (File.Exists(path))
            {
                var fileData = File.ReadAllBytes(path);
                if (CalculatedCameraExtrinsics.TryDeserialize(fileData, out var extrinsics))
                {
                    return(extrinsics);
                }
            }

            Debug.LogError($"Failed to load camera extrinsics file {path}");
            return(null);
        }
Esempio n. 3
0
        public static string SaveCameraExtrinsics(CalculatedCameraExtrinsics extrinsics)
        {
            string path = Path.Combine(GetDocumentsFolderPath(), RootDirectoryName, $"CameraExtrinsics.json");
            int    i    = 0;

            while (File.Exists(path))
            {
                path = Path.Combine(GetDocumentsFolderPath(), RootDirectoryName, $"CameraExtrinsics_{i}.json");
                i++;
            }

            var payload = extrinsics.Serialize();

            File.WriteAllBytes(path, payload);
            return(path);
        }
        public static bool TryDeserialize(byte[] payload, out CalculatedCameraExtrinsics extrinsics)
        {
            extrinsics = null;

            try
            {
                var str = Encoding.UTF8.GetString(payload);
                extrinsics = JsonUtility.FromJson <CalculatedCameraExtrinsics>(str);
                return(true);
            }
            catch (Exception e)
            {
                Debug.LogWarning($"Exception thrown deserializing camera extrinsics: {e.ToString()}");
                return(false);
            }
        }
        public CalibrationData(string cameraIntrinsicsPath, string cameraExtrinsicsPath)
        {
            if (File.Exists(cameraIntrinsicsPath) &&
                File.Exists(cameraExtrinsicsPath))
            {
                cameraIntrinsics = CalibrationDataHelper.LoadCameraIntrinsics(cameraIntrinsicsPath);
                cameraExtrinsics = CalibrationDataHelper.LoadCameraExtrinsics(cameraExtrinsicsPath);

                if (cameraIntrinsics == null ||
                    cameraExtrinsics == null)
                {
                    Debug.LogError($"Failed to load cameara intrinsics/extrinscs: {cameraIntrinsicsPath}, {cameraExtrinsicsPath}");
                }
            }
            else
            {
                Debug.LogError($"Invalid paths provided for camera intrinsics/extrinsics: {cameraIntrinsicsPath}, {cameraExtrinsicsPath}");
            }
        }
        /// <summary>
        /// Call to calculate camera extrinsics based on all obtained and usable datasets.
        /// </summary>
        public void CalculateExtrinsics()
        {
            if (processedDatasetCount > 0)
            {
                Debug.Log("Starting Individual Camera Extrinsics calculations.");
                cameraExtrinsics = CalibrationAPI.Instance.CalculateIndividualArUcoExtrinsics(dslrIntrinsics, parentVisuals.Count);
                if (cameraExtrinsics != null)
                {
                    CreateExtrinsicsVisual(cameraExtrinsics);
                }
                Debug.Log("Completed Individual Camera Extrinsics calculations.");

                Debug.Log("Starting the Global Camera Extrinsics calculation.");
                globalExtrinsics = CalibrationAPI.Instance.CalculateGlobalArUcoExtrinsics(dslrIntrinsics);
                if (globalExtrinsics != null)
                {
                    globalExtrinsicsFileName = CalibrationDataHelper.SaveCameraExtrinsics(globalExtrinsics);
                    Debug.Log($"Saved global extrinsics: {globalExtrinsicsFileName}");
                    Debug.Log($"Found global extrinsics: {globalExtrinsics}");
                    var        position = globalExtrinsics.ViewFromWorld.GetColumn(3);
                    var        rotation = Quaternion.LookRotation(globalExtrinsics.ViewFromWorld.GetColumn(2), globalExtrinsics.ViewFromWorld.GetColumn(1));
                    GameObject camera   = null;
                    cameraVisualHelper.CreateOrUpdateVisual(ref camera, position, rotation);
                    camera.name = "Global Extrinsics";
                    GameObject hololens = null;
                    cameraVisualHelper.CreateOrUpdateVisual(ref hololens, Vector3.zero, Quaternion.identity);
                    hololens.name = "Global HoloLens";

                    lastCalibration     = new CalculatedCameraCalibration(dslrIntrinsics, globalExtrinsics);
                    calibrationFileName = CalibrationDataHelper.SaveCameraCalibration(lastCalibration);
                }
            }
            else
            {
                Debug.LogWarning("No usable marker datasets have been processed, unable to calculate camera extrinsics.");
            }
        }
 public CalibrationData(CalculatedCameraIntrinsics intrinsics, CalculatedCameraExtrinsics extrinsics)
 {
     cameraIntrinsics = intrinsics;
     cameraExtrinsics = extrinsics;
 }
 public CalculatedCameraCalibration(CalculatedCameraIntrinsics intrinsics, CalculatedCameraExtrinsics extrinsics)
 {
     this.intrinsics = intrinsics;
     this.extrinsics = extrinsics;
 }
        private void Update()
        {
            if (feedImage != null &&
                feedImage.texture == null)
            {
                feedImage.texture = CompositorWrapper.Instance.GetVideoCameraFeed();
            }

            if (Input.GetKeyDown(KeyCode.Space))
            {
                if (networkingService != null &&
                    matchMakingService != null)
                {
                    var request = new HeadsetCalibrationDataRequest();
                    request.timestamp = Time.time;
                    var payload = request.Serialize();

                    if (networkingService.SendData(payload, NetworkPriority.Critical))
                    {
                        Debug.Log($"Sent headset calibration data request to HoloLens at {request.timestamp}");
                    }
                    else
                    {
                        Debug.LogWarning("Failed to send headset calibration data request to HoloLens");
                    }
                }

                if (headsetCalibration != null)
                {
                    Debug.Log("Requesting headset calibration data from VR Headset");
                    headsetCalibration.UpdateHeadsetCalibrationData();
                }
            }

            if (headsetData != null)
            {
                if (headsetData.markers.Count != expectedNumberOfMarkers)
                {
                    Debug.Log("Headset has not yet detected all of the markers on the calibration board, dropping payload from headset.");
                }
                else
                {
                    var dslrTexture = CompositorWrapper.Instance.GetVideoCameraTexture();
                    var fileName    = CalibrationDataHelper.GetUniqueFileName();
                    CalibrationDataHelper.SaveDSLRArUcoImage(dslrTexture, fileName);
                    CalibrationDataHelper.SaveHeadsetData(headsetData, fileName);

                    if (ProcessArUcoData(headsetData, dslrTexture))
                    {
                        CalibrationDataHelper.SaveDSLRArUcoDetectedImage(dslrTexture, fileName);
                        CreateVisual(headsetData, fileName);
                    }
                }

                headsetData = null;
            }

            if (Input.GetKeyDown(KeyCode.Return))
            {
                Debug.Log("Starting Individual Camera Extrinsics calculations.");
                cameraExtrinsics = CalibrationAPI.Instance.CalculateIndividualArUcoExtrinsics(dslrIntrinsics, parentVisuals.Count);
                if (cameraExtrinsics != null)
                {
                    foreach (var extrinsic in cameraExtrinsics)
                    {
                        Debug.Log($"Calculated extrinsics: {extrinsic}");
                    }
                    CreateExtrinsicsVisual(cameraExtrinsics);
                }

                Debug.Log("Starting the Global Camera Extrinsics calculation.");
                globalExtrinsics = CalibrationAPI.Instance.CalculateGlobalArUcoExtrinsics(dslrIntrinsics);
                if (globalExtrinsics != null)
                {
                    var fileName = CalibrationDataHelper.SaveCameraExtrinsics(globalExtrinsics);
                    Debug.Log($"Saved global extrinsics: {fileName}");
                    Debug.Log($"Found global extrinsics: {globalExtrinsics}");
                    var        position = globalExtrinsics.ViewFromWorld.GetColumn(3);
                    var        rotation = Quaternion.LookRotation(globalExtrinsics.ViewFromWorld.GetColumn(2), globalExtrinsics.ViewFromWorld.GetColumn(1));
                    GameObject camera   = null;
                    cameraVisualHelper.CreateOrUpdateVisual(ref camera, position, rotation);
                    camera.name = "Global Extrinsics";
                    GameObject hololens = null;
                    cameraVisualHelper.CreateOrUpdateVisual(ref hololens, Vector3.zero, Quaternion.identity);
                    hololens.name = "Global HoloLens";
                }
            }
        }