diff --git a/Plugins/LindtLeerformPlugin/ViewModels/CalibrationWindowViewModel.cs b/Plugins/LindtLeerformPlugin/ViewModels/CalibrationWindowViewModel.cs index 8a33e1d..29c1e39 100644 --- a/Plugins/LindtLeerformPlugin/ViewModels/CalibrationWindowViewModel.cs +++ b/Plugins/LindtLeerformPlugin/ViewModels/CalibrationWindowViewModel.cs @@ -130,17 +130,7 @@ public partial class CalibrationWindowViewModel : ObservableObject, IDisposable _lastFrame?.Dispose(); _lastFrame = frame; - var displayFrame = frame; - if (ApplyCalibration && _calibCameraMatrix != null && _calibDistCoeffs != null) - { - displayFrame = new Mat(); - Cv2.Undistort(frame, displayFrame, _calibCameraMatrix, _calibDistCoeffs); - } - - var bitmap = ImageConverter.MatToAvaloniaBitmap(displayFrame); - - if (displayFrame != frame) - displayFrame.Dispose(); + var bitmap = RenderFrame(frame); await Dispatcher.UIThread.InvokeAsync(() => { @@ -162,6 +152,40 @@ public partial class CalibrationWindowViewModel : ObservableObject, IDisposable } } + private Avalonia.Media.Imaging.Bitmap RenderFrame(Mat frame) + { + var displayFrame = frame; + if (ApplyCalibration && _calibCameraMatrix != null && _calibDistCoeffs != null) + { + displayFrame = new Mat(); + Cv2.Undistort(frame, displayFrame, _calibCameraMatrix, _calibDistCoeffs); + } + + var bitmap = ImageConverter.MatToAvaloniaBitmap(displayFrame); + + if (displayFrame != frame) + displayFrame.Dispose(); + + return bitmap; + } + + partial void OnApplyCalibrationChanged(bool value) + { + if (_lastFrame == null || _lastFrame.Empty()) return; + + try + { + var bitmap = RenderFrame(_lastFrame); + var old = PreviewImage; + PreviewImage = bitmap; + old?.Dispose(); + } + catch (Exception ex) + { + StatusText = $"Preview error: {ex.Message}"; + } + } + private void LoadCalibrationMats(Models.CalibrationData data) { _calibCameraMatrix?.Dispose();