Ejemplo n.º 1
0
        /// <summary>
        /// Parses the camera setup from a directory containing an "images" folder with an image dataset from the Stanford Light Field Archive, and saves the parsed setup in this directory.
        /// </summary>
        public void ParseCameraSetup()
        {
            // Inform of process start.
            Debug.Log(GeneralToolkit.FormatScriptMessage(this.GetType(), "Started parsing camera setup for an image dataset from the Stanford Light Field Archive located at: " + dataHandler.colorDirectory + "."));
            // Get the files in the "images" folder.
            FileInfo[] fileInfos = GeneralToolkit.GetFilesByExtension(dataHandler.colorDirectory, ".png");
            // Determine the pixel resolution of the images.
            Texture2D tempTex = new Texture2D(1, 1);

            GeneralToolkit.LoadTexture(fileInfos[0].FullName, ref tempTex);
            Vector2Int pixelResolution = new Vector2Int(tempTex.width, tempTex.height);

            DestroyImmediate(tempTex);
            // Prepare repositioning around center if it is selected.
            Vector3 meanPos = Vector3.zero;

            // Reset the camera models to fit the color count.
            _cameraSetup.ResetCameraModels();
            _cameraSetup.cameraModels = new CameraModel[dataHandler.sourceColorCount];
            // Iteratively add each camera model to the setup.
            for (int iter = 0; iter < dataHandler.sourceColorCount; iter++)
            {
                CameraModel cameraModel = _cameraSetup.AddCameraModel(iter);
                // Store the image's pixel resolution in the camera model.
                cameraModel.pixelResolution = pixelResolution;
                // Store the image's name in the camera model.
                FileInfo fileInfo = fileInfos[iter];
                cameraModel.SetCameraReferenceIndexAndImageName(cameraModel.cameraReferenceIndex, fileInfo.Name);
                // Store the image's position in the model.
                string[] split     = fileInfo.Name.Split('_');
                float    positionY = -GeneralToolkit.ParseFloat(split[split.Length - 3]);
                float    positionX = GeneralToolkit.ParseFloat(split[split.Length - 2]);
                Vector3  pos       = scaleFactor * new Vector3(positionX, positionY, 0);
                cameraModel.transform.position = pos;
                meanPos += pos;
            }
            // If it is selected, reposition the camera setup around its center position.
            if (repositionAroundCenter)
            {
                meanPos /= dataHandler.sourceColorCount;
                for (int iter = 0; iter < dataHandler.sourceColorCount; iter++)
                {
                    CameraModel cameraModel = _cameraSetup.cameraModels[iter];
                    cameraModel.transform.position = cameraModel.transform.position - meanPos;
                }
            }
            // Temporarily move the color images to a safe location.
            string tempDirectoryPath = Path.Combine(GeneralToolkit.GetDirectoryBefore(dataHandler.dataDirectory), "temp");

            GeneralToolkit.Move(PathType.Directory, dataHandler.colorDirectory, tempDirectoryPath);
            // Save the camera setup information (this would also have cleared the "images" folder if it was still there).
            Acquisition.Acquisition.SaveAcquisitionInformation(dataHandler, cameraSetup);
            // Move the color images back into their original location.
            GeneralToolkit.Delete(dataHandler.colorDirectory);
            GeneralToolkit.Move(PathType.Directory, tempDirectoryPath, dataHandler.colorDirectory);
            // Update the camera models of the setup object.
            _cameraSetup.FindCameraModels();
            // Inform of end of process.
            Debug.Log(GeneralToolkit.FormatScriptMessage(this.GetType(), "Finished parsing camera setup. Result can be previewed in the Scene view."));
        }
        /// <summary>
        /// Reads camera information from a COLMAP "cameras.txt" file, and saves it into the referenced array.
        /// Note that the array contains a camera element for each image. Array elements should already contain the cameras' pose information.
        /// </summary>
        /// <param name="cameraSetup"></param> The camera setup containing the camera models, one for each image.
        /// <param name="workspace"></param> The workspace from which to work.
        public static void ReadCamerasInformation(CameraSetup cameraSetup, string workspace)
        {
            // Only continue if there is information to work with.
            if (cameraSetup.cameraModels == null)
            {
                return;
            }
            // Parse the set of COLMAP cameras from the file.
            List <CameraModel> cameraModelList = new List <CameraModel>();

            string[] lines = File.ReadAllLines(GetCamerasFile(workspace));
            foreach (string line in lines)
            {
                if (!line.StartsWith("#"))
                {
                    CameraModel cameraModel = TryParseCameraModel(line);
                    if (cameraModel == null)
                    {
                        Debug.LogWarning("One or more of the camera models could not be parsed. Camera setup cannot be computed.");
                        cameraSetup.ResetCameraModels();
                        return;
                    }
                    else
                    {
                        cameraModelList.Add(cameraModel);
                    }
                }
            }
            CameraModel[] camerasInFile = cameraModelList.ToArray();
            // Update the camera models from this information.
            CameraModel[] cameraModels = cameraSetup.cameraModels;
            for (int i = 0; i < cameraModels.Length; i++)
            {
                CameraModel cameraModel = cameraModels[i];
                // The camera models should already know the COLMAP camera they are related to.
                int desiredCameraIndex = cameraModel.cameraReferenceIndex;
                // Find the corresponding COLMAP camera, and provide the camera model with its parameters.
                foreach (CameraModel cameraInFile in camerasInFile)
                {
                    if (cameraInFile.cameraReferenceIndex == desiredCameraIndex)
                    {
                        cameraModel.isOmnidirectional = cameraInFile.isOmnidirectional;
                        cameraModel.pixelResolution   = cameraInFile.pixelResolution;
                        cameraModel.fieldOfView       = cameraInFile.fieldOfView;
                    }
                }
            }
            // Destroy the temporary camera models.
            for (int iter = 0; iter < camerasInFile.Length; iter++)
            {
                CameraModel.DestroyImmediate(camerasInFile[iter].gameObject);
            }
        }