using Aurora.Api; using MilCommon; using Matrox.MatroxImagingLibrary; using MilPattern; 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; namespace MilUI { /// /// 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 IMilCameraDisplay _milCameraDisplay; private MIL_ID _systemId = MIL.M_NULL; private MIL_ID _displayImage = MIL.M_NULL; private MIL_ID _srcImage = MIL.M_NULL; private MIL_ID _preProcImage = MIL.M_NULL; public PreProcessingSettingView(PatternInfo patternInfo, ICameraDisplay cameraDisplay) { InitializeComponent(); _patternInfo = patternInfo; _milCameraDisplay = cameraDisplay as IMilCameraDisplay; 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() { _systemId = _patternInfo.MilSystemId; if (_systemId != MIL.M_NULL) { FreeImageBuffers(); // Source image of display _displayImage = _milCameraDisplay.GetImage(); // Cloned source image _srcImage = MilEnvironment.GetCompatibleGrayImageBuffer(_displayImage); MilEnvironment.CopyImage(_displayImage, _srcImage); _preProcImage = MilEnvironment.GetCompatibleGrayImageBuffer(_srcImage); MilEnvironment.CopyImage(_srcImage, _preProcImage); } } private void FreeImageBuffers() { MilEnvironment.FreeImage(_srcImage); MilEnvironment.FreeImage(_preProcImage); } private void ApplyThreshold() { if (_displayImage != MIL.M_NULL && _displayImage != _milCameraDisplay.GetImage()) { InitImageBuffers(); } var sw = Stopwatch.StartNew(); _preProcImage = ImgPreProcessor.GetPreProcessedImage(_srcImage, PreProcParam); _logger.I($"Pre-Processing Time : {sw.ElapsedMilliseconds} ms"); MilEnvironment.CopyImage(_preProcImage, _displayImage); } protected void OnPropertyChanged( [CallerMemberName] string propertyName = null) => PropertyChanged?.Invoke( this, new PropertyChangedEventArgs(propertyName) ); private void ReloadImageBtn_Clicked(object sender, RoutedEventArgs e) { SetParam(); MilEnvironment.CopyImage(_srcImage, _displayImage); ApplyThreshold(); } private void ApplyBtn_Clicked(object sender, RoutedEventArgs e) { _patternInfo.PreProcParam = PreProcParam.Clone(); ParentWindow?.Close(); } private void CancelBtn_Clicked(object sender, RoutedEventArgs e) { MilEnvironment.CopyImage(_srcImage, _displayImage); 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(); } } }