224 lines
8.5 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|