2026-01-26 18:56:53 +09:00

224 lines
8.5 KiB
C#

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 {
/// <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 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<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() {
_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();
}
}
}