From 22ff831583da8c6f1c015c1e294f0bc1ef70ac85 Mon Sep 17 00:00:00 2001
From: C3031 <shitiangui@lanpucloud.cn>
Date: 星期五, 30 一月 2026 09:23:14 +0800
Subject: [PATCH]
---
LB_VisionProcesses/Alogrithms/Halcon/2D/HImageEnhancementTool/HImageEnhancementToolEdit.cs | 454 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 450 insertions(+), 4 deletions(-)
diff --git a/LB_VisionProcesses/Alogrithms/Halcon/2D/HImageEnhancementTool/HImageEnhancementToolEdit.cs b/LB_VisionProcesses/Alogrithms/Halcon/2D/HImageEnhancementTool/HImageEnhancementToolEdit.cs
index 0c04737..be2d74e 100644
--- a/LB_VisionProcesses/Alogrithms/Halcon/2D/HImageEnhancementTool/HImageEnhancementToolEdit.cs
+++ b/LB_VisionProcesses/Alogrithms/Halcon/2D/HImageEnhancementTool/HImageEnhancementToolEdit.cs
@@ -1,4 +1,9 @@
-锘縰sing System;
+锘縰sing 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;
@@ -8,13 +13,454 @@
using System.Threading.Tasks;
using System.Windows.Forms;
-namespace LB_VisionProcesses.Alogrithms.Halcon._2D.HEdgeExtractionTool
+namespace LB_VisionProcesses.Alogrithms.Halcon
{
- public partial class HImageEnhancementToolEdit : UserControl
+ public partial class HImageEnhancementToolEdit : TAlgorithmEdit
{
- public HImageEnhancementToolEdit()
+
+ 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;
+ }
+
+ /// <summary>
+ /// 鎺т欢鍔犺浇浜嬩欢
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
+ private void HImageEnhancementToolEdit_Load(object sender, EventArgs e)
+ {
+ pnlInputImage.Controls.Add(inputImageHSmartWindowControl);
+ inputImageHSmartWindowControl.Dock = DockStyle.Fill;
+
+ pnlRecordImage.Controls.Add(recordImageHSmartWindowControl);
+ recordImageHSmartWindowControl.Dock = DockStyle.Fill;
+
+ //閬嶅巻鍙互閫夋嫨鐨凴oi绫诲瀷鏋氫妇
+ 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());
+
+ //閬嶅巻鍙互閫夋嫨鐨凢ixture鏋氫妇
+ 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";
+ }
+
+ /// <summary>
+ /// 鏇存柊杩愯鍙傛暟
+ /// </summary>
+ 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;
+ }
+ }
+
+ /// <summary>
+ /// 鍔犺浇杩愯鍙傛暟
+ /// </summary>
+ 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;
+ }
+ }
+
+ /// <summary>
+ /// 鐐瑰嚮杩愯
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
+ 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 宸ュ叿鏍忔寜閽簨浠�
+ /// <summary>
+ /// 宸ュ叿鏍忊�滃鍥锯��
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
+ 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;
+ }
+ }
+ }
+ }
+ /// <summary>
+ /// 宸ュ叿鏍忊�滀繚瀛樷��
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
+ public override void btnSaveParas_Click(object sender, EventArgs e) { base.btnSaveParas_Click(sender, e); }
+ #endregion
+ #region ROI鍔熻兘
+ /// <summary>
+ /// 鏄惁鍚敤ROI
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
+ 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();
+ }
+ }
+ /// <summary>
+ /// ROI涓嬫媺妗嗘敼鍙樹簨浠�
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
+ 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 { }
+ }
+
}
}
--
Gitblit v1.9.3