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;
using System.IO;
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();
}
private void ckBoxMaskEnabled_Click(object sender, RoutedEventArgs e)
{
ApplyThreshold();
}
private string GetLoadFilePath()
{
try {
string filePath = Path.Combine(VisionSettingManager.VisionSetting.RootDirPath, "MaskingImages");
if (!Directory.Exists(filePath)) {
Directory.CreateDirectory(filePath);
}
var openFileDialog = new System.Windows.Forms.OpenFileDialog();
openFileDialog.Multiselect = false;
openFileDialog.Filter = "All files (*.*)|*.*";
openFileDialog.InitialDirectory = filePath;
if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
return openFileDialog.FileName;
}
} catch (Exception e) {
}
return "";
}
private void BtnOpenMaskingImageFolder_Click(object sender, RoutedEventArgs e)
{
string filePath = GetLoadFilePath();
if (filePath !="") PreProcParam.CustomizeMaskParam.MaskingImageName = Path.GetFileName(filePath);
}
}
}