C3204
2025-12-25 eb3e5c90006ab2b1b485000e7622941ff11a2b51
”修复log显示以及文件大小问题。“
已修改14个文件
457 ■■■■■ 文件已修改
LB_SmartVision/ProcessRun/ProcessContext.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LB_SmartVision/ProcessRun/ProcessRunBll.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LB_SmartVision/VisionForm.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
LB_VisionProcesses/Alogrithms/BaseAlgorithm/TAlgorithm.cs 181 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LB_VisionProcesses/Alogrithms/BaseAlgorithm/TAlgorithmEdit.cs 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LB_VisionProcesses/Alogrithms/BaseAlgorithm/TestTool/TestToolEdit.cs 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LB_VisionProcesses/Alogrithms/Halcon/2D/HBlobTool/HBlobTool.cs 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LB_VisionProcesses/Alogrithms/Halcon/2D/HFindCode2dTool/HFindCode2dTool.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LB_VisionProcesses/Alogrithms/Halcon/2D/HFindLineTool/HFindLineTool.cs 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LB_VisionProcesses/Alogrithms/Halcon/2D/HFindModelTool/HFindModelTool.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LB_VisionProcesses/Alogrithms/Halcon/2D/HFindMultiModelTool/HFindMultiModelTool.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LB_VisionProcesses/Alogrithms/OpenCvSharp/BlobTool/BlobToolEdit.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LB_VisionProcesses/Alogrithms/OpenCvSharp/FindLineTool/FindLineToolEdit.cs 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LB_VisionProcesses/Alogrithms/OpenCvSharp/FindModelTool/FindModelToolEdit.cs 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LB_SmartVision/ProcessRun/ProcessContext.cs
@@ -301,7 +301,7 @@
            return res;
        }
        public bool GetImage(Layout layout, out HObject InputImage, out HObject RecordImage)
        public bool GetImage(Layout layout, out HImage InputImage, out HObject RecordImage)
        {
            InputImage = null; RecordImage = null;
            try
@@ -329,19 +329,23 @@
                    IndexValueName = arrOutputs[2];
                    object o_InputImage = ((IProcess)dicContext[IndexProcessName]).OutputImage;
                    if (o_InputImage is HObject ho_image && ho_image.IsInitialized())
                    if (o_InputImage is HImage ho_image && ho_image.IsInitialized())
                        InputImage = ho_image;
                    else if (o_InputImage is Bitmap)
                    {
                        //将Mat转换为HObject
                        TAlgorithm.Bitmap2HObject((Bitmap)o_InputImage, out HObject ho_RecordImage);
                        InputImage = ho_RecordImage;
                        using (HImage ho_RecordImage = TAlgorithm.Bitmap2HObject((Bitmap)o_InputImage))
                        {
                            InputImage = ho_RecordImage.Clone();
                        }
                    }
                    else if (o_InputImage is Mat)
                    {
                        //将Mat转换为HObject
                        TAlgorithm.Mat2HObject((Mat)o_InputImage, out HObject ho_RecordImage);
                        InputImage = ho_RecordImage;
                        using (HImage ho_RecordImage = TAlgorithm.Mat2HObject((Mat)o_InputImage))
                        {
                            InputImage = ho_RecordImage.Clone();
                        }
                    }
                    if (InputImage != null && InputImage.IsInitialized())
LB_SmartVision/ProcessRun/ProcessRunBll.cs
@@ -121,12 +121,12 @@
        /// </summary>
        public double RunTime = 0;
        public bool GetImage(Forms.Pages.SettingPage.Layout layout, out HObject InputImage, out HObject RecordImage)
        public bool GetImage(Forms.Pages.SettingPage.Layout layout, out HImage InputImage, out HObject RecordImage)
        {
            return ProcessContext.GetImage(layout, out InputImage, out RecordImage);
        }
        public bool GetImage(out HObject InputImage, out HObject RecordImage)
        public bool GetImage(out HImage InputImage, out HObject RecordImage)
        {
            InputImage = null;
            RecordImage = null;
LB_SmartVision/VisionForm.cs
@@ -1437,7 +1437,7 @@
                        catch { }
                    }
                    // 生成图片并显示到控件中
                    HObject InputImage = null;
                    HImage InputImage = null;
                    HObject RecordImage = null;
                    foreach (var layout in GlobalVar.dicLayout.Values
LB_VisionProcesses/Alogrithms/BaseAlgorithm/TAlgorithm.cs
@@ -64,7 +64,7 @@
                {
                    if (InputImage is Bitmap)
                    {
                        TAlgorithm.Bitmap2Mat((Bitmap)InputImage, out Mat src);
                        Bitmap2Mat((Bitmap)InputImage, out Mat src);
                        if (Params.Fixture == null)
                            Params.Fixture = new Fixture();
@@ -96,7 +96,7 @@
                                // 4. 创建与原图大小相同的Mat,并初始化无效值
                                image = new Mat(src.Size(), src.Type());
                                ((Mat)image).SetTo(TAlgorithm.GetInvalidValueForMat(src)); // 全部初始化为无效值
                                ((Mat)image).SetTo(GetInvalidValueForMat(src)); // 全部初始化为无效值
                                // 5. 创建遮罩:在result上绘制旋转矩形(白色填充)
                                using (Mat cropped = new Mat(src, boundingRect))
@@ -113,7 +113,7 @@
                                // 2. 创建与原图大小相同的Mat,并初始化无效值
                                image = new Mat(src.Size(), src.Type());
                                ((Mat)image).SetTo(TAlgorithm.GetInvalidValueForMat(src)); // 全部初始化为无效值
                                ((Mat)image).SetTo(GetInvalidValueForMat(src)); // 全部初始化为无效值
                                // 3. 创建圆形遮罩
                                using (Mat mask = Mat.Zeros(src.Rows, src.Cols, MatType.CV_8UC1))
@@ -127,7 +127,7 @@
                                image = ((Bitmap)InputImage)?.Clone();
                                return true;
                        }
                        TAlgorithm.Mat2Bitmap((Mat)image, out Bitmap bmp);
                        Mat2Bitmap((Mat)image, out Bitmap bmp);
                        image = bmp;
                        return true;
                    }
@@ -193,7 +193,7 @@
                                // 4. 创建与原图大小相同的Mat,并初始化无效值
                                image = new Mat(src.Size(), src.Type());
                                ((Mat)image).SetTo(TAlgorithm.GetInvalidValueForMat(src)); // 全部初始化为无效值
                                ((Mat)image).SetTo(GetInvalidValueForMat(src)); // 全部初始化为无效值
                                // 5. 创建遮罩:在result上绘制旋转矩形(白色填充)
                                using (Mat cropped = new Mat(src, boundingRect))
@@ -210,7 +210,7 @@
                                // 2. 创建与原图大小相同的Mat,并初始化无效值
                                image = new Mat(src.Size(), src.Type());
                                ((Mat)image).SetTo(TAlgorithm.GetInvalidValueForMat(src)); // 全部初始化为无效值
                                ((Mat)image).SetTo(GetInvalidValueForMat(src)); // 全部初始化为无效值
                                // 3. 创建圆形遮罩
                                using (Mat mask = Mat.Zeros(src.Rows, src.Cols, MatType.CV_8UC1))
@@ -249,27 +249,36 @@
            if (InputImage != null)
            {
                if (InputImage is HObject)
                {
                    ((HObject)InputImage).Dispose();
                }
                else if (InputImage is Mat)
                {
                    ((Mat)InputImage).Dispose();
                }
                else if (InputImage is Bitmap)
                {
                    ((Bitmap)InputImage).Dispose();
                }
                InputImage = null;
            }
            if (OutputImage != null)
            {
                if (OutputImage is HObject)
                {
                    ((HObject)OutputImage).Dispose();
                }
                else if (OutputImage is Mat)
                {
                    ((Mat)OutputImage).Dispose();
                }
                else if (OutputImage is Bitmap)
                {
                    ((Bitmap)OutputImage).Dispose();
                }
                OutputImage = null;
            }
            if (Record != null)
            {
                Record.Dispose();
@@ -287,13 +296,18 @@
                if (InputImage != null)
                {
                    if (InputImage is HObject ho_image && ho_image.IsInitialized())
                    {
                        obj.InputImage = ho_image.CopyObj(1, -1);
                    }
                    else if (InputImage is Mat mat && !mat.Empty())
                    {
                        obj.InputImage = mat.Clone();
                    }
                    else if (InputImage is Bitmap bitmap)
                    {
                        obj.InputImage = bitmap.Clone();
                }
                }
                return obj;
            }
            catch { return (TAlgorithm)MemberwiseClone(); }
@@ -303,17 +317,32 @@
        {
            Result = true;
            bCompleted = false;
            Msg = "";
            OutputImage = null;
            Msg = string.Empty;
            if (InputImage != null)
            {
                if (InputImage is HObject)
                {
                    ((HObject)InputImage).Dispose();
                }
                else if (InputImage is Mat)
                {
                    ((Mat)InputImage).Dispose();
                }
                else if (InputImage is Bitmap)
                {
                    ((Bitmap)InputImage).Dispose();
                }
                InputImage = null;
            }
            if (Record != null)
            {
                Record.Dispose();
            }
        }
        public override bool Run()
        {
            DateTime StartTime = DateTime.Now;
            InitRunParams();
            HOperatorSet.GenEmptyObj(out HObject EmptyObj);
            OutputImage = EmptyObj;
@@ -331,7 +360,6 @@
                Thread.Sleep(30);
            }
            Msg = "运行超时";
            Result = false;
            RunTime = (DateTime.Now - StartTime).TotalMilliseconds;
@@ -357,8 +385,9 @@
            try
            {
                if (string.IsNullOrEmpty(fullPath))
                {
                    return false;
                }
                if (!fullPath.Contains(".json"))
                {
                    Debug.WriteLine("文件路径不完整");
@@ -369,7 +398,6 @@
                    Debug.WriteLine("文件路径不完整");
                    return false;
                }
                // 获取不带文件名的目录路径
                string directoryPath = Path.GetDirectoryName(fullPath);
                strProcessName = Path.GetFileNameWithoutExtension(fullPath);
@@ -380,7 +408,6 @@
                    Save(directoryPath);
                    return true;
                }
                string strJson = string.Empty;
                using (StreamReader streamReader = new StreamReader(fullPath, Encoding.UTF8))
                {
@@ -389,8 +416,9 @@
                }
                Params = JsonConvert.DeserializeObject<ProcessParams>(strJson);
                if (Params == null)
                {
                    return false;
                }
                Params.FixDeserializedData();
                return true;
            }
@@ -453,20 +481,21 @@
                return value;
        }
        public static void Bitmap2HObject(Bitmap bmp, out HObject image)
        public static HImage Bitmap2HObject(Bitmap bmp)
        {
            BitmapData srcBmpData;
            HImage image = null;
            try
            {
                if (bmp == null || bmp.Width == 0 || bmp.Height == 0)
                {
                    image = null;
                    return;
                    return image;
                }
                lock (bmp)
                {
                    image = new HImage();
                    switch (bmp.PixelFormat)
                    {
                        case PixelFormat.Format24bppRgb:
@@ -475,35 +504,41 @@
                            int width = bmp.Width;
                            int height = bmp.Height;
                            int stride = srcBmpData.Stride;
                            if (stride == width * 3)
                                HOperatorSet.GenImageInterleaved(out image, srcBmpData.Scan0, "bgr", bmp.Width, bmp.Height, 0, "byte", 0, 0, 0, 0, -1, 0);
                            {
                                image.GenImageInterleaved(srcBmpData.Scan0, "bgr", bmp.Width, bmp.Height, 0, "byte", 0, 0, 0, 0, -1, 0);
                            }
                            else
                            {
                                image = HandleStrideAlignmentBest(srcBmpData.Scan0, width, height, stride);
                            }
                            bmp.UnlockBits(srcBmpData);
                            break;
                        default:
                            srcBmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);
                            HOperatorSet.GenImage1(out image, "byte", bmp.Width, bmp.Height, srcBmpData.Scan0);
                            image.GenImage1("byte", bmp.Width, bmp.Height, srcBmpData.Scan0);
                            bmp.UnlockBits(srcBmpData);
                            break;
                    }
                }
                return;
                return image;
            }
            catch
            {
                if (image != null)
                {
                    image.Dispose();
                }
                image = null;
                return;
                return image;
            }
        }
        private static HObject HandleStrideAlignmentBest(IntPtr scan0, int width, int height, int stride)
        private static HImage HandleStrideAlignmentBest(IntPtr scan0, int width, int height, int stride)
        {
            int expectedStride = width * 3;
            byte[] alignedData = new byte[width * height * 3];
            HImage image = new HImage();
            unsafe
            {
                byte* srcPtr = (byte*)scan0;
@@ -521,31 +556,31 @@
                            expectedStride
                        );
                    }
                    HOperatorSet.GenImageInterleaved(out HObject ho_img, new IntPtr(dstPtr), "bgr", width, height, 0, "byte", width, height, 0, 0, -1, 0);
                    return ho_img;
                    image.GenImageInterleaved(new IntPtr(dstPtr), "bgr", width, height, 0, "byte", width, height, 0, 0, -1, 0);
                    return image;
                }
            }
        }
        public static unsafe void HObject2Bitmap(HObject hObject, out Bitmap bmp)
        public static unsafe void HObject2Bitmap(HImage hImage, out Bitmap bmp)
        {
            try
            {
                if (hObject == null || !hObject.IsInitialized())
                if (hImage == null || !hImage.IsInitialized())
                {
                    bmp = null;
                    return;
                }
                // 获取图像信息
                HOperatorSet.GetImageSize(hObject, out HTuple width, out HTuple height);
                HOperatorSet.CountChannels(hObject, out HTuple channels);
                hImage.GetImageSize(out HTuple width, out HTuple height);
                HTuple channels = hImage.CountChannels();
                if (channels.I == 1)
                {
                    // 灰度图处理
                    HTuple ptr, type;
                    HOperatorSet.GetImagePointer1(hObject, out ptr, out type, out width, out height);
                    ptr = hImage.GetImagePointer1(out type, out width, out height);
                    bmp = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
@@ -574,7 +609,7 @@
                {
                    // 彩色图处理(BGR顺序)
                    HTuple ptrR, ptrG, ptrB, type;
                    HOperatorSet.GetImagePointer3(hObject, out ptrR, out ptrG, out ptrB, out type, out width, out height);
                    hImage.GetImagePointer3(out ptrR, out ptrG, out ptrB, out type, out width, out height);
                    bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);
                    BitmapData bmpData = bmp.LockBits(
@@ -611,20 +646,20 @@
            }
        }
        public static void Mat2HObject(Mat mat, out HObject image)
        public static HImage Mat2HObject(Mat mat)
        {
            HImage image = null;
            try
            {
                if (mat == null || mat.Empty())
                {
                    image = null;
                    return;
                    return image;
                }
                if (mat.Type() == MatType.CV_8UC3) // 彩色图像 (BGR)
                {
                    HOperatorSet.GenImageInterleaved(
                        out image,
                    image = new HImage();
                    image.GenImageInterleaved(
                        mat.Data,
                        "bgr",
                        mat.Width,
@@ -635,8 +670,8 @@
                }
                else if (mat.Type() == MatType.CV_8UC1) // 灰度图像
                {
                    HOperatorSet.GenImage1(
                        out image,
                    image = new HImage();
                    image.GenImage1(
                        "byte",
                        mat.Width,
                        mat.Height,
@@ -646,12 +681,12 @@
                {
                    throw new ArgumentException($"Mat2HObject不支持的图像格式:{mat.Type()}");
                }
                return;
                return image;
            }
            catch
            {
                image = null;
                return;
                return image;
            }
        }
@@ -1251,7 +1286,7 @@
        /// <param name="startPoint"></param>
        /// <param name="endPoint"></param>
        /// <returns></returns>
        public static double GetDistanceP2P(HPoint startPoint, HPoint endPoint)
        public double GetDistanceP2P(HPoint startPoint, HPoint endPoint)
        {
            try
            {
@@ -1260,12 +1295,12 @@
            catch { return 9994; }
        }
        public static double GetDistanceP2P(Point startPoint, Point endPoint)
        public double GetDistanceP2P(Point startPoint, Point endPoint)
        {
            return GetDistanceP2P(new HPoint(startPoint), new HPoint(endPoint));
        }
        public static double DistanceP2P(double startX, double startY, double endX, double endY)
        public double DistanceP2P(double startX, double startY, double endX, double endY)
        {
            return GetDistanceP2P(new HPoint(startX, startY), new HPoint(endX, endY));
        }
@@ -1276,17 +1311,17 @@
        /// <param name="startPoint"></param>
        /// <param name="endPoint"></param>
        /// <returns></returns>
        public static HPoint GetMidPoint(HPoint startPoint, HPoint endPoint)
        public HPoint GetMidPoint(HPoint startPoint, HPoint endPoint)
        {
            return new HPoint((startPoint.X + endPoint.X) / 2, (startPoint.Y + endPoint.Y) / 2);
        }
        public static Point GetMidPoint(Point startPoint, Point endPoint)
        public Point GetMidPoint(Point startPoint, Point endPoint)
        {
            return new Point((startPoint.X + endPoint.X) / 2, (startPoint.Y + endPoint.Y) / 2);
        }
        public static System.Drawing.Point GetMidPoint(System.Drawing.Point startPoint, System.Drawing.Point endPoint)
        public System.Drawing.Point GetMidPoint(System.Drawing.Point startPoint, System.Drawing.Point endPoint)
        {
            return new System.Drawing.Point((startPoint.X + endPoint.X) / 2, (startPoint.Y + endPoint.Y) / 2);
        }
@@ -1297,7 +1332,7 @@
        /// <param name="point"></param>
        /// <param name="segment"></param>
        /// <returns></returns>
        public static bool IsPointOnSegment(HPoint pt, HSegment segment, double tolerance = 1e-3)
        public bool IsPointOnSegment(HPoint pt, HSegment segment, double tolerance = 1e-3)
        {
            // 计算直线方程的系数
            double A = segment.EndY - segment.StartX;
@@ -1320,7 +1355,7 @@
            return false;
        }
        public static bool IsPointOnSegment(double px, double py, double x1, double y1, double x2, double y2)
        public bool IsPointOnSegment(double px, double py, double x1, double y1, double x2, double y2)
        {
            return IsPointOnSegment(new HPoint(px, py), new HSegment(x1, y1, x2, y2));
        }
@@ -1345,7 +1380,7 @@
            catch { return false; }
        }
        public static bool IsPointNearRectangleSilde(HPoint pt, HRectangle2 rect, double tolerance = 100)
        public bool IsPointNearRectangleSilde(HPoint pt, HRectangle2 rect, double tolerance = 100)
        {
            return IsPointNearRectangleSilde(new System.Drawing.Point((int)pt.X, (int)pt.Y), new Rectangle((int)rect.X, (int)rect.Y, (int)rect.Width, (int)rect.Height), tolerance);
        }
@@ -1357,21 +1392,21 @@
        /// <param name="pt2"></param>
        /// <param name="tolerance"></param>
        /// <returns></returns>
        public static bool IsPointNearPoint(HPoint pt1, HPoint pt2, double tolerance = 100)
        public bool IsPointNearPoint(HPoint pt1, HPoint pt2, double tolerance = 100)
        {
            if (GetDistanceP2P(pt1, pt2) <= tolerance)
                return true;
            return false;
        }
        public static bool IsPointNearPoint(Point pt1, Point pt2, double tolerance = 100)
        public bool IsPointNearPoint(Point pt1, Point pt2, double tolerance = 100)
        {
            if (GetDistanceP2P(pt1, pt2) <= tolerance)
                return true;
            return false;
        }
        public static bool IsPointNearPoint(double x1, double y1, double x2, double y2, int tolerance = 100)
        public bool IsPointNearPoint(double x1, double y1, double x2, double y2, int tolerance = 100)
        {
            return IsPointNearPoint(new HPoint(x1, y1), new HPoint(x2, y2), tolerance);
        }
@@ -1384,7 +1419,7 @@
        /// <param name="corner"></param>
        /// <param name="tolerance"></param>
        /// <returns></returns>
        public static bool IsPointNearRectangleCorner(Point pt, Rectangle rect, out string corner, double tolerance = 10)
        public bool IsPointNearRectangleCorner(Point pt, Rectangle rect, out string corner, double tolerance = 10)
        {
            try
            {
@@ -1423,7 +1458,7 @@
            catch { corner = ""; return false; }
        }
        public static bool IsPointNearRectangleCorner(HPoint pt, HRectangle2 rect, out string corner, double tolerance = 10)
        public bool IsPointNearRectangleCorner(HPoint pt, HRectangle2 rect, out string corner, double tolerance = 10)
        {
            try
            {
@@ -1471,7 +1506,7 @@
        /// <param name="p3">线2起始点</param>
        /// <param name="p4"></param>
        /// <returns></returns>
        public static Point2d? GetLineIntersection(Point2d p1, Point2d p2, Point2d p3, Point2d p4, bool bOnSegment = false)
        public Point2d? GetLineIntersection(Point2d p1, Point2d p2, Point2d p3, Point2d p4, bool bOnSegment = false)
        {
            // 直线1的向量
            double x1 = p1.X, y1 = p1.Y;
@@ -1508,7 +1543,7 @@
        #region Halcon
        // Chapter: Graphics / Output
        // Short Description: Display 3D object models 
        public static void visualize_object_model_3d(HTuple hv_WindowHandle, HTuple hv_ObjectModel3D,
        public void visualize_object_model_3d(HTuple hv_WindowHandle, HTuple hv_ObjectModel3D,
            HTuple hv_CamParam, HTuple hv_PoseIn, HTuple hv_GenParamName, HTuple hv_GenParamValue,
            HTuple hv_Title, HTuple hv_Label, HTuple hv_Information, out HTuple hv_PoseOut)
        {
@@ -3236,7 +3271,7 @@
        // Chapter: Calibration / Camera Parameters
        // Short Description: Set the value of a specified camera parameter in the camera parameter tuple. 
        public static void set_cam_par_data(HTuple hv_CameraParamIn, HTuple hv_ParamName, HTuple hv_ParamValue,
        public void set_cam_par_data(HTuple hv_CameraParamIn, HTuple hv_ParamName, HTuple hv_ParamValue,
            out HTuple hv_CameraParamOut)
        {
            // Local iconic variables 
@@ -3340,7 +3375,7 @@
            }
        }
        public static void gen_arrow_contour_xld(out HObject ho_Arrow, HTuple hv_Row1, HTuple hv_Column1,
        public void gen_arrow_contour_xld(out HObject ho_Arrow, HTuple hv_Row1, HTuple hv_Column1,
            HTuple hv_Row2, HTuple hv_Column2, HTuple hv_HeadLength, HTuple hv_HeadWidth)
        {
            // Stack for temporary objects 
@@ -3514,7 +3549,7 @@
            }
        }
        public static void get_rect2_vertex(HTuple hv_Row, HTuple hv_Column, HTuple hv_Phi, HTuple hv_Length1,
        public void get_rect2_vertex(HTuple hv_Row, HTuple hv_Column, HTuple hv_Phi, HTuple hv_Length1,
            HTuple hv_Length2, out HTuple hv_TopLeft_Row, out HTuple hv_TopLeft_Col, out HTuple hv_TopRight_Row,
            out HTuple hv_TopRight_Col, out HTuple hv_LowLeft_Row, out HTuple hv_LowLeft_Col,
            out HTuple hv_LowRight_Row, out HTuple hv_LowRight_Col)
@@ -3721,7 +3756,7 @@
            }
        }
        public static void pts_to_best_line(out HObject ho_LineXld, HTuple hv_Rows, HTuple hv_Columns,
        public void pts_to_best_line(out HObject ho_LineXld, HTuple hv_Rows, HTuple hv_Columns,
            HTuple hv_IgnoreNum, out HTuple hv_Row1, out HTuple hv_Column1, out HTuple hv_Row2,
            out HTuple hv_Column2)
        {
@@ -3807,7 +3842,7 @@
            }
        }
        public static (double, double) CalculateTailValues(HTuple minValue, HTuple maxValue, HTuple mean, HTuple deviation, double tailPercentage = 0.3)
        public (double, double) CalculateTailValues(HTuple minValue, HTuple maxValue, HTuple mean, HTuple deviation, double tailPercentage = 0.3)
        {
            // 计算低尾灰度值
            double lowTailValue = minValue.TupleReal() + (mean.TupleReal() - minValue.TupleReal()) * tailPercentage;
@@ -3840,7 +3875,7 @@
        /// <param name="hv_Column2">结束横坐标</param>
        /// <param name="hv_ResultRow">结果点集合纵坐标</param>
        /// <param name="hv_ResultColumn">结果点集合横坐标</param>
        public static void Rake(HObject ho_Image, out HObject ho_Regions, HTuple hv_Elements,
        public void Rake(HObject ho_Image, out HObject ho_Regions, HTuple hv_Elements,
            HTuple hv_DetectHeight, HTuple hv_DetectWidth, HTuple hv_Sigma, HTuple hv_Threshold,
            HTuple hv_Transition, HTuple hv_Select, HTuple hv_Row1, HTuple hv_Column1, HTuple hv_Row2,
            HTuple hv_Column2, out HTuple hv_ResultRow, out HTuple hv_ResultColumn)
@@ -5036,7 +5071,7 @@
            catch { }
        }
        public static void scale_gray_map(HObject ho_Image, out HObject ho_Image1, HTuple hv_Min, HTuple hv_Max)
        public void scale_gray_map(HObject ho_Image, out HObject ho_Image1, HTuple hv_Min, HTuple hv_Max)
        {
            HTuple hv_Mult = new HTuple(), hv_Add = new HTuple();
            HOperatorSet.GenEmptyObj(out ho_Image1);
@@ -5123,7 +5158,7 @@
        #region OpenCVSharp
        // 根据Mat类型返回对应的无效值
        public static Scalar GetInvalidValueForMat(Mat mat)
        public Scalar GetInvalidValueForMat(Mat mat)
        {
            MatType type = mat.Type();
            if (type == MatType.CV_8UC1 || type == MatType.CV_8UC3)
@@ -5136,7 +5171,7 @@
                return new Scalar(0); // 对于8位无符号类型,0是安全的无效值
        }
        public static void RGB2XYZ(double sR, double sG, double sB, out double X, out double Y, out double Z)
        public void RGB2XYZ(double sR, double sG, double sB, out double X, out double Y, out double Z)
        {
            // 输入的颜色值 (sR, sG, sB) 应为 0 到 255 之间的值
@@ -5167,7 +5202,7 @@
            Z = Math.Round(var_Z / (var_X + var_Y + var_Z), 3);
        }
        public static void ExtractFrames(string videoPath, string outputDir)
        public void ExtractFrames(string videoPath, string outputDir)
        {
            // 检查视频文件是否存在
            if (!File.Exists(videoPath))
LB_VisionProcesses/Alogrithms/BaseAlgorithm/TAlgorithmEdit.cs
@@ -53,30 +53,39 @@
            get
            {
                if (Subject == null)
                {
                    return null;
                }
                return Subject.InputImage;
            }
            set
            {
                Subject.InputImage = value;
                if (InputImage == null)
                {
                    return;
                }
                if (InputImage is HObject)
                {
                    inputImageHSmartWindowControl.ShowHoImage((HObject)value);
                }
                else if (InputImage is Bitmap)
                {
                    TAlgorithm.Bitmap2HObject((Bitmap)value, out HObject image);
                    using (HImage image = TAlgorithm.Bitmap2HObject((Bitmap)value))
                    {
                    inputImageHSmartWindowControl.ShowHoImage(image);
                    }
                }
                else if (InputImage is Mat)
                {
                    TAlgorithm.Mat2HObject((Mat)value, out HObject image);
                    using (HImage image = TAlgorithm.Mat2HObject((Mat)value))
                    {
                    inputImageHSmartWindowControl.ShowHoImage(image);
                }
            }
        }
        }
        public TAlgorithmEdit() { }
LB_VisionProcesses/Alogrithms/BaseAlgorithm/TestTool/TestToolEdit.cs
@@ -179,18 +179,23 @@
                {
                    if (Subject.OutputImage is Mat)
                    {
                        TAlgorithm.Mat2HObject((Mat)Subject.OutputImage, out HObject image);
                        using (HImage image = TAlgorithm.Mat2HObject((Mat)Subject.OutputImage))
                        {
                        recordImageHSmartWindowControl.ShowHoImage(image);
                        }
                    }
                    else if (Subject.OutputImage is Bitmap)
                    {
                        TAlgorithm.Bitmap2HObject((Bitmap)Subject.OutputImage, out HObject image);
                        using (HImage image = TAlgorithm.Bitmap2HObject((Bitmap)Subject.OutputImage))
                        {
                        recordImageHSmartWindowControl.ShowHoImage(image);
                    }
                    }
                    else if (Subject.OutputImage is HObject)
                    {
                        recordImageHSmartWindowControl.ShowHoImage((HObject)Subject.OutputImage);
                }
                }
                //先判断子类再判断父类
                if (Subject.Record != null && Subject.Record is MsgRecord msgRecord)
                {
@@ -198,15 +203,16 @@
                    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();
            }));
        }
LB_VisionProcesses/Alogrithms/Halcon/2D/HBlobTool/HBlobTool.cs
@@ -89,12 +89,15 @@
                            BitmapData srcBmpData = ((Bitmap)InputImage).LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb);
                            hImage.GenImageInterleaved(srcBmpData.Scan0, "rgbx", ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height, 0, "byte", ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height, 0, 0, -1, 0);
                            ((Bitmap)InputImage).UnlockBits(srcBmpData);
                            InputImage = null;
                            ((Bitmap)InputImage).Dispose();
                            InputImage = hImage.Clone();
                        }
                    }
                    catch (Exception ex)
                    {
                        Msg = "转图出错:" + ex.Message;
                        Result = false;
                        return;
                    }
                }
                if (!(InputImage is HObject))
LB_VisionProcesses/Alogrithms/Halcon/2D/HFindCode2dTool/HFindCode2dTool.cs
@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -64,6 +65,27 @@
                        Result = false;
                        return;
                    }
                    if (InputImage is Bitmap)
                    {
                        try
                        {
                            using (HImage hImage = new HImage())
                            {
                                Rectangle rect = new Rectangle(0, 0, ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height);
                                BitmapData srcBmpData = ((Bitmap)InputImage).LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb);
                                hImage.GenImageInterleaved(srcBmpData.Scan0, "rgbx", ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height, 0, "byte", ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height, 0, 0, -1, 0);
                                ((Bitmap)InputImage).UnlockBits(srcBmpData);
                                ((Bitmap)InputImage).Dispose();
                                InputImage = hImage.Clone();
                            }
                        }
                        catch (Exception ex)
                        {
                            Msg = "转图出错:" + ex.Message;
                            Result = false;
                            return;
                        }
                    }
                    if (!(InputImage is HObject))
                    {
                        Msg = "输入图片格式不为Mat";
LB_VisionProcesses/Alogrithms/Halcon/2D/HFindLineTool/HFindLineTool.cs
@@ -3,6 +3,7 @@
using LB_VisionProcesses.Alogrithms.Halcon;
using System;
using System.Collections.Generic;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -61,7 +62,33 @@
                    Result = false;
                    return;
                }
                if (InputImage is Bitmap)
                {
                    try
                    {
                        using (HImage hImage = new HImage())
                        {
                            Rectangle rect = new Rectangle(0, 0, ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height);
                            BitmapData srcBmpData = ((Bitmap)InputImage).LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb);
                            hImage.GenImageInterleaved(srcBmpData.Scan0, "rgbx", ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height, 0, "byte", ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height, 0, 0, -1, 0);
                            ((Bitmap)InputImage).UnlockBits(srcBmpData);
                            ((Bitmap)InputImage).Dispose();
                            InputImage = hImage.Clone();
                        }
                    }
                    catch (Exception ex)
                    {
                        Msg = "转图出错:" + ex.Message;
                        Result = false;
                        return;
                    }
                }
                if (!(InputImage is HObject))
                {
                    Msg = "输入图片格式不为Mat";
                    Result = false;
                    return;
                }
                #region 裁剪区域
                if (!(Params.ROI is HSegment))
                {
LB_VisionProcesses/Alogrithms/Halcon/2D/HFindModelTool/HFindModelTool.cs
@@ -5,6 +5,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -93,6 +94,27 @@
                        Result = false;
                        return;
                    }
                    if (InputImage is Bitmap)
                    {
                        try
                        {
                            using (HImage hImage = new HImage())
                            {
                                Rectangle rect = new Rectangle(0, 0, ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height);
                                BitmapData srcBmpData = ((Bitmap)InputImage).LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb);
                                hImage.GenImageInterleaved(srcBmpData.Scan0, "rgbx", ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height, 0, "byte", ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height, 0, 0, -1, 0);
                                ((Bitmap)InputImage).UnlockBits(srcBmpData);
                                ((Bitmap)InputImage).Dispose();
                                InputImage = hImage.Clone();
                            }
                        }
                        catch (Exception ex)
                        {
                            Msg = "转图出错:" + ex.Message;
                            Result = false;
                            return;
                        }
                    }
                    if (!(InputImage is HObject))
                    {
                        Msg = "输入图片格式不为HObject";
LB_VisionProcesses/Alogrithms/Halcon/2D/HFindMultiModelTool/HFindMultiModelTool.cs
@@ -5,6 +5,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -88,6 +89,27 @@
                        Result = false;
                        return;
                    }
                    if (InputImage is Bitmap)
                    {
                        try
                        {
                            using (HImage hImage = new HImage())
                            {
                                Rectangle rect = new Rectangle(0, 0, ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height);
                                BitmapData srcBmpData = ((Bitmap)InputImage).LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb);
                                hImage.GenImageInterleaved(srcBmpData.Scan0, "rgbx", ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height, 0, "byte", ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height, 0, 0, -1, 0);
                                ((Bitmap)InputImage).UnlockBits(srcBmpData);
                                ((Bitmap)InputImage).Dispose();
                                InputImage = hImage.Clone();
                            }
                        }
                        catch (Exception ex)
                        {
                            Msg = "转图出错:"+ ex.Message;
                            Result = false;
                            return;
                        }
                    }
                    if (!(InputImage is HObject))
                    {
                        Msg = "输入图片格式不为Mat";
LB_VisionProcesses/Alogrithms/OpenCvSharp/BlobTool/BlobToolEdit.cs
@@ -120,10 +120,11 @@
                if (Subject.InputImage != null && Subject.InputImage is Mat)
                {
                    TAlgorithm.Mat2HObject((Mat)Subject.InputImage, out HObject image);
                    using (HImage image = TAlgorithm.Mat2HObject((Mat)Subject.InputImage))
                    {
                    inputImageHSmartWindowControl.ShowHoImage(image);
                }
                }
                Type type = Subject.Params.ROI?.GetType();
                if (Subject.Params.ROI != null)
                {
@@ -215,9 +216,11 @@
                if (Subject.InputImage != null && Subject.InputImage is Mat)
                {
                    TAlgorithm.Mat2HObject((Mat)Subject.InputImage, out HObject image);
                    using (HImage image = TAlgorithm.Mat2HObject((Mat)Subject.InputImage))
                    {
                    HOperatorSet.GetImageSize(image, out HTuple ho_ImageWidth, out HTuple ho_ImageHeight);
                    recordImageHSmartWindowControl.ShowHoImage(image);
                    }
                }
                //先判断子类再判断父类
@@ -225,10 +228,11 @@
                {
                    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)
                {
@@ -302,9 +306,9 @@
                    HTuple hv_imageHeight = 0;
                    if (InputImage != null && InputImage is Mat)
                    {
                        TAlgorithm.Mat2HObject((Mat)InputImage, out HObject image);
                        HOperatorSet.GetImageSize(image, out hv_imageWidth, out hv_imageHeight);
                    }
                        using (HImage image = TAlgorithm.Mat2HObject((Mat)InputImage))
                        {
                            image.GetImageSize(out hv_imageWidth, out hv_imageHeight);
                    switch (type)
                    {
                        case RoiType.Rectangle2:
@@ -331,6 +335,8 @@
                    }
                }
            }
                }
            }
            catch { }
        }
LB_VisionProcesses/Alogrithms/OpenCvSharp/FindLineTool/FindLineToolEdit.cs
@@ -144,10 +144,9 @@
                if (Subject.InputImage != null && Subject.InputImage is Mat)
                {
                    TAlgorithm.Mat2HObject((Mat)Subject.InputImage, out HObject image);
                    using (HImage image = TAlgorithm.Mat2HObject((Mat)Subject.InputImage))
                    {
                    inputImageHSmartWindowControl.ShowHoImage(image);
                }
                Type type = Subject.Params.ROI?.GetType();
                if (Subject.Params.ROI != null)
                {
@@ -199,6 +198,8 @@
                    default:
                        inputImageHSmartWindowControl.oRoi = null;
                        break;
                        }
                    }
                }
            }));
        }
@@ -258,11 +259,10 @@
                if (Subject.InputImage != null && Subject.InputImage is Mat)
                {
                    TAlgorithm.Mat2HObject((Mat)Subject.InputImage, out HObject image);
                    HOperatorSet.GetImageSize(image, out HTuple ho_ImageWidth, out HTuple ho_ImageHeight);
                    using (HImage image = TAlgorithm.Mat2HObject((Mat)Subject.InputImage))
                    {
                        image.GetImageSize(out HTuple ho_ImageWidth, out HTuple ho_ImageHeight);
                    recordImageHSmartWindowControl.ShowHoImage(image);
                }
                //先判断子类再判断父类
                if (Subject.Record != null && Subject.Record is MsgRecord msgRecord)
                {
@@ -278,7 +278,8 @@
                    recordImageHSmartWindowControl.DispObj(objRecord.RecordObject_OK, true);
                    recordImageHSmartWindowControl.DispObj(objRecord.RecordObject_NG, false);
                }
                    }
                }
                GC.Collect();
            }));
        }
@@ -345,9 +346,9 @@
                    HTuple hv_imageHeight = 0;
                    if (InputImage != null && InputImage is Mat)
                    {
                        TAlgorithm.Mat2HObject((Mat)InputImage, out HObject image);
                        HOperatorSet.GetImageSize(image, out hv_imageWidth, out hv_imageHeight);
                    }
                        using (HImage image=TAlgorithm.Mat2HObject((Mat)InputImage))
                        {
                            image.GetImageSize(out hv_imageWidth, out hv_imageHeight);
                    switch (type)
                    {
                        case RoiType.Rectangle2:
@@ -367,6 +368,8 @@
                        default:
                            inputImageHSmartWindowControl.oRoi = null;
                            break;
                            }
                        }
                    }
                }
            }
@@ -397,10 +400,9 @@
                    if (InputImage != null && InputImage is Mat)
                    {
                        TAlgorithm.Mat2HObject((Mat)InputImage, out HObject image);
                        using (HImage image = TAlgorithm.Mat2HObject((Mat)InputImage))
                        {
                        inputImageHSmartWindowControl.ShowHoImage(image);
                    }
                    int hv_Elements = Convert.ToInt16(itxtCaliperCount.Text);
                    double hv_DetectHeight = Convert.ToDouble(dtxtCaliperHeight.Text);
                    double hv_DetectWidth = Convert.ToDouble(dtxtCaliperWidth.Text);
@@ -417,6 +419,8 @@
                    inputImageHSmartWindowControl.DispObj(ho_Regions);
                }
                    }
                }
                catch { }
            }));
        }
LB_VisionProcesses/Alogrithms/OpenCvSharp/FindModelTool/FindModelToolEdit.cs
@@ -241,10 +241,9 @@
                if (Subject.InputImage != null && Subject.InputImage is Mat)
                {
                    TAlgorithm.Mat2HObject((Mat)Subject.InputImage, out HObject image);
                    using (HImage image = TAlgorithm.Mat2HObject((Mat)Subject.InputImage))
                    {
                    inputImageHSmartWindowControl.ShowHoImage(image);
                }
                Type type = Subject.Params.ROI?.GetType();
                if (Subject.Params.ROI != null)
                {
@@ -299,6 +298,9 @@
                }
                ShowModel(((FindModelTool)Subject).ModelID);
                    }
                }
            }));
        }
@@ -357,11 +359,10 @@
                if (Subject.InputImage != null && Subject.InputImage is Mat)
                {
                    TAlgorithm.Mat2HObject((Mat)Subject.InputImage, out HObject image);
                    HOperatorSet.GetImageSize(image, out HTuple ho_ImageWidth, out HTuple ho_ImageHeight);
                    using (HImage image = TAlgorithm.Mat2HObject((Mat)Subject.InputImage))
                    {
                        image.GetImageSize(out HTuple ho_ImageWidth, out HTuple ho_ImageHeight);
                    recordImageHSmartWindowControl.ShowHoImage(image);
                }
                //先判断子类再判断父类
                if (Subject.Record != null && Subject.Record is MsgRecord msgRecord)
                {
@@ -376,6 +377,9 @@
                {
                    recordImageHSmartWindowControl.DispObj(objRecord.RecordObject_OK, true);
                    recordImageHSmartWindowControl.DispObj(objRecord.RecordObject_NG, false);
                        }
                    }
                }
                GC.Collect();
@@ -498,9 +502,9 @@
                    HTuple hv_imageHeight = 0;
                    if (InputImage != null && InputImage is Mat)
                    {
                        TAlgorithm.Mat2HObject((Mat)InputImage, out HObject image);
                        using (HImage image = TAlgorithm.Mat2HObject((Mat)InputImage))
                        {
                        HOperatorSet.GetImageSize(image, out hv_imageWidth, out hv_imageHeight);
                    }
                    switch (type)
                    {
                        case RoiType.Rectangle2:
@@ -520,6 +524,8 @@
                        default:
                            inputImageHSmartWindowControl.oRoi = null;
                            break;
                            }
                        }
                    }
                }
            }
@@ -1096,13 +1102,14 @@
            if (InputImage != null && InputImage is Mat)
            {
                imgTabControl.SelectedTab = tabPageModelImage;
                TAlgorithm.Mat2HObject((Mat)InputImage, out HObject hoDomainImage);
                using (HImage hoDomainImage = TAlgorithm.Mat2HObject((Mat)InputImage))
                {
                HOperatorSet.GetImageSize(hoDomainImage, out HTuple hv_imageWidth, out HTuple hv_imageHeight);
                createModelImageHSmartWindowControl.ShowHoImage((HObject)hoDomainImage);
                createModelImageHSmartWindowControl.bAollowDraw = true;
                createModelImageHSmartWindowControl.oRoi = new HRectangle2(hv_imageWidth.TupleReal() / 2, hv_imageHeight.TupleReal() / 2
                    , 0, hv_imageWidth.TupleReal() / 4, hv_imageHeight.TupleReal() / 4);
                }
            }
        }
@@ -1113,7 +1120,6 @@
                if (InputImage != null && InputImage is Mat)
                {
                    double result = 0;
                    if (Enum.TryParse(cmbModelType.Text, out ModelType modelType))
                    {
                        string NumLevels = this.dtxtModelParam1.Text;
@@ -1131,27 +1137,29 @@
                        string Contrast = this.dtxtModelParam11.Text;
                        int MinContrast = Convert.ToInt16(this.dtxtModelParam12.Text);
                        HRectangle2 ROI = (HRectangle2)createModelImageHSmartWindowControl.oRoi;
                        HOperatorSet.GenRectangle2(out HObject hRectangle, ROI.Row, ROI.Column, ROI.Phi, ROI.SemiLength1, ROI.SemiLength2);
                        TAlgorithm.Mat2HObject((Mat)InputImage, out HObject hoDomainImage);
                        using (HRegion hRectangle = new HRegion())
                        {
                            hRectangle.GenRectangle2(ROI.Row, ROI.Column, ROI.Phi, ROI.SemiLength1, ROI.SemiLength2);
                            using (HImage hoDomainImage = TAlgorithm.Mat2HObject((Mat)InputImage))
                            {
                        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);
                                        //hv_Channels = hoDomainImage.CountChannels();
                                        //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);
                                        ////转换后再次检查是否为灰度图
                                        //HOperatorSet.CountChannels(hoDomainImage, out hv_Channels);
                                        //if (hv_Channels.TupleInt() != 1)
                                        //    HOperatorSet.Rgb1ToGray(hoDomainImage, out hoDomainImage);
                            }
                            catch { }
                        }
                        HOperatorSet.ReduceDomain(hoDomainImage, hRectangle, out HObject hoImageReduced);
                                HObject hoImageReduced = hoDomainImage.Rgb1ToGray().ReduceDomain(hRectangle);
                        HOperatorSet.CropDomain(hoImageReduced, out hoImageReduced);
                        TAlgorithm.HObject2Mat(hoImageReduced, out Mat hoModelImage);
                        bool bCreateModel = false;
@@ -1178,7 +1186,8 @@
                        if (bCreateModel)
                        {
                            HObject ho_ModelContours = new HObject();
                                    using (HObject ho_ModelContours = new HObject())
                                    {
                            //switch (((FindModelTool)Subject).ModelID.Type)
                            //{
                            //    case ModelType.局部变形模板:
@@ -1196,10 +1205,15 @@
                            //建模成功导航到子页
                            parasTabControl.SelectedTab = tabPageRunParas;
                            //modelImageHSmartWindowControl.ShowHoImage(((HFindModelTool)Subject).ModelID.hoImage);
                            TAlgorithm.Mat2HObject(((FindModelTool)Subject).ModelID.hoImage, out HObject modelImage);
                                        using (HImage modelImage = TAlgorithm.Mat2HObject(((FindModelTool)Subject).ModelID.hoImage))
                                        {
                            modelImageHSmartWindowControl.ShowHoImage(modelImage);
                            modelImageHSmartWindowControl.DispObj(ho_ModelContours, false);
                            modelImageHSmartWindowControl.ShowMsg("创建模板成功", true);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
@@ -1215,7 +1229,9 @@
                if (ModelID != null && ModelID.Width > 0)
                {
                    HOperatorSet.GenEmptyObj(out HObject ho_ModelContours);
                    //HOperatorSet.GenEmptyObj(out HObject ho_ModelContours);
                    using (HRegion ho_ModelContours = new HRegion())
                    {
                    //switch (ModelID.Type)
                    //{
                    //    case ModelType.各向异形模板:
@@ -1231,13 +1247,16 @@
                    //HOperatorSet.AffineTransContourXld(ho_ModelContours, out ho_ModelContours, hv_HomMat2D);
                    modelImageHSmartWindowControl.ClearObj();
                    TAlgorithm.Mat2HObject(ModelID.hoImage, out HObject hoImage);
                        using (HImage hoImage = TAlgorithm.Mat2HObject(ModelID.hoImage))
                        {
                    //modelImageHSmartWindowControl.ShowHoImage(ModelID.hoImage);
                    modelImageHSmartWindowControl.ShowHoImage(hoImage);
                    modelImageHSmartWindowControl.DispObj(ho_ModelContours, false);
                    modelImageHSmartWindowControl.ShowMsg("创建模板成功", true);
                }
            }
                }
            }
            catch { }
        }