void UpdateCalibration(bool foundBoard) { if (foundBoard) { _successFrameCount++; float averageMovement = ComputeAverageMovement(); if (averageMovement < lowMovementThreshold) { _stableFrameCount++; } else { _stableFrameCount = 0; } } else { _successFrameCount = 0; _stableFrameCount = 0; } // When consistently stable, gather sample. if (_stableFrameCount == stableFrameCountThreshold) { _intrinsicsCalibrator.AddSample(_chessCornersRealModelMat, _chessCornersImageMat); _intrinsicsCalibrator.UpdateIntrinsics(); _previewFlasher.Start(); _rmsErrorText.text = _intrinsicsCalibrator.rmsError.ToString("F3"); _stableFrameCount = 0; // When enough samples are gathered, save to file and switch to testing mode. if (_intrinsicsCalibrator.sampleCount == _desiredSampleCount) { string intrinsicsFileName = _intrinsicsFileName; if (_addErrorValueToFileName) { intrinsicsFileName += "_E-" + _intrinsicsCalibrator.rmsError.ToString("F02").Replace(".", ","); } string filePath = _intrinsicsCalibrator.intrinsics.SaveToFile(intrinsicsFileName); SwitchState(State.Testing); Debug.Log(logPrepend + "Saved intrinsics to file.\n" + filePath); } } }
void Sample() { _projectorIntrinsicsCalibrator.AddSample(_circlePointsRealModelMat, _circlePointsProjectorRenderImageMat); _projectorExtrinsicsCalibrator.AddSample(_circlePointsDetectedWorldMat, _circlePointsCameraImageMat, _circlePointsProjectorRenderImageMat); _stableFrameCount = 0; // Update projector intrinsics and extrinnsics. if (sampleCount >= blindSampleCountTarget) { UpdateProjectorIntrinsicsAndExtrinsics(); } // State switching. if (_state == State.BlindCalibration && sampleCount == blindSampleCountTarget) { SwitchState(State.TrackedCalibration); } // Update UI. _previewFlasher.Start(); UpdateSampleCounterUI(); _sampleManuallyRequested = false; }