/* * Copyright (c) 2025 LG Electronics Inc. * SPDX-License-Identifier: LicenseRef-LGE-Proprietary */ using Aurora.Api; using CogCommon; using Cognex.VisionPro; using CogPattern; using System; using System.ComponentModel; using System.Runtime.CompilerServices; using System.Windows; using System.Windows.Controls; using VisionCommon; using System.Collections.Generic; using System.Diagnostics; using VisionCommonUI; namespace CogUI { /// /// Interaction logic for PreProcessingSettingView.xaml /// public partial class PreProcessingSettingView : UserControl, IDisposable, INotifyPropertyChanged { public Window ParentWindow { get; set; } public event PropertyChangedEventHandler PropertyChanged; public PreProcessingParam _preProcParam; public PreProcessingParam PreProcParam { get => _preProcParam; set { _preProcParam = value; OnPropertyChanged(); } } public IEnumerable FilteringTypes { get; set; } public IEnumerable MorphologyTypes { get; set; } private int REPEATLIMIT = 5; private Logger _logger = new Logger("PreProcessingSettingView"); private PatternInfo _patternInfo; private ICogCameraDisplay _cogCameraDisplay; private ICogImage _srcImage = null; private ICogImage _preProcImage = null; public PreProcessingSettingView(PatternInfo patternInfo, ICameraDisplay cameraDisplay) { InitializeComponent(); _patternInfo = patternInfo; _cogCameraDisplay = cameraDisplay as ICogCameraDisplay; SetParam(); InitDefaultParam(); SetFilteringTypes(); SetMorphologyTypes(); InitImageBuffers(); SetEventHandler(); DataContext = this; } private void SetParam() { PreProcParam = _patternInfo.PreProcParam.Clone(); } private void InitDefaultParam() { if (PreProcParam.FilParam.Types.Count != 5 || PreProcParam.FilParam.RepeatCounts.Count != 5) { PreProcParam.FilParam.Types.Clear(); PreProcParam.FilParam.RepeatCounts.Clear(); for (int i = 0; i < 5; i++) { PreProcParam.FilParam.Types.Add(eFilteringType.None); PreProcParam.FilParam.RepeatCounts.Add(0); } } if (PreProcParam.MorphParam.Types.Count != 5 || PreProcParam.MorphParam.RepeatCounts.Count != 5) { PreProcParam.MorphParam.Types.Clear(); PreProcParam.MorphParam.RepeatCounts.Clear(); for (int i = 0; i < 5; i++) { PreProcParam.MorphParam.Types.Add(eMorphologyType.None); PreProcParam.MorphParam.RepeatCounts.Add(0); } } } private void SetFilteringTypes() { var filteringTypes = new List(); for (int i = 0; i < Enum.GetValues(typeof(eFilteringType)).Length; i++) { filteringTypes.Add((eFilteringType)i); } FilteringTypes = filteringTypes; } private void SetMorphologyTypes() { var morphologyTypes = new List(); for (int i = 0; i < Enum.GetValues(typeof(eMorphologyType)).Length; i++) { morphologyTypes.Add((eMorphologyType)i); } MorphologyTypes = morphologyTypes; } private void InitImageBuffers() { FreeImageBuffers(); CogEnvironment.CopyImage(_cogCameraDisplay.GetImage(), ref _srcImage); } private void FreeImageBuffers() { CogEnvironment.FreeImage(_srcImage); CogEnvironment.FreeImage(_preProcImage); } private void ApplyThreshold() { if (ParentWindow != null) { if (!ParentWindow.IsActive) { return; } } if (_srcImage == null) { _logger.FuncE("_srcImage is null."); return; } var sw = Stopwatch.StartNew(); _preProcImage = ImgPreProcessor.GetPreProcessedImage(_srcImage, PreProcParam); _logger.I($"Pre-Processing Time : {sw.ElapsedMilliseconds} ms"); _cogCameraDisplay.SetImage(_preProcImage); } protected void OnPropertyChanged( [CallerMemberName] string propertyName = null) => PropertyChanged?.Invoke( this, new PropertyChangedEventArgs(propertyName) ); private void ReloadImageBtn_Clicked(object sender, RoutedEventArgs e) { InitImageBuffers(); SetParam(); ApplyThreshold(); } private void ApplyBtn_Clicked(object sender, RoutedEventArgs e) { _patternInfo.PreProcParam = PreProcParam.Clone(); ParentWindow?.Close(); } private void CancelBtn_Clicked(object sender, RoutedEventArgs e) { _cogCameraDisplay.SetImage(_srcImage); ParentWindow?.Close(); } private void FilOnOff_Clicked(object sender, RoutedEventArgs e) { ApplyThreshold(); } private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { if ((sender as ComboBox).Items.Count > 0) { ApplyThreshold(); } } private void SetEventHandler() { sliderThresholdLow.SliderChangedEvent += ThresholdChangedEventHandler; sliderThresholdHigh.SliderChangedEvent += ThresholdChangedEventHandler; sliderFilter1.SliderChangedEvent += ThresholdChangedEventHandler; sliderFilter2.SliderChangedEvent += ThresholdChangedEventHandler; sliderFilter3.SliderChangedEvent += ThresholdChangedEventHandler; sliderFilter4.SliderChangedEvent += ThresholdChangedEventHandler; sliderFilter5.SliderChangedEvent += ThresholdChangedEventHandler; sliderMorph1.SliderChangedEvent += ThresholdChangedEventHandler; sliderMorph2.SliderChangedEvent += ThresholdChangedEventHandler; sliderMorph3.SliderChangedEvent += ThresholdChangedEventHandler; sliderMorph4.SliderChangedEvent += ThresholdChangedEventHandler; sliderMorph5.SliderChangedEvent += ThresholdChangedEventHandler; } private void ClearEventHandler() { sliderThresholdLow.SliderChangedEvent -= ThresholdChangedEventHandler; sliderThresholdHigh.SliderChangedEvent -= ThresholdChangedEventHandler; sliderFilter1.SliderChangedEvent -= ThresholdChangedEventHandler; sliderFilter2.SliderChangedEvent -= ThresholdChangedEventHandler; sliderFilter3.SliderChangedEvent -= ThresholdChangedEventHandler; sliderFilter4.SliderChangedEvent -= ThresholdChangedEventHandler; sliderFilter5.SliderChangedEvent -= ThresholdChangedEventHandler; sliderMorph1.SliderChangedEvent -= ThresholdChangedEventHandler; sliderMorph2.SliderChangedEvent -= ThresholdChangedEventHandler; sliderMorph3.SliderChangedEvent -= ThresholdChangedEventHandler; sliderMorph4.SliderChangedEvent -= ThresholdChangedEventHandler; sliderMorph5.SliderChangedEvent -= ThresholdChangedEventHandler; } public void ThresholdChangedEventHandler(object sender, EventArgs e) { ApplyThreshold(); } private void ForegroundButton_Clicked(object sender, RoutedEventArgs e) { ApplyThreshold(); } private void BinOnOff_Clicked(object sender, RoutedEventArgs e) { if (!PreProcParam.BinaryEnabled()) { ckBoxMorphEnabled.IsChecked = false; } ApplyThreshold(); } private void MorphOnOff_Clicked(object sender, RoutedEventArgs e) { ApplyThreshold(); } public void Dispose() { ClearEventHandler(); FreeImageBuffers(); } } }