public ScanWorkPacket(Vector3 centerOfVoxelBlob, ScanningCamera c) { image = new BitArray(c.mostRecentImage); width = c.imageWidth; height = c.imageHeight; position = c.worldPosition + centerOfVoxelBlob; cameraIntrinsics = c.intrinsics.ToArray(); worldToCameraRotation = c.worldToCameraRotation.ToArray(); worldToCameraTranslation = c.worldToCameraTranslation.ToArray(); }
void SaveIntrinsics(string cameraPosition, ScanningCamera aCam) { for (int i = 0; i < 3; i++) { PlayerPrefs.SetFloat(cameraPosition + kTranslation + i, aCam.worldToCameraTranslation[i, 0]); for (int j = 0; j < 3; j++) { PlayerPrefs.SetFloat(cameraPosition + kRotation + i + j, aCam.worldToCameraRotation[i, j]); PlayerPrefs.SetFloat(cameraPosition + kIntrinsics + i + j, aCam.intrinsics[i, j]); } } }
void LoadIntrinsics(string cameraPosition, ScanningCamera aCam) { aCam.worldToCameraTranslation = new Matrix(3, 1); aCam.worldToCameraRotation = new Matrix(3, 3); aCam.intrinsics = new Matrix(3, 3); for (int i = 0; i < 3; i++) { aCam.worldToCameraTranslation[i, 0] = PlayerPrefs.GetFloat( cameraPosition + kTranslation + i); for (int j = 0; j < 3; j++) { aCam.worldToCameraRotation[i, j] = PlayerPrefs.GetFloat( cameraPosition + kRotation + i + j); aCam.intrinsics[i, j] = PlayerPrefs.GetFloat( cameraPosition + kIntrinsics + i + j); } } }
/// <summary> /// Moves the printer to multiple locations so that the chosen camera can find the calibration points /// and eventually calibrate itself /// </summary> /// <returns>The calibration points and calibrate.</returns> /// <param name="aCamera">A camera.</param> /// <param name="verticalPosition">Vertical position.</param> IEnumerator FindCalibrationPointsAndCalibrate(ScanningCamera aCamera, float verticalPosition) { yield return(Scheduler.StartCoroutine(aCamera.StartCapturing())); scanningView.renderer.material.mainTexture = aCamera.webcamImage; yield return(Scheduler.StartCoroutine(aCamera.TakePicture())); while (!aCamera.AddPointsFromChessboardPicture(verticalPosition)) { Text.Warning("Attempting to find chessboard in another picture..."); yield return(Scheduler.StartCoroutine(aCamera.TakePicture())); } int picturesToTake = Mathf.FloorToInt(ScanningCamera.kNumberOfPicturesPerCameraMm / ScanningCamera.kCalibrationVertMoveMm) - 1; for (int i = 0; i < picturesToTake; ++i) { // Move to next position pc.BeginMotorChanges(m_workingPrinter); pc.MoveVerticallyBy(-ScanningCamera.kCalibrationVertMoveMm, Change.Execute); pc.EndMotorChanges(); verticalPosition += ScanningCamera.kCalibrationVertMoveMm; yield return(Scheduler.StartCoroutine(pc.WaitUntilDoneMoving())); yield return(new WaitSeconds(1f)); yield return(Scheduler.StartCoroutine(aCamera.TakePicture())); while (!aCamera.AddPointsFromChessboardPicture(verticalPosition)) { yield return(Scheduler.StartCoroutine(aCamera.TakePicture())); } yield return(null); } aCamera.Stop(); yield return(Scheduler.StartCoroutine(aCamera.CalibratePosition())); }