2026-01-26 14:51:28 +09:00

221 lines
8.1 KiB
C#

/*
* 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 {
/// <summary>
/// Interaction logic for PreProcessingSettingView.xaml
/// </summary>
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<eFilteringType> FilteringTypes { get; set; }
public IEnumerable<eMorphologyType> 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<eFilteringType>();
for (int i = 0; i < Enum.GetValues(typeof(eFilteringType)).Length; i++) {
filteringTypes.Add((eFilteringType)i);
}
FilteringTypes = filteringTypes;
}
private void SetMorphologyTypes() {
var morphologyTypes = new List<eMorphologyType>();
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();
}
}
}