From 8db52bc296f662691a17aabeeabebd713e3b576d Mon Sep 17 00:00:00 2001
From: C3031 <shitiangui@lanpucloud.cn>
Date: 星期五, 06 三月 2026 16:53:08 +0800
Subject: [PATCH] Merge branch 'master' of http://lanpucloud.cn:1111/r/~zhengyabo/LB_TyreAppearanceInspectionSoftware

---
 LB_VisionProcesses/Alogrithms/Halcon/2D/HFilterTool/HFilterTool.cs |  229 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 229 insertions(+), 0 deletions(-)

diff --git a/LB_VisionProcesses/Alogrithms/Halcon/2D/HFilterTool/HFilterTool.cs b/LB_VisionProcesses/Alogrithms/Halcon/2D/HFilterTool/HFilterTool.cs
new file mode 100644
index 0000000..c53396a
--- /dev/null
+++ b/LB_VisionProcesses/Alogrithms/Halcon/2D/HFilterTool/HFilterTool.cs
@@ -0,0 +1,229 @@
+锘縰sing HalconDotNet;
+using LB_SmartVisionCommon;
+using LB_VisionControl;
+using System;
+using System.Collections.Generic;
+using System.Drawing.Imaging;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace LB_VisionProcesses.Alogrithms.Halcon
+{
+    public enum ImageFilterType { Mean, Guass, Median }
+
+    [Process("Halcon2D鍥惧儚婊ゆ尝", Category = "Halcon2D宸ュ叿", Description = "鍒涘缓婊ゆ尝宸ュ叿")]
+    public class HFilterTool : TAlgorithm
+    {
+        public HFilterTool()
+        {
+            strProcessClass = "LB_VisionProcesses.Alogrithms.Halcon.HFilterTool";
+            strProcessName = "Halcon2D鍥惧儚婊ゆ尝宸ュ叿";
+
+            Params.Inputs.Add("婊ゆ尝鍣ㄧ被鍨�", "鍧囧�兼护娉�");
+            Params.Inputs.Add("鎺╄啘瀹�", 1);
+            Params.Inputs.Add("鎺╄啘楂�", 1);
+            //mean_image(Image : ImageMean : MaskWidth, MaskHeight : )
+
+            Params.Inputs.Add("婊ゆ尝鍣ㄧ被鍨�", "楂樻柉婊ゆ尝");
+            Params.Inputs.Add("楂樻柉鏍稿昂瀵�", 1.0);
+            //gauss_filter(Image : ImageGauss : Size : )
+
+            Params.Inputs.Add("婊ゆ尝鍣ㄧ被鍨�", "涓�兼护娉�");
+            Params.Inputs.Add("鎺╄啘瀹�", 1);
+            Params.Inputs.Add("鎺╄啘楂�", 1);
+            //median_rect(Image : ImageMedian :MaskWidth,MaskHeight:)
+
+            Params.ROI = new HSegment(0, 0, 250, 250);
+        }
+
+        List<RecordFilterData> recordFilterDatas = new List<RecordFilterData>();
+        /// <summary>
+        /// 绠楀瓙閫昏緫
+        /// </summary>
+        public override void TAlgorithmMain()
+        {
+            #region 鍒濆鍖栧彉閲�
+            HObject ho_Regions, ho_LineXld;
+            HOperatorSet.GenEmptyObj(out ho_Regions);
+            HOperatorSet.GenEmptyObj(out ho_LineXld);
+            #endregion
+
+            try
+            {
+                if (InputImage == null)
+                {
+                    Msg = "杈撳叆鍥剧墖涓虹┖";
+                    Result = false;
+                    return;
+                }
+                if (InputImage is Bitmap)
+                {
+                    try
+                    {
+                        using (HImage hImage = new HImage())
+                        {
+                            Bitmap bitmap = (Bitmap)InputImage;
+                            Rectangle rect = new Rectangle(0, 0, ((Bitmap)bitmap).Width, ((Bitmap)bitmap).Height);
+                            BitmapData srcBmpData = ((Bitmap)bitmap).LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb);
+                            hImage.GenImageInterleaved(srcBmpData.Scan0, "rgbx", ((Bitmap)bitmap).Width, ((Bitmap)bitmap).Height, 0, "byte", ((Bitmap)bitmap).Width, ((Bitmap)bitmap).Height, 0, 0, -1, 0);
+                            ((Bitmap)bitmap).UnlockBits(srcBmpData);
+                            bitmap.Dispose();
+                            bitmap = null;
+                            InputImage = null;
+                            InputImage = hImage.Clone();
+                        }
+                    }
+                    catch (Exception ex)
+                    {
+                    }
+                }
+                if (!(InputImage is HObject))
+                {
+                    Msg = "杈撳叆鍥剧墖鏍煎紡涓嶄负HObject";
+                    Result = false;
+                    return;
+                }
+                #region 瑁佸壀鍖哄煙
+                //if (!(Params.ROI is HSegment))
+                //{
+                //    Msg = "ROI绫诲瀷閿欒,蹇呴』涓篐Segment绫诲瀷";
+                //    Result = false;
+                //    return;
+                //}
+
+                //if (!(InputImage is HObject))
+                //{
+                //    Msg = "杈撳叆鍥剧墖绫诲瀷閿欒,蹇呴』涓篐Object绫诲瀷";
+                //    Result = false;
+                //    return;
+                //}
+
+                //HObject DomainImage = ((HObject)InputImage)?.CopyObj(1, -1);
+                object DomainImage = null;
+                if (!ReduceDomainImage(InputImage, ref DomainImage))
+                {
+                    Msg = "瑁佸壀鍖哄煙澶辫触";
+                    Result = false;
+                    return;
+                }
+                #endregion
+
+                #region 绠楀瓙閫昏緫
+                Record = new ObjectRecord();
+                HObject hoDomainImage = DomainImage as HObject;
+                HTuple hv_Channels = new HTuple();
+                //鍒ゆ柇鏄惁涓虹伆搴﹀浘
+                using (HDevDisposeHelper dh = new HDevDisposeHelper())
+                {
+                    try
+                    {
+                        HOperatorSet.CountChannels(hoDomainImage, out hv_Channels);
+                        if (hv_Channels.TupleInt() != 1)
+                            HOperatorSet.Rgb1ToGray(hoDomainImage, out hoDomainImage);
+
+                        //杞崲鍚庡啀娆℃鏌ユ槸鍚︿负鐏板害鍥�
+                        HOperatorSet.CountChannels(hoDomainImage, out hv_Channels);
+                        if (hv_Channels.TupleInt() != 1)
+                        {
+                            HOperatorSet.Rgb1ToGray(hoDomainImage, out hoDomainImage);
+                            Msg = "杈撳叆鍥剧墖涓嶄负鐏板害鍥�";
+                            Result = false;
+                            return;
+                        }
+                    }
+                    catch
+                    {
+                        Msg = "杈撳叆鍥剧墖涓嶄负鐏板害鍥句笖杞崲澶辫触";
+                        Result = false;
+                        return;
+                    }
+                }
+
+                int hv_MaskWidth = Convert.ToInt16(Params.Inputs["鎺╄啘瀹�"]);
+                int hv_MaskHight = Convert.ToInt16(Params.Inputs["鎺╄啘楂�"]);
+                int hv_Size = Convert.ToInt16(Params.Inputs["楂樻柉鏍稿昂瀵�"]);
+
+                recordFilterDatas = FilterManager.Instance.GetAllUsers();
+
+                string hv_FilterType = "";
+                foreach (var recordFilterData in recordFilterDatas)
+                {
+                    switch (recordFilterData.FilterName)
+                    {
+                        case FilterType.鍧囧�兼护娉MeanImage:
+                            hv_FilterType = "mean";
+                            hv_MaskWidth = Convert.ToInt16(recordFilterData.MaskWidth);
+                            hv_MaskHight = Convert.ToInt16(recordFilterData.MaskHight);
+                            Filter(hoDomainImage, out ho_Regions, hv_FilterType, hv_MaskWidth, hv_MaskHight, hv_Size);
+                            break;
+                        case FilterType.楂樻柉婊ゆ尝_GaussFilter:
+                            hv_FilterType = "gauss";
+                            hv_Size = Convert.ToInt16(recordFilterData.GaussSize);
+                            Filter(hoDomainImage, out ho_Regions, hv_FilterType, hv_MaskWidth, hv_MaskHight, hv_Size);
+                            break;
+                        case FilterType.涓�兼护娉MedianRect:
+                            hv_FilterType = "median";
+                            hv_MaskWidth = Convert.ToInt16(recordFilterData.MaskWidth);
+                            hv_MaskHight = Convert.ToInt16(recordFilterData.MaskHight);
+                            Filter(hoDomainImage, out ho_Regions, hv_FilterType, hv_MaskWidth, hv_MaskHight, hv_Size);
+                            break;
+                        default:
+                            hv_FilterType = "median";
+                            hv_MaskWidth = Convert.ToInt16(recordFilterData.MaskWidth);
+                            hv_MaskHight = Convert.ToInt16(recordFilterData.MaskHight);
+                            Filter(hoDomainImage, out ho_Regions, hv_FilterType, hv_MaskWidth, hv_MaskHight, hv_Size);
+                            break;
+                    }
+
+
+                }
+
+                #endregion
+
+
+                #region 鐢熸垚OutputImage缁欏悗缁鐞�
+                try
+                {
+                    OutputImage = hoDomainImage;
+                }
+                catch (Exception ex)
+                {
+                    Msg = "鐢熸垚OutputImage澶辫触,鍘熷洜鏄�:" + ex.ToString();
+                    Result = false;
+                    return;
+                }
+                #endregion
+
+                if (Msg == "杩愯瓒呮椂")
+                {
+                    Result = false;
+                    return;
+                }
+
+                Msg = "杩愯鎴愬姛";
+                Result = true;
+                return;
+            }
+            catch (Exception ex)
+            {
+                Msg = "杩愯澶辫触,鍘熷洜鏄�:" + ex.ToString().TrimEnd();
+                OutputImage = null;
+                Result = false;
+                return;
+            }
+            finally
+            {
+                if (!Result)
+                {
+                    Params.Outputs.Add("Segment", new HSegment());
+                }
+
+                bCompleted = true;
+                #region 鍐呭瓨閲婃斁
+                ho_Regions.Dispose();
+                #endregion
+            }
+        }
+    }
+}

--
Gitblit v1.9.3