Преглед на файлове

20251121001 完成运行算法的参数保存功能制作

向羽 孟 преди 10 часа
родител
ревизия
f32d964a29

+ 47 - 0
MvvmScaffoldFrame48.DLL/ConfigTools/XMLReadWrite.cs

@@ -34,6 +34,30 @@ namespace MvvmScaffoldFrame48.DLL.ConfigTools
             }
         }
 
+        /// <summary>
+        /// 序列化对象为XML字符串
+        /// </summary>
+        /// <typeparam name="T">对象类型</typeparam>
+        /// <param name="data">要序列化的对象</param>
+        /// <returns>XML字符串</returns>
+        /// <exception cref="InvalidOperationException"></exception>
+        public static string SerializeToString<T>(T data)
+        {
+            try
+            {
+                var serializer = new XmlSerializer(typeof(T));
+                using (var writer = new StringWriter())
+                {
+                    serializer.Serialize(writer, data);
+                    return writer.ToString();
+                }
+            }
+            catch (Exception ex)
+            {
+                throw new InvalidOperationException("XML serialization to string failed", ex);
+            }
+        }
+
         /// <summary>
         /// 从XML文件反序列化对象
         /// </summary>
@@ -56,5 +80,28 @@ namespace MvvmScaffoldFrame48.DLL.ConfigTools
                 throw new InvalidOperationException("XML deserialization failed", ex);
             }
         }
+
+        /// <summary>
+        /// 从XML字符串反序列化对象
+        /// </summary>
+        /// <typeparam name="T">对象类型</typeparam>
+        /// <param name="xmlString">XML字符串</param>
+        /// <returns>反序列化的对象</returns>
+        /// <exception cref="InvalidOperationException"></exception>
+        public static T DeserializeFromString<T>(string xmlString)
+        {
+            try
+            {
+                var serializer = new XmlSerializer(typeof(T));
+                using (var reader = new StringReader(xmlString))
+                {
+                    return (T)serializer.Deserialize(reader);
+                }
+            }
+            catch (Exception ex)
+            {
+                throw new InvalidOperationException("XML deserialization from string failed", ex);
+            }
+        }
     }
 }

+ 6 - 8
MvvmScaffoldFrame48.DLL/ThreadManager/CameraGroup.cs

@@ -5,9 +5,6 @@ using MvvmScaffoldFrame48.Model.ResultModel;
 using MvvmScaffoldFrame48.Model.StorageModel.SystemConfig;
 using System;
 using System.Collections.Concurrent;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
 
@@ -124,16 +121,17 @@ namespace MvvmScaffoldFrame48.DLL.ThreadManager
         /// 更新算法参数
         /// </summary>
         /// <param name="parameters">新参数</param>
-        public void UpdateAlgorithmParameters(Dictionary<string, object> parameters)
+        public void UpdateAlgorithmParameters(object parameters)
         {
             if (ImageProcessor != null && parameters != null)
             {
-                ImageProcessor.Configure(parameters);
+                string parametersjson = ImageProcessor.GetSaveJson();
+                ImageProcessor.Configure(parametersjson);
 
                 // 更新配置
                 if (Configuration != null)
                 {
-                    Configuration.AlgorithmParameters = parameters;
+                    Configuration.AlgorithmParameters = parametersjson;
                 }
 
                 Console.WriteLine($"相机 {CameraId} 算法参数已更新");
@@ -146,7 +144,7 @@ namespace MvvmScaffoldFrame48.DLL.ThreadManager
         /// 设置图像处理算法
         /// </summary>
         /// <param name="algorithmName">算法名称</param>
-        private void SetProcessingAlgorithm(string algorithmName, Dictionary<string, object> parameters = null)
+        private void SetProcessingAlgorithm(string algorithmName, string parameters = null)
         {
             if (string.IsNullOrEmpty(algorithmName))
             {
@@ -160,7 +158,7 @@ namespace MvvmScaffoldFrame48.DLL.ThreadManager
                 ImageProcessor = ImageProcessingAlgorithmHikVisionFactory.CreateAlgorithm(algorithmName);
 
                 // 配置参数
-                if (parameters != null && parameters.Count > 0 && ImageProcessor != null)
+                if (parameters != null &&  ImageProcessor != null)
                 {
                     ImageProcessor.Configure(parameters);
                 }

+ 4 - 2
MvvmScaffoldFrame48.DLL/ThreadManager/IImageProcessingAlgorithmHikVision.cs

@@ -27,12 +27,14 @@ namespace MvvmScaffoldFrame48.DLL.ThreadManager
         /// 配置算法参数
         /// </summary>
         /// <param name="parameters">参数字典</param>
-        void Configure(Dictionary<string, object> parameters);
+        void Configure(string parameters);
 
         /// <summary>
         /// 获取当前算法参数
         /// </summary>
         /// <returns>参数字典</returns>
-        Dictionary<string, object> GetParameters();
+        Object GetParameters();
+
+        string GetSaveJson();
     }
 }

+ 28 - 18
MvvmScaffoldFrame48.DLL/ThreadManager/ProcessingAlgorithm.cs

@@ -1,6 +1,8 @@
 //实现线程算法示例
 using MvCameraControl;
+using MvvmScaffoldFrame48.DLL.ConfigTools;
 using MvvmScaffoldFrame48.Model.ResultModel;
+using MvvmScaffoldFrame48.Model.StorageModel.ProcessingConfig;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -47,31 +49,39 @@ namespace MvvmScaffoldFrame48.DLL.ThreadManager
             };
         }
 
-        public void Configure(Dictionary<string, object> parameters)
+        public void Configure(string parameters)
         {
-            if (parameters.ContainsKey("Threshold"))
-                _threshold = Convert.ToDouble(parameters["Threshold"]);
-
-            if (parameters.ContainsKey("MinArea"))
-                _minArea = Convert.ToInt32(parameters["MinArea"]);
-
-            if (parameters.ContainsKey("EnableFiltering"))
-                _enableFiltering = Convert.ToBoolean(parameters["EnableFiltering"]);
-
-            if (parameters.ContainsKey("FilterType"))
-                _filterType = parameters["FilterType"].ToString();
+            var parameter = XMLReadWrite.DeserializeFromString<ProcessingAlgorithmConfigModel>(parameters);
+            if(parameter != null)
+            {
+                _threshold = parameter.Threshold;
+                _minArea = parameter.MinArea;
+                _enableFiltering = parameter.EnableFiltering;
+                _filterType = parameter.FilterType;
+            }
         }
 
-        public Dictionary<string, object> GetParameters()
+        public object GetParameters()
         {
-            return new Dictionary<string, object>
+            return new ProcessingAlgorithmConfigModel
             {
-                { "Threshold", _threshold },
-                { "MinArea", _minArea },
-                { "EnableFiltering", _enableFiltering },
-                { "FilterType", _filterType }
+                Threshold = _threshold,
+                MinArea = _minArea,
+                EnableFiltering = _enableFiltering,
+                FilterType = _filterType
             };
         }
+
+        public string GetSaveJson()
+        {
+            return XMLReadWrite.SerializeToString(new ProcessingAlgorithmConfigModel
+            {
+                Threshold = _threshold,
+                MinArea = _minArea,
+                EnableFiltering = _enableFiltering,
+                FilterType = _filterType
+            });
+        }
         #endregion
     }
 }

+ 21 - 10
MvvmScaffoldFrame48.DLL/ThreadManager/ThreadManager.cs

@@ -3,10 +3,12 @@ using MvCameraControl;
 using MvvmScaffoldFrame48.DLL.CameraTools;
 using MvvmScaffoldFrame48.DLL.ConfigTools;
 using MvvmScaffoldFrame48.Model.ResultModel;
+using MvvmScaffoldFrame48.Model.StorageModel.ProcessingConfig;
 using MvvmScaffoldFrame48.Model.StorageModel.SystemConfig;
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using System.Threading;
 using System.Threading.Tasks;
@@ -206,12 +208,13 @@ namespace MvvmScaffoldFrame48.DLL.ThreadManager
             {
                 case "ProcessingAlgorithm":
                     config.ProcessingAlgorithmName = "ProcessingAlgorithm";
-                    config.AlgorithmParameters = new Dictionary<string, object>
+                    config.AlgorithmParameters = XMLReadWrite.SerializeToString(new ProcessingAlgorithmConfigModel()
                     {
-                        { "Threshold", 150.0 },
-                        { "MinArea", 200 },
-                        { "EnableFiltering", true }
-                    };
+                        Threshold = 0.5,
+                        MinArea = 100,
+                        EnableFiltering = true,
+                        FilterType = "FilterType"
+                    });
                     break;
             }
 
@@ -221,7 +224,7 @@ namespace MvvmScaffoldFrame48.DLL.ThreadManager
         /// <summary>
         /// 动态更新相机算法参数
         /// </summary>
-        public void UpdateCameraParameters(int cameraId, Dictionary<string, object> newParameters)
+        public void UpdateCameraParameters(int cameraId, object newParameters)
         {
             if (cameraId >= 0 && cameraId < _cameraGroups.Count())
             {
@@ -242,11 +245,19 @@ namespace MvvmScaffoldFrame48.DLL.ThreadManager
         private void LoadCameraConfigurations()
         {
             // 这里可以从XML文件、数据库或其他配置源加载配置
-            _cameraConfigurations = new List<CameraProcessConfigModel>()
+            if (File.Exists("TestConfig.xml"))
             {
-                CreateCameraConfiguration(0, "ProcessingAlgorithm"),
-            };
-            XMLReadWrite.SerializeToXml(_cameraConfigurations, "TestConfig.xml");
+                _cameraConfigurations = XMLReadWrite.DeserializeFromXml<List<CameraProcessConfigModel>>("TestConfig.xml");
+            }
+            else
+            {
+                _cameraConfigurations = new List<CameraProcessConfigModel>()
+                {
+                    CreateCameraConfiguration(0, "ProcessingAlgorithm"),
+                };
+            }
+
+            //XMLReadWrite.SerializeToXml(_cameraConfigurations, "TestConfig.xml");
         }
 
         /// <summary>

+ 1 - 0
MvvmScaffoldFrame48.MODEL/MvvmScaffoldFrame48.Model.csproj

@@ -68,6 +68,7 @@
     <Compile Include="StorageModel\HikVisionCamera\CameraInfoModel.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="StorageModel\ImageAlgorithm\BoundingRectangleMdoel.cs" />
+    <Compile Include="StorageModel\ProcessingConfig\ProcessingAlgorithmConfigModel.cs" />
     <Compile Include="StorageModel\SystemAlarm\AlarmMessModel.cs" />
     <Compile Include="StorageModel\SystemAlarm\AlarmTypes.cs" />
     <Compile Include="StorageModel\SystemConfig\AllCameraProcessConfigModel.cs" />

+ 19 - 0
MvvmScaffoldFrame48.MODEL/StorageModel/AlgorithmConfig/ProcessingAlgorithmParameterConfig.cs

@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MvvmScaffoldFrame48.Model.StorageModel.AlgorithmConfig
+{
+    public class ProcessingAlgorithmParameterConfig
+    {
+        public double _threshold {get; set;}
+        //参数:最小面积
+        public int _minArea { get; set; }
+        //参数:是否启用滤波
+        public bool _enableFiltering {get; set;}
+        //参数:滤波类型
+        public string _filterType {get;set;}
+    }
+}

+ 20 - 0
MvvmScaffoldFrame48.MODEL/StorageModel/ProcessingConfig/ProcessingAlgorithmConfigModel.cs

@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MvvmScaffoldFrame48.Model.StorageModel.ProcessingConfig
+{
+    public class ProcessingAlgorithmConfigModel
+    {
+        //参数:阈值
+        public double Threshold { get; set; }
+        //参数:最小面积
+        public int MinArea { get; set;}
+        //参数:是否启用滤波
+        public bool EnableFiltering {get; set;}
+        //参数:滤波类型
+        public string FilterType { get; set;}
+    }
+}

+ 7 - 5
MvvmScaffoldFrame48.MODEL/StorageModel/SystemConfig/AllCameraProcessConfigModel.cs

@@ -30,22 +30,24 @@ namespace MvvmScaffoldFrame48.Model.StorageModel.SystemConfig
         /// <summary>
         /// 算法参数
         /// </summary>
-        public Dictionary<string, object> AlgorithmParameters { get; set; }
+        //public Dictionary<string, object> AlgorithmParameters { get; set; }
+        public string AlgorithmParameters { get; set; }
 
         /// <summary>
         /// 相机参数
         /// </summary>
         //public Dictionary<string, object> CameraParameters { get; set; }
+        public string CameraParameters { get; set; }
 
         /// <summary>
         /// 是否启用
         /// </summary>
         public bool IsEnabled { get; set; }
 
-        public CameraProcessConfigModel()
-        {
-            AlgorithmParameters = new Dictionary<string, object>();
+        //public CameraProcessConfigModel()
+        //{
+            //AlgorithmParameters = new Dictionary<string, object>();
             //CameraParameters = new Dictionary<string, object>();
-        }
+        //}
     }
 }

+ 47 - 0
MvvmScaffoldFrame48.MODEL/StorageModel/SystemConfig/CameraProcessConfigModel.cs

@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml.Linq;
+
+namespace MvvmScaffoldFrame48.Model.StorageModel.SystemConfig
+{
+    // <summary>
+    /// 单个相机处理配置
+    /// </summary>
+    public class CameraProcessConfigModel
+    {
+        /// <summary>
+        /// 相机ID
+        /// </summary>
+        public int CameraId { get; set; }
+
+        /// <summary>
+        /// 相机序列号
+        /// </summary>
+        public string CameraSN { get; set; }
+
+        /// <summary>
+        /// 使用的图像处理算法名称
+        /// </summary>
+        public string ProcessingAlgorithmName { get; set; }
+
+        /// <summary>
+        /// 算法参数
+        /// </summary>
+        //public Dictionary<string, object> AlgorithmParameters { get; set; }
+        public string AlgorithmParameters { get; set; } = "{}";
+
+        /// <summary>
+        /// 相机参数
+        /// </summary>
+        //public Dictionary<string, object> CameraParameters { get; set; }
+        public string CameraParameters { get; set; } = "{}";
+
+        /// <summary>
+        /// 是否启用
+        /// </summary>
+        public bool IsEnabled { get; set; }
+    }
+}