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