using HalconDotNet;
using LB_SmartVisionCommon;
using LB_VisionControl;
using LB_VisionProcesses.Alogrithms.Halcon;
using Sunny.UI.Win32;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace LB_VisionProcesses.Alogrithms.Halcon
{
public partial class HImageEnhancementToolEdit : TAlgorithmEdit
{
private int rowriginalHeight;
public HImageEnhancementToolEdit(HImageEnhancementTool subject = null)
{
if (subject != null && subject is HImageEnhancementTool)
Subject = subject;
else
Subject = new HImageEnhancementTool();
if (!(Subject.Params.ROI is HSegment))
Subject.Params.ROI = new HSegment(0, 0, 250, 250);
// 保存原始行高度
rowriginalHeight = (int)tableLayoutPanel4.RowStyles[1].Height;
this.Dock = DockStyle.Fill;
InitializeComponent();
InitializeComboBox();
InitializeDataGridView();
}
private void InitializeComboBox()
{
//// 添加权限选项
//foreach (var item in Enum.GetValues(typeof(UserPermission)))
//{
// cmbImageEnhancement.Items.Add(item.ToString());
//}
cmbImageEnhancement.Items.Add("emphasize边缘增强");
cmbImageEnhancement.Items.Add("equ_histo_image直方图均衡化");
cmbImageEnhancement.Items.Add("scale_image_max比例增强");
// 设置默认选择项
cmbImageEnhancement.SelectedIndex = 2;
}
#region 图像增强算法选择下拉框
private void cmbImageEnhancement_SelectedIndexChanged(object sender, EventArgs e)
{
ComboBox cb = sender as ComboBox;
if (cb.SelectedIndex == 0)
{
ShowRow();
}
else if (cb.SelectedIndex == 1)
{
HideRow();
}
}
private void ShowRow()
{
// 显示Row2(恢复高度)
tableLayoutPanel4.RowStyles[1].SizeType = SizeType.Absolute;
tableLayoutPanel4.RowStyles[1].Height = rowriginalHeight;
// 显示Row2中的控件
foreach (Control ctrl in tableLayoutPanel4.Controls)
{
int row = tableLayoutPanel4.GetRow(ctrl);
if (row == 1)
ctrl.Visible = true;
}
}
private void HideRow()
{
// 显示Row2(恢复高度)
tableLayoutPanel4.RowStyles[1].SizeType = SizeType.Absolute;
tableLayoutPanel4.RowStyles[1].Height = 0;
// 显示Row2中的控件
foreach (Control ctrl in tableLayoutPanel4.Controls)
{
int row = tableLayoutPanel4.GetRow(ctrl);
if (row == 1)
ctrl.Visible = false;
}
}
#endregion
private void InitializeDataGridView()
{
//this.dataGridViewIE.DataSource = recordUserDatas;
// 设置列标题
dataGridViewIE.Columns[0].Name = "滤波器类型";
dataGridViewIE.Columns[1].Name = "掩膜宽度";
dataGridViewIE.Columns[2].Name = "掩膜高度";
dataGridViewIE.Columns[3].Name = "增强因子";
// 设置DataGridView列宽
dataGridViewIE.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
}
///
/// 控件加载事件
///
///
///
private void HImageEnhancementToolEdit_Load(object sender, EventArgs e)
{
pnlInputImage.Controls.Add(inputImageHSmartWindowControl);
inputImageHSmartWindowControl.Dock = DockStyle.Fill;
pnlRecordImage.Controls.Add(recordImageHSmartWindowControl);
recordImageHSmartWindowControl.Dock = DockStyle.Fill;
//遍历可以选择的Roi类型枚举
foreach (var value in Enum.GetValues(typeof(RoiType)))
cmbTypeRoi.Items.Add(value.ToString());
//遍历可以选择的图像增强类型枚举
foreach (var value in Enum.GetValues(typeof(ImageEnhancementType)))
cmbImageEnhancement.Items.Add(value.ToString());
//遍历可以选择的Fixture枚举
cmbFixture.Items.Add("");
foreach (string value in IProcess.dicFixtures.Keys)
cmbFixture.Items.Add(value.ToString());
ckbDrawRoi.Checked = true;
cmbTypeRoi.Text = RoiType.Segment.ToString();
cmbImageEnhancement.Text = Transition.Ignore.ToString();
LoadParas();
if (Subject.Result)
{
lblResult.BackColor = Color.Green;
lblResult.Text = "True";
}
else
{
lblResult.BackColor = Color.Red;
lblResult.Text = "False";
}
lblMsg.Text = Msg.Length > 50 ? Msg.Substring(0, 50) : Msg;
lblMsgToolTip.SetToolTip(BtmStatusStrip, Msg);
lblRunTime.Text = $"{Subject.RunTime}ms";
}
///
/// 更新运行参数
///
public override void UpdataInputs()
{
//设置运行参数
double dResult = 0;
int iResult = 0;
if (cmbFixture.Text == "")
Subject.Params.Fixture = new Fixture();
else if (IProcess.dicFixtures.ContainsKey(cmbFixture.Text))
Subject.Params.Fixture = IProcess.dicFixtures[cmbFixture.Text];
Type type = inputImageHSmartWindowControl.oRoi?.GetType();
switch (type)
{
case Type t when t == typeof(HRectangle2):
HRectangle2 hRectangle2 = (HRectangle2)inputImageHSmartWindowControl.oRoi;
Subject.Params.ROI
= new HRectangle2(hRectangle2.X - Subject.Params.Fixture.X, hRectangle2.Y - Subject.Params.Fixture.Y
, hRectangle2.Phi - Subject.Params.Fixture.Phi, hRectangle2.Width, hRectangle2.Height);
break;
case Type t when t == typeof(HCircle):
HCircle hCircle = (HCircle)inputImageHSmartWindowControl.oRoi;
Subject.Params.ROI
= new HCircle(hCircle.X - Subject.Params.Fixture.X, hCircle.Y - Subject.Params.Fixture.Y, hCircle.Radius);
break;
case Type t when t == typeof(HSegment):
HSegment hSegment = (HSegment)inputImageHSmartWindowControl.oRoi;
Subject.Params.ROI
= new HSegment(hSegment.StartX - Subject.Params.Fixture.X, hSegment.StartY - Subject.Params.Fixture.Y
, hSegment.EndX - Subject.Params.Fixture.X, hSegment.EndY - Subject.Params.Fixture.Y);
break;
default:
Subject.Params.ROI = new ROI();
break;
}
}
///
/// 加载运行参数
///
public override void LoadParas()
{
this.BeginInvoke(new Action(() =>
{
if (Subject.InputImage != null && Subject.InputImage is HObject)
inputImageHSmartWindowControl.ShowHoImage((HObject)Subject.InputImage);
Type type = Subject.Params.ROI?.GetType();
if (Subject.Params.ROI != null)
{
switch (type)
{
case Type t when t == typeof(HRectangle2):
cmbTypeRoi.Text = RoiType.Rectangle2.ToString();
break;
case Type t when t == typeof(HCircle):
cmbTypeRoi.Text = RoiType.Circle.ToString();
break;
case Type t when t == typeof(HSegment):
cmbTypeRoi.Text = RoiType.Segment.ToString();
break;
default:
cmbTypeRoi.Text = RoiType.None.ToString();
break;
}
if (cmbTypeRoi.Text.ToString() != "None")
ckbDrawRoi.Checked = true;
else
ckbDrawRoi.Checked = false;
inputImageHSmartWindowControl.oRoi = Subject.Params.ROI;
}
if (Subject.Params.Fixture != null)
cmbFixture.Text = Subject.Params.Fixture.strName;
else
cmbFixture.Text = "";
switch (type)
{
case Type t when t == typeof(HRectangle2):
inputImageHSmartWindowControl.oRoi
= new HRectangle2(Subject.Params.ROI.X + Subject.Params.Fixture.X, Subject.Params.ROI.Y + Subject.Params.Fixture.Y
, Subject.Params.ROI.Phi + Subject.Params.Fixture.Phi, ((HRectangle2)Subject.Params.ROI).Width, ((HRectangle2)Subject.Params.ROI).Height);
break;
case Type t when t == typeof(HCircle):
inputImageHSmartWindowControl.oRoi
= new HCircle(Subject.Params.ROI.X + Subject.Params.Fixture.X, Subject.Params.ROI.Y + Subject.Params.Fixture.Y
, ((HCircle)Subject.Params.ROI).Radius);
break;
case Type t when t == typeof(HSegment):
inputImageHSmartWindowControl.oRoi
= new HSegment(((HSegment)Subject.Params.ROI).StartX + Subject.Params.Fixture.X, ((HSegment)Subject.Params.ROI).StartY + Subject.Params.Fixture.Y
, ((HSegment)Subject.Params.ROI).EndX + Subject.Params.Fixture.X, ((HSegment)Subject.Params.ROI).EndY + Subject.Params.Fixture.Y);
break;
default:
inputImageHSmartWindowControl.oRoi = null;
break;
}
}));
}
private void btnAdd_Click(object sender, EventArgs e)
{
switch (cmbImageEnhancement.SelectedIndex)
{
case 0:
break;
case 1:
break;
case 2:
break;
}
}
///
/// 点击运行
///
///
///
public override void btnRun_Click(object sender, EventArgs e)
{
if (Subject.InputImage != null)
InputImage = Subject.InputImage;
DateTime StartTime = DateTime.Now;
Run();
//更新日志与结果
this.BeginInvoke(new Action(() =>
{
if (Subject.Result)
{
lblResult.BackColor = Color.Green;
lblResult.Text = "True";
recordImageHSmartWindowControl.SetColor("green");
}
else
{
lblResult.BackColor = Color.Red;
lblResult.Text = "False";
recordImageHSmartWindowControl.SetColor("red");
}
lblMsg.Text = Msg.Length > 50 ? Msg.Substring(0, 50) : Msg;
lblMsgToolTip.SetToolTip(BtmStatusStrip, Msg);
lblRunTime.Text = $"{(DateTime.Now - StartTime).TotalMilliseconds}ms";
UpdataOutputs();
imgTabControl.SelectedTab = tabPageRecordImage;
if (Subject.InputImage != null && Subject.InputImage is HObject)
{
HOperatorSet.GetImageSize((HObject)Subject.InputImage, out HTuple ho_ImageWidth, out HTuple ho_ImageHeight);
recordImageHSmartWindowControl.ShowHoImage((HObject)Subject.InputImage);
}
//先判断子类再判断父类
if (Subject.Record != null && Subject.Record is MsgRecord msgRecord)
{
recordImageHSmartWindowControl.DispObj(msgRecord.RecordObject_OK, true);
recordImageHSmartWindowControl.DispObj(msgRecord.RecordObject_NG, false);
for (int i = 0; i < msgRecord.Msg.Length; i++)
recordImageHSmartWindowControl.ShowMsg(msgRecord.Msg[i]
, 1 == msgRecord.Result[i] ? true : false, msgRecord.Column[i], msgRecord.Row[i]);
}
else if (Subject.Record != null && Subject.Record is ObjectRecord objRecord)
{
recordImageHSmartWindowControl.DispObj(objRecord.RecordObject_OK, true);
recordImageHSmartWindowControl.DispObj(objRecord.RecordObject_NG, false);
}
GC.Collect();
}));
}
#region 工具栏按钮事件
///
/// 工具栏“导图”
///
///
///
public override void btnLoadImage_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
// 设置文件对话框的属性
openFileDialog.Multiselect = false; // 不允许多选
// 设置文件过滤器,支持多种文件类型
openFileDialog.Filter = "Image Files (*.png;*.jpg;*.jpeg;*.bmp)|*.png;*.jpg;*.jpeg;*.bmp|All Files (*.*)|*.*";
// 显示文件对话框
DialogResult result = openFileDialog.ShowDialog();
// 处理对话框返回结果
if (result == DialogResult.OK)
{
// 获取用户选择的文件名
string[] selectedFiles = openFileDialog.FileNames;
if (selectedFiles.Length > 0)
{
HOperatorSet.ReadImage(out HObject ho_Image, selectedFiles[0]);
//判断是否为灰度图
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
HOperatorSet.CountChannels(ho_Image, out HTuple hv_Channels);
if (hv_Channels.TupleInt() != 1)
{
HOperatorSet.Rgb1ToGray(ho_Image, out ho_Image);
//更新日志与结果
this.BeginInvoke(new Action(() =>
{
lblMsg.Text = "导入图片非灰度图,自动转换为灰度图";
}));
}
InputImage = ho_Image;
imgTabControl.SelectedTab = tabPageInputImage;
inputImageHSmartWindowControl.oRoi = inputImageHSmartWindowControl.oRoi;
}
}
}
}
///
/// 工具栏“保存”
///
///
///
public override void btnSaveParas_Click(object sender, EventArgs e) { base.btnSaveParas_Click(sender, e); }
#endregion
#region ROI功能
///
/// 是否启用ROI
///
///
///
public override void ckbDrawRoi_CheckedChanged(object sender, EventArgs e)
{
if (ckbDrawRoi.Checked)
{
inputImageHSmartWindowControl.bAollowDraw = true;
imgTabControl.SelectedTab = tabPageInputImage;
}
else
{
inputImageHSmartWindowControl.bAollowDraw = false;
Subject.Params.ROI = new ROI();
}
}
///
/// ROI下拉框改变事件
///
///
///
public override void cmbTypeRoi_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
if (Enum.TryParse(cmbTypeRoi.Text.ToString(), out RoiType type))
{
HTuple hv_imageWidth = 0;
HTuple hv_imageHeight = 0;
if (InputImage != null && InputImage is HObject)
HOperatorSet.GetImageSize((HObject)InputImage, out hv_imageWidth, out hv_imageHeight);
switch (type)
{
case RoiType.Rectangle2:
inputImageHSmartWindowControl.oRoi
= new HRectangle2(hv_imageWidth.TupleReal() / 2, hv_imageHeight.TupleReal() / 2, 0
, hv_imageWidth.TupleReal() / 4, hv_imageHeight.TupleReal() / 4);
break;
case RoiType.Circle:
inputImageHSmartWindowControl.oRoi
= new HCircle(hv_imageWidth.TupleReal() / 2, hv_imageHeight.TupleReal() / 2, hv_imageWidth.TupleReal() / 4);
break;
case RoiType.Segment:
inputImageHSmartWindowControl.oRoi
= new HSegment(0, 0, hv_imageWidth.TupleReal() / 4, hv_imageHeight.TupleReal() / 4);
break;
case RoiType.None:
default:
inputImageHSmartWindowControl.oRoi = null;
break;
}
}
}
catch { }
}
#endregion
public override void cmbFixture_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
if (IProcess.dicFixtures.ContainsKey(cmbFixture.Text))
Subject.Params.Fixture = IProcess.dicFixtures[cmbFixture.Text];
else
Subject.Params.Fixture = new Fixture();
}
catch { }
}
}
}