/// <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); } }