Răsfoiți Sursa

20251105001 添加了海康深度学习CPU目标检测的引用及实现,还有相关的测试文件

向羽 孟 2 săptămâni în urmă
părinte
comite
6e3a7cecf7
21 a modificat fișierele cu 756 adăugiri și 366 ștergeri
  1. 4 364
      MvvmScaffoldFrame48.DLL/ImageAlgorithm/CPUDeepObjectDetectClass.cs
  2. 203 0
      MvvmScaffoldFrame48.DLL/ImageAlgorithm/HikVisionAlgorithmRelated.cs
  3. 1 0
      MvvmScaffoldFrame48.DLL/MvvmScaffoldFrame48.Dll.csproj
  4. 1 0
      MvvmScaffoldFrame48.MODEL/MvvmScaffoldFrame48.Model.csproj
  5. 372 0
      MvvmScaffoldFrame48.MODEL/StorageModel/ImageAlgorithm/CPUDeepObjectDetectUseModel.cs
  6. 5 0
      MvvmScaffoldFrame48.VIEWMODEL/MvvmScaffoldFrame48.ViewModel.csproj
  7. 96 0
      MvvmScaffoldFrame48.VIEWMODEL/ViewModel/DeepObjectDetectClass.cs
  8. 19 1
      MvvmScaffoldFrame48/MvvmScaffoldFrame48.csproj
  9. 1 1
      MvvmScaffoldFrame48/WPFFroms/MainWindow.xaml.cs
  10. 23 0
      MvvmScaffoldFrame48/WPFPage/DeepObjectDetectPage.xaml
  11. 31 0
      MvvmScaffoldFrame48/WPFPage/DeepObjectDetectPage.xaml.cs
  12. BIN
      MvvmScaffoldFrame48/testfile/model/Detect_20250818T1328175385.bin
  13. BIN
      MvvmScaffoldFrame48/testfile/testimage/2025-08-04-13-14-00-655.jpg
  14. BIN
      MvvmScaffoldFrame48/testfile/testimage/2025-08-04-13-14-00-920.jpg
  15. BIN
      MvvmScaffoldFrame48/testfile/testimage/2025-08-04-13-14-01-169.jpg
  16. BIN
      MvvmScaffoldFrame48/testfile/testimage/2025-08-04-13-14-01-436.jpg
  17. BIN
      MvvmScaffoldFrame48/testfile/testimage/2025-08-04-13-28-43-744.jpg
  18. BIN
      MvvmScaffoldFrame48/testfile/testimage/2025-08-04-13-28-43-994.jpg
  19. BIN
      MvvmScaffoldFrame48/testfile/testimage/2025-08-04-13-28-44-259.jpg
  20. BIN
      MvvmScaffoldFrame48/testfile/testimage/2025-08-04-13-28-44-495.jpg
  21. BIN
      MvvmScaffoldFrame48/testfile/testimage/2025-08-04-13-28-44-754.jpg

+ 4 - 364
MvvmScaffoldFrame48.DLL/ImageAlgorithm/CPUDeepObjectDetectClass.cs

@@ -1,4 +1,5 @@
-using System;
+using MvvmScaffoldFrame48.Model.StorageModel.ImageAlgorithm;
+using System;
 using System.Collections.Generic;
 using System.Drawing;
 using System.IO;
@@ -94,7 +95,8 @@ namespace MvvmScaffoldFrame48.DLL.ImageAlgorithm
                     {
                         m_stInputImage = new CMvdImage();
                     }
-                    m_stInputImage.InitImage(bitmap);
+                    //m_stInputImage.InitImage(bitmap);
+                    HikVisionAlgorithmRelated.ConvertBitmap2MVDImage(bitmap, m_stInputImage);
                     m_stROIShape = null;
                     m_lBlobBoxRender1.Clear();
 
@@ -418,366 +420,4 @@ namespace MvvmScaffoldFrame48.DLL.ImageAlgorithm
             }
         }
     }
-
-    public class CMvdNodeBase
-    {
-        string m_strName = string.Empty;
-        string m_strDescription = string.Empty;
-        string m_strDisplayName = string.Empty;
-        string m_strVisibility = string.Empty;
-        string m_strAccessMode = string.Empty;
-        int m_nAlgorithmIndex = 0;
-
-        public string Name
-        {
-            get
-            {
-                return m_strName;
-            }
-            set
-            {
-                m_strName = value;
-            }
-        }
-
-        public string Description
-        {
-            get
-            {
-                return m_strDescription;
-            }
-            set
-            {
-                m_strDescription = value;
-            }
-        }
-
-        public string DisplayName
-        {
-            get
-            {
-                return m_strDisplayName;
-            }
-            set
-            {
-                m_strDisplayName = value;
-            }
-        }
-
-        public string Visibility
-        {
-            get
-            {
-                return m_strVisibility;
-            }
-            set
-            {
-                m_strVisibility = value;
-            }
-        }
-
-        public string AccessMode
-        {
-            get
-            {
-                return m_strAccessMode;
-            }
-            set
-            {
-                m_strAccessMode = value;
-            }
-        }
-
-        public int AlgorithmIndex
-        {
-            get
-            {
-                return m_nAlgorithmIndex;
-            }
-            set
-            {
-                m_nAlgorithmIndex = value;
-            }
-        }
-    }
-
-    public class CMvdNodeInteger : CMvdNodeBase
-    {
-        int m_nCurValue = 0;
-        int m_nDefaultValue = 0;
-        int m_nMinValue = 0;
-        int m_nMaxValue = 0;
-        int m_nIncValue = 0;
-
-        public int CurValue
-        {
-            get
-            {
-                return m_nCurValue;
-            }
-            set
-            {
-                m_nCurValue = value;
-            }
-        }
-
-        public int DefaultValue
-        {
-            get
-            {
-                return m_nDefaultValue;
-            }
-            set
-            {
-                m_nDefaultValue = value;
-            }
-        }
-
-        public int MinValue
-        {
-            get
-            {
-                return m_nMinValue;
-            }
-            set
-            {
-                m_nMinValue = value;
-            }
-        }
-
-        public int MaxValue
-        {
-            get
-            {
-                return m_nMaxValue;
-            }
-            set
-            {
-                m_nMaxValue = value;
-            }
-        }
-
-        public int IncValue
-        {
-            get
-            {
-                return m_nIncValue;
-            }
-            set
-            {
-                m_nIncValue = value;
-            }
-        }
-    }
-
-    public class CMvdNodeEnumEntry
-    {
-        string m_strName = string.Empty;
-        string m_strDescription = string.Empty;
-        string m_strDisplayName = string.Empty;
-        bool m_bIsImplemented = false;
-        int m_nValue = 0;
-
-        public string Name
-        {
-            get
-            {
-                return m_strName;
-            }
-            set
-            {
-                m_strName = value;
-            }
-        }
-
-        public string Description
-        {
-            get
-            {
-                return m_strDescription;
-            }
-            set
-            {
-                m_strDescription = value;
-            }
-        }
-
-        public string DisplayName
-        {
-            get
-            {
-                return m_strDisplayName;
-            }
-            set
-            {
-                m_strDisplayName = value;
-            }
-        }
-
-        public bool IsImplemented
-        {
-            get
-            {
-                return m_bIsImplemented;
-            }
-            set
-            {
-                m_bIsImplemented = value;
-            }
-        }
-
-        public int Value
-        {
-            get
-            {
-                return m_nValue;
-            }
-            set
-            {
-                m_nValue = value;
-            }
-        }
-    }
-
-    public class CMvdNodeFloat : CMvdNodeBase
-    {
-        float m_fCurValue = 0;
-        float m_fDefaultValue = 0;
-        float m_fMinValue = 0;
-        float m_fMaxValue = 0;
-        float m_fIncValue = 0;
-
-        public float CurValue
-        {
-            get
-            {
-                return m_fCurValue;
-            }
-            set
-            {
-                m_fCurValue = value;
-            }
-        }
-
-        public float DefaultValue
-        {
-            get
-            {
-                return m_fDefaultValue;
-            }
-            set
-            {
-                m_fDefaultValue = value;
-            }
-        }
-
-        public float MinValue
-        {
-            get
-            {
-                return m_fMinValue;
-            }
-            set
-            {
-                m_fMinValue = value;
-            }
-        }
-
-        public float MaxValue
-        {
-            get
-            {
-                return m_fMaxValue;
-            }
-            set
-            {
-                m_fMaxValue = value;
-            }
-        }
-
-        public float IncValue
-        {
-            get
-            {
-                return m_fIncValue;
-            }
-            set
-            {
-                m_fIncValue = value;
-            }
-        }
-    }
-
-    public class CMvdNodeBoolean : CMvdNodeBase
-    {
-        bool m_bDefaultValue = false;
-        bool m_bCurValue = false;
-
-        public bool CurValue
-        {
-            get
-            {
-                return m_bCurValue;
-            }
-            set
-            {
-                m_bCurValue = value;
-            }
-        }
-
-        public bool DefaultValue
-        {
-            get
-            {
-                return m_bDefaultValue;
-            }
-            set
-            {
-                m_bDefaultValue = value;
-            }
-        }
-    }
-
-    public class CMvdNodeEnumeration : CMvdNodeBase
-    {
-        CMvdNodeEnumEntry m_eCurValue = new CMvdNodeEnumEntry();
-        CMvdNodeEnumEntry m_eDefaultValue = new CMvdNodeEnumEntry();
-        List<CMvdNodeEnumEntry> m_listEnumEntry = new List<CMvdNodeEnumEntry>();
-
-        public CMvdNodeEnumEntry CurValue
-        {
-            get
-            {
-                return m_eCurValue;
-            }
-            set
-            {
-                m_eCurValue = value;
-            }
-        }
-
-        public CMvdNodeEnumEntry DefaultValue
-        {
-            get
-            {
-                return m_eDefaultValue;
-            }
-            set
-            {
-                m_eDefaultValue = value;
-            }
-        }
-
-        public List<CMvdNodeEnumEntry> EnumRange
-        {
-            get
-            {
-                return m_listEnumEntry;
-            }
-            set
-            {
-                m_listEnumEntry = value;
-            }
-        }
-    }
 }

+ 203 - 0
MvvmScaffoldFrame48.DLL/ImageAlgorithm/HikVisionAlgorithmRelated.cs

@@ -0,0 +1,203 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+using VisionDesigner;
+
+namespace MvvmScaffoldFrame48.DLL.ImageAlgorithm
+{
+    public static class HikVisionAlgorithmRelated
+    {
+        public static void ConvertBitmap2MVDImage(Bitmap cBitmapImg, CMvdImage cMvdImg)
+        {
+            // 参数合法性判断
+            if (null == cBitmapImg || null == cMvdImg)
+            {
+                throw new MvdException(MVD_MODULE_TYPE.MVD_MODUL_APP, MVD_ERROR_CODE.MVD_E_PARAMETER_ILLEGAL);
+            }
+
+            // 判断像素格式
+            if (PixelFormat.Format8bppIndexed != cBitmapImg.PixelFormat && PixelFormat.Format24bppRgb != cBitmapImg.PixelFormat)
+            {
+                throw new MvdException(MVD_MODULE_TYPE.MVD_MODUL_APP, MVD_ERROR_CODE.MVD_E_SUPPORT);
+            }
+
+            Int32 nImageWidth = cBitmapImg.Width;
+            Int32 nImageHeight = cBitmapImg.Height;
+            Int32 nChannelNum = 0;
+            BitmapData bitmapData = null;
+
+            try
+            {
+                // 获取图像信息
+                if (PixelFormat.Format8bppIndexed == cBitmapImg.PixelFormat) // 灰度图
+                {
+                    bitmapData = cBitmapImg.LockBits(new Rectangle(0, 0, nImageWidth, nImageHeight)
+                                                                    , ImageLockMode.ReadOnly
+                                                                    , PixelFormat.Format8bppIndexed);
+                    cMvdImg.InitImage(Convert.ToUInt32(nImageWidth), Convert.ToUInt32(nImageHeight), MVD_PIXEL_FORMAT.MVD_PIXEL_MONO_08);
+                    nChannelNum = 1;
+                }
+                else if (PixelFormat.Format24bppRgb == cBitmapImg.PixelFormat) // 彩色图
+                {
+                    bitmapData = cBitmapImg.LockBits(new Rectangle(0, 0, nImageWidth, nImageHeight)
+                                                                , ImageLockMode.ReadOnly
+                                                                , PixelFormat.Format24bppRgb);
+                    cMvdImg.InitImage(Convert.ToUInt32(nImageWidth), Convert.ToUInt32(nImageHeight), MVD_PIXEL_FORMAT.MVD_PIXEL_RGB_RGB24_C3);
+                    nChannelNum = 3;
+                }
+
+                // 考虑图像是否4字节对齐,bitmap要求4字节对齐,而mvdimage不要求对齐
+                if (0 == nImageWidth % 4) // 4字节对齐时,直接拷贝
+                {
+                    Marshal.Copy(bitmapData.Scan0, cMvdImg.GetImageData().stDataChannel[0].arrDataBytes, 0, nImageWidth * nImageHeight * nChannelNum);
+                }
+                else // 按步长逐行拷贝
+                {
+                    // 每行实际占用字节数
+                    Int32 nRowPixelByteNum = nImageWidth * nChannelNum + 4 - (nImageWidth * nChannelNum % 4);
+                    // 每行首字节首地址
+                    IntPtr bitmapDataRowPos = IntPtr.Zero;
+                    for (int i = 0; i < nImageHeight; i++)
+                    {
+                        // 获取每行第一个像素值的首地址
+                        bitmapDataRowPos = new IntPtr(bitmapData.Scan0.ToInt64() + nRowPixelByteNum * i);
+                        Marshal.Copy(bitmapDataRowPos, cMvdImg.GetImageData().stDataChannel[0].arrDataBytes, i * nImageWidth * nChannelNum, nImageWidth * nChannelNum);
+                    }
+                }
+
+                // bitmap彩色图按BGR存储,而MVDimg按RGB存储,改变存储顺序
+                // 交换R和B
+                if (PixelFormat.Format24bppRgb == cBitmapImg.PixelFormat)
+                {
+                    byte bTemp;
+                    byte[] bMvdImgData = cMvdImg.GetImageData().stDataChannel[0].arrDataBytes;
+                    for (int i = 0; i < nImageWidth * nImageHeight; i++)
+                    {
+                        bTemp = bMvdImgData[3 * i];
+                        bMvdImgData[3 * i] = bMvdImgData[3 * i + 2];
+                        bMvdImgData[3 * i + 2] = bTemp;
+                    }
+                }
+            }
+            finally
+            {
+                cBitmapImg.UnlockBits(bitmapData);
+            }
+        }
+
+        public static void ConvertMVDImage2Bitmap(CMvdImage cMvdImg, ref Bitmap cBitmapImg)
+        {
+            // 参数合法性判断
+            if (null == cMvdImg)
+            {
+                throw new MvdException(MVD_MODULE_TYPE.MVD_MODUL_APP, MVD_ERROR_CODE.MVD_E_PARAMETER_ILLEGAL);
+            }
+
+            // 判断像素格式
+            if (MVD_PIXEL_FORMAT.MVD_PIXEL_MONO_08 != cMvdImg.PixelFormat && MVD_PIXEL_FORMAT.MVD_PIXEL_RGB_RGB24_C3 != cMvdImg.PixelFormat)
+            {
+                throw new MvdException(MVD_MODULE_TYPE.MVD_MODUL_APP, MVD_ERROR_CODE.MVD_E_SUPPORT);
+            }
+
+            Int32 nImageWidth = Convert.ToInt32(cMvdImg.Width);
+            Int32 nImageHeight = Convert.ToInt32(cMvdImg.Height);
+            Int32 nChannelNum = 0;
+            BitmapData bitmapData = null;
+            byte[] bBitmapDataTemp = null;
+            try
+            {
+                // 获取图像信息
+                if (MVD_PIXEL_FORMAT.MVD_PIXEL_MONO_08 == cMvdImg.PixelFormat) // 灰度图
+                {
+                    cBitmapImg = new Bitmap(nImageWidth, nImageHeight, PixelFormat.Format8bppIndexed);
+
+                    // 灰度图需指定调色板
+                    ColorPalette colorPalette = cBitmapImg.Palette;
+                    for (int j = 0; j < 256; j++)
+                    {
+                        colorPalette.Entries[j] = Color.FromArgb(j, j, j);
+                    }
+                    cBitmapImg.Palette = colorPalette;
+
+                    bitmapData = cBitmapImg.LockBits(new Rectangle(0, 0, nImageWidth, nImageHeight)
+                                                                    , ImageLockMode.WriteOnly
+                                                                    , PixelFormat.Format8bppIndexed);
+
+                    // 灰度图不做深拷贝
+                    bBitmapDataTemp = cMvdImg.GetImageData().stDataChannel[0].arrDataBytes;
+                    nChannelNum = 1;
+                }
+                else if (MVD_PIXEL_FORMAT.MVD_PIXEL_RGB_RGB24_C3 == cMvdImg.PixelFormat) // 彩色图
+                {
+                    cBitmapImg = new Bitmap(nImageWidth, nImageHeight, PixelFormat.Format24bppRgb);
+                    bitmapData = cBitmapImg.LockBits(new Rectangle(0, 0, nImageWidth, nImageHeight)
+                                                                , ImageLockMode.WriteOnly
+                                                                , PixelFormat.Format24bppRgb);
+                    // 彩色图做深拷贝
+                    bBitmapDataTemp = new byte[cMvdImg.GetImageData().stDataChannel[0].nLen];
+                    Array.Copy(cMvdImg.GetImageData().stDataChannel[0].arrDataBytes, bBitmapDataTemp, bBitmapDataTemp.Length);
+                    nChannelNum = 3;
+                }
+
+                // bitmap彩色图按BGR存储,而MVDimg按RGB存储,改变存储顺序
+                // 交换R和B
+                if (MVD_PIXEL_FORMAT.MVD_PIXEL_RGB_RGB24_C3 == cMvdImg.PixelFormat)
+                {
+                    byte bTemp;
+                    for (int i = 0; i < nImageWidth * nImageHeight; i++)
+                    {
+                        bTemp = bBitmapDataTemp[3 * i];
+                        bBitmapDataTemp[3 * i] = bBitmapDataTemp[3 * i + 2];
+                        bBitmapDataTemp[3 * i + 2] = bTemp;
+                    }
+                }
+
+                // 考虑图像是否4字节对齐,bitmap要求4字节对齐,而mvdimage不要求对齐
+                if (0 == nImageWidth % 4) // 4字节对齐时,直接拷贝
+                {
+                    Marshal.Copy(bBitmapDataTemp, 0, bitmapData.Scan0, nImageWidth * nImageHeight * nChannelNum);
+                }
+                else // 按步长逐行拷贝
+                {
+                    // 每行实际占用字节数
+                    Int32 nRowPixelByteNum = nImageWidth * nChannelNum + 4 - (nImageWidth * nChannelNum % 4);
+                    // 每行首字节首地址
+                    IntPtr bitmapDataRowPos = IntPtr.Zero;
+                    for (int i = 0; i < nImageHeight; i++)
+                    {
+                        // 获取每行第一个像素值的首地址
+                        bitmapDataRowPos = new IntPtr(bitmapData.Scan0.ToInt64() + nRowPixelByteNum * i);
+                        Marshal.Copy(bBitmapDataTemp, i * nImageWidth * nChannelNum, bitmapDataRowPos, nImageWidth * nChannelNum);
+                    }
+                }
+
+                cBitmapImg.UnlockBits(bitmapData);
+            }
+            catch (MvdException ex)
+            {
+                if (null != cBitmapImg)
+                {
+                    cBitmapImg.UnlockBits(bitmapData);
+                    cBitmapImg.Dispose();
+                    cBitmapImg = null;
+                }
+                throw ex;
+            }
+            catch (System.Exception ex)
+            {
+                if (null != cBitmapImg)
+                {
+                    cBitmapImg.UnlockBits(bitmapData);
+                    cBitmapImg.Dispose();
+                    cBitmapImg = null;
+                }
+                throw ex;
+            }
+        }
+    }
+}

+ 1 - 0
MvvmScaffoldFrame48.DLL/MvvmScaffoldFrame48.Dll.csproj

@@ -106,6 +106,7 @@
     <Compile Include="FileTools\PDFGenerate.cs" />
     <Compile Include="ImageAlgorithm\BoundRectangleClass.cs" />
     <Compile Include="ImageAlgorithm\CPUDeepObjectDetectClass.cs" />
+    <Compile Include="ImageAlgorithm\HikVisionAlgorithmRelated.cs" />
     <Compile Include="ImageAlgorithm\ImageAlgorithmTools.cs" />
     <Compile Include="LogTools\TxtLog.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />

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

@@ -67,6 +67,7 @@
     <Compile Include="StorageModel\HikVisionCamera\CameraInfoModel.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="StorageModel\ImageAlgorithm\BoundingRectangleMdoel.cs" />
+    <Compile Include="StorageModel\ImageAlgorithm\CPUDeepObjectDetectUseModel.cs" />
     <Compile Include="StorageModel\SystemAlarm\AlarmMessModel.cs" />
     <Compile Include="StorageModel\SystemAlarm\AlarmTypes.cs" />
     <Compile Include="UserModel.cs" />

+ 372 - 0
MvvmScaffoldFrame48.MODEL/StorageModel/ImageAlgorithm/CPUDeepObjectDetectUseModel.cs

@@ -0,0 +1,372 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml;
+
+namespace MvvmScaffoldFrame48.Model.StorageModel.ImageAlgorithm
+{
+    public class CMvdNodeBase
+    {
+        string m_strName = string.Empty;
+        string m_strDescription = string.Empty;
+        string m_strDisplayName = string.Empty;
+        string m_strVisibility = string.Empty;
+        string m_strAccessMode = string.Empty;
+        int m_nAlgorithmIndex = 0;
+
+        public string Name
+        {
+            get
+            {
+                return m_strName;
+            }
+            set
+            {
+                m_strName = value;
+            }
+        }
+
+        public string Description
+        {
+            get
+            {
+                return m_strDescription;
+            }
+            set
+            {
+                m_strDescription = value;
+            }
+        }
+
+        public string DisplayName
+        {
+            get
+            {
+                return m_strDisplayName;
+            }
+            set
+            {
+                m_strDisplayName = value;
+            }
+        }
+
+        public string Visibility
+        {
+            get
+            {
+                return m_strVisibility;
+            }
+            set
+            {
+                m_strVisibility = value;
+            }
+        }
+
+        public string AccessMode
+        {
+            get
+            {
+                return m_strAccessMode;
+            }
+            set
+            {
+                m_strAccessMode = value;
+            }
+        }
+
+        public int AlgorithmIndex
+        {
+            get
+            {
+                return m_nAlgorithmIndex;
+            }
+            set
+            {
+                m_nAlgorithmIndex = value;
+            }
+        }
+    }
+
+    public class CMvdNodeInteger : CMvdNodeBase
+    {
+        int m_nCurValue = 0;
+        int m_nDefaultValue = 0;
+        int m_nMinValue = 0;
+        int m_nMaxValue = 0;
+        int m_nIncValue = 0;
+
+        public int CurValue
+        {
+            get
+            {
+                return m_nCurValue;
+            }
+            set
+            {
+                m_nCurValue = value;
+            }
+        }
+
+        public int DefaultValue
+        {
+            get
+            {
+                return m_nDefaultValue;
+            }
+            set
+            {
+                m_nDefaultValue = value;
+            }
+        }
+
+        public int MinValue
+        {
+            get
+            {
+                return m_nMinValue;
+            }
+            set
+            {
+                m_nMinValue = value;
+            }
+        }
+
+        public int MaxValue
+        {
+            get
+            {
+                return m_nMaxValue;
+            }
+            set
+            {
+                m_nMaxValue = value;
+            }
+        }
+
+        public int IncValue
+        {
+            get
+            {
+                return m_nIncValue;
+            }
+            set
+            {
+                m_nIncValue = value;
+            }
+        }
+    }
+
+    public class CMvdNodeEnumEntry
+    {
+        string m_strName = string.Empty;
+        string m_strDescription = string.Empty;
+        string m_strDisplayName = string.Empty;
+        bool m_bIsImplemented = false;
+        int m_nValue = 0;
+
+        public string Name
+        {
+            get
+            {
+                return m_strName;
+            }
+            set
+            {
+                m_strName = value;
+            }
+        }
+
+        public string Description
+        {
+            get
+            {
+                return m_strDescription;
+            }
+            set
+            {
+                m_strDescription = value;
+            }
+        }
+
+        public string DisplayName
+        {
+            get
+            {
+                return m_strDisplayName;
+            }
+            set
+            {
+                m_strDisplayName = value;
+            }
+        }
+
+        public bool IsImplemented
+        {
+            get
+            {
+                return m_bIsImplemented;
+            }
+            set
+            {
+                m_bIsImplemented = value;
+            }
+        }
+
+        public int Value
+        {
+            get
+            {
+                return m_nValue;
+            }
+            set
+            {
+                m_nValue = value;
+            }
+        }
+    }
+
+    public class CMvdNodeFloat : CMvdNodeBase
+    {
+        float m_fCurValue = 0;
+        float m_fDefaultValue = 0;
+        float m_fMinValue = 0;
+        float m_fMaxValue = 0;
+        float m_fIncValue = 0;
+
+        public float CurValue
+        {
+            get
+            {
+                return m_fCurValue;
+            }
+            set
+            {
+                m_fCurValue = value;
+            }
+        }
+
+        public float DefaultValue
+        {
+            get
+            {
+                return m_fDefaultValue;
+            }
+            set
+            {
+                m_fDefaultValue = value;
+            }
+        }
+
+        public float MinValue
+        {
+            get
+            {
+                return m_fMinValue;
+            }
+            set
+            {
+                m_fMinValue = value;
+            }
+        }
+
+        public float MaxValue
+        {
+            get
+            {
+                return m_fMaxValue;
+            }
+            set
+            {
+                m_fMaxValue = value;
+            }
+        }
+
+        public float IncValue
+        {
+            get
+            {
+                return m_fIncValue;
+            }
+            set
+            {
+                m_fIncValue = value;
+            }
+        }
+    }
+
+    public class CMvdNodeBoolean : CMvdNodeBase
+    {
+        bool m_bDefaultValue = false;
+        bool m_bCurValue = false;
+
+        public bool CurValue
+        {
+            get
+            {
+                return m_bCurValue;
+            }
+            set
+            {
+                m_bCurValue = value;
+            }
+        }
+
+        public bool DefaultValue
+        {
+            get
+            {
+                return m_bDefaultValue;
+            }
+            set
+            {
+                m_bDefaultValue = value;
+            }
+        }
+    }
+
+    public class CMvdNodeEnumeration : CMvdNodeBase
+    {
+        CMvdNodeEnumEntry m_eCurValue = new CMvdNodeEnumEntry();
+        CMvdNodeEnumEntry m_eDefaultValue = new CMvdNodeEnumEntry();
+        List<CMvdNodeEnumEntry> m_listEnumEntry = new List<CMvdNodeEnumEntry>();
+
+        public CMvdNodeEnumEntry CurValue
+        {
+            get
+            {
+                return m_eCurValue;
+            }
+            set
+            {
+                m_eCurValue = value;
+            }
+        }
+
+        public CMvdNodeEnumEntry DefaultValue
+        {
+            get
+            {
+                return m_eDefaultValue;
+            }
+            set
+            {
+                m_eDefaultValue = value;
+            }
+        }
+
+        public List<CMvdNodeEnumEntry> EnumRange
+        {
+            get
+            {
+                return m_listEnumEntry;
+            }
+            set
+            {
+                m_listEnumEntry = value;
+            }
+        }
+    }
+}

+ 5 - 0
MvvmScaffoldFrame48.VIEWMODEL/MvvmScaffoldFrame48.ViewModel.csproj

@@ -50,18 +50,23 @@
     <ErrorReport>prompt</ErrorReport>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="MVDCNNDetect.Net, Version=4.2.1.4, Culture=neutral, PublicKeyToken=f4e2bfa0ac20f5c4" />
+    <Reference Include="PresentationCore" />
     <Reference Include="System" />
     <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
     <Reference Include="System.Xml.Linq" />
     <Reference Include="System.Data.DataSetExtensions" />
     <Reference Include="Microsoft.CSharp" />
     <Reference Include="System.Data" />
     <Reference Include="System.Net.Http" />
     <Reference Include="System.Xml" />
+    <Reference Include="WindowsBase" />
   </ItemGroup>
   <ItemGroup>
     <Compile Include="ViewModel\AlarmViewModel.cs" />
     <Compile Include="ViewModel\CustomControlViewModel.cs" />
+    <Compile Include="ViewModel\DeepObjectDetectClass.cs" />
     <Compile Include="ViewModel\TestViewModel.cs" />
     <Compile Include="ViewModel\BaseViewModel.cs" />
     <Compile Include="ViewModel\MainViewModel.cs" />

+ 96 - 0
MvvmScaffoldFrame48.VIEWMODEL/ViewModel/DeepObjectDetectClass.cs

@@ -0,0 +1,96 @@
+using MvvmScaffoldFrame48.DLL.ImageAlgorithm;
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Input;
+using System.Windows.Media.Imaging;
+using System.Xml.Linq;
+
+namespace MvvmScaffoldFrame48.ViewModel.ViewModel
+{
+    public class DeepObjectDetectClass : BaseViewModel
+    {
+        #region 界面绑定属性
+        private BitmapImage _showImage;
+        public BitmapImage ShowImage 
+        {
+            get { return _showImage; }
+            set
+            {
+                if (_showImage != value)
+                {
+                    _showImage = value;
+                    OnPropertyChanged(nameof(ShowImage));
+                }
+            }
+        }
+        #endregion
+
+        #region 界面绑定事件
+        public ICommand TestCommand{ get; set; }
+        #endregion
+
+        #region 属性
+        private CPUDeepObjectDetectClass cPUDeepObject = new CPUDeepObjectDetectClass();
+        #endregion
+
+        #region 绑定用Action方法
+        public void Test(object obj)
+        {
+            // 创建一个 Bitmap 对象
+            Bitmap bitmap = new Bitmap("D:\\work\\MvvmScaffoldFrame48\\MvvmScaffoldFrame48\\MvvmScaffoldFrame48\\testfile\\testimage\\2025-08-04-13-14-00-655.jpg");
+
+            cPUDeepObject.LoadImage(bitmap);
+            cPUDeepObject.LoadDeepModel("D:\\work\\MvvmScaffoldFrame48\\MvvmScaffoldFrame48\\MvvmScaffoldFrame48\\testfile\\model\\Detect_20250818T1328175385.bin");
+            var result = cPUDeepObject.RunDetect();
+
+            // 将 Bitmap 转换为 BitmapImage
+            BitmapImage bitmapImage = ConvertToBitmapImage(bitmap);
+
+            ShowImage = bitmapImage;
+
+        }
+        #endregion
+
+        #region 绑定用Predicate方法
+        private bool CanTrue(object obj)
+        {
+            return true;
+        }
+        private bool CanFalse(object obj)
+        {
+            return false;
+        }
+        #endregion
+
+        #region 其他方法
+
+        public DeepObjectDetectClass()
+        {
+            TestCommand = new RelayCommand(Test, CanTrue);
+        }
+
+        // Bitmap 转 BitmapImage 的辅助方法
+        private BitmapImage ConvertToBitmapImage(Bitmap bitmap)
+        {
+            using (MemoryStream memory = new MemoryStream())
+            {
+                bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Png);
+                memory.Position = 0;
+                var bitmapImage = new BitmapImage();
+                bitmapImage.BeginInit();
+                bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
+                bitmapImage.DecodePixelWidth = 1200; // 设置目标分辨率宽度
+                bitmapImage.DecodePixelHeight = 600; // 保持宽高比
+                bitmapImage.StreamSource = memory;
+                bitmapImage.EndInit();
+                return bitmapImage;
+            }
+        }
+        #endregion
+    }
+}

+ 19 - 1
MvvmScaffoldFrame48/MvvmScaffoldFrame48.csproj

@@ -81,6 +81,9 @@
     <Compile Include="WPFPage\CustomControlPage.xaml.cs">
       <DependentUpon>CustomControlPage.xaml</DependentUpon>
     </Compile>
+    <Compile Include="WPFPage\DeepObjectDetectPage.xaml.cs">
+      <DependentUpon>DeepObjectDetectPage.xaml</DependentUpon>
+    </Compile>
     <Compile Include="WPFPage\TestPage.xaml.cs">
       <DependentUpon>TestPage.xaml</DependentUpon>
     </Compile>
@@ -105,6 +108,10 @@
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
+    <Page Include="WPFPage\DeepObjectDetectPage.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="WPFPage\TestPage.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
@@ -132,6 +139,7 @@
       <Generator>SettingsSingleFileGenerator</Generator>
       <LastGenOutput>Settings.Designer.cs</LastGenOutput>
     </None>
+    <None Include="testfile\model\Detect_20250818T1328175385.bin" />
   </ItemGroup>
   <ItemGroup>
     <None Include="App.config" />
@@ -146,6 +154,16 @@
       <Name>MvvmScaffoldFrame48.ViewModel</Name>
     </ProjectReference>
   </ItemGroup>
-  <ItemGroup />
+  <ItemGroup>
+    <Resource Include="testfile\testimage\2025-08-04-13-14-00-655.jpg" />
+    <Resource Include="testfile\testimage\2025-08-04-13-14-00-920.jpg" />
+    <Resource Include="testfile\testimage\2025-08-04-13-14-01-169.jpg" />
+    <Resource Include="testfile\testimage\2025-08-04-13-14-01-436.jpg" />
+    <Resource Include="testfile\testimage\2025-08-04-13-28-43-744.jpg" />
+    <Resource Include="testfile\testimage\2025-08-04-13-28-43-994.jpg" />
+    <Resource Include="testfile\testimage\2025-08-04-13-28-44-259.jpg" />
+    <Resource Include="testfile\testimage\2025-08-04-13-28-44-495.jpg" />
+    <Resource Include="testfile\testimage\2025-08-04-13-28-44-754.jpg" />
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
 </Project>

+ 1 - 1
MvvmScaffoldFrame48/WPFFroms/MainWindow.xaml.cs

@@ -17,7 +17,7 @@ namespace MvvmScaffoldFrame48
 
         private void Window_Loaded(object sender, RoutedEventArgs e)
         {
-            Uri ShowUri = new Uri("WPFPage\\AlarmPage.xaml", UriKind.Relative);
+            Uri ShowUri = new Uri("WPFPage\\DeepObjectDetectPage.xaml", UriKind.Relative);
             ShowFrame.Navigate(ShowUri);
         }
     }

+ 23 - 0
MvvmScaffoldFrame48/WPFPage/DeepObjectDetectPage.xaml

@@ -0,0 +1,23 @@
+<Page x:Class="MvvmScaffoldFrame48.WPFPage.DeepObjectDetectPage"
+      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+      xmlns:local="clr-namespace:MvvmScaffoldFrame48.WPFPage"
+      mc:Ignorable="d" 
+      d:DesignHeight="450" d:DesignWidth="800"
+      Title="DeepObjectDetectPage">
+
+    <Grid>
+        <Grid.ColumnDefinitions>
+            <ColumnDefinition Width="*"/>
+            <ColumnDefinition Width="100"/>
+        </Grid.ColumnDefinitions>
+        <Grid Grid.Column="0">
+            <Image Source="{Binding ShowImage}" />
+        </Grid>
+        <Grid Grid.Column="1">
+            <Button x:Name="RunOnceBtn" Content="RunOnce" Command="{Binding TestCommand}" Height="60" HorizontalAlignment="Center" VerticalAlignment="Top" Width="90" />
+        </Grid>
+    </Grid>
+</Page>

+ 31 - 0
MvvmScaffoldFrame48/WPFPage/DeepObjectDetectPage.xaml.cs

@@ -0,0 +1,31 @@
+using MvvmScaffoldFrame48.ViewModel.ViewModel;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace MvvmScaffoldFrame48.WPFPage
+{
+    /// <summary>
+    /// DeepObjectDetectPage.xaml 的交互逻辑
+    /// </summary>
+    public partial class DeepObjectDetectPage : Page
+    {
+        public DeepObjectDetectPage()
+        {
+            InitializeComponent();
+            DeepObjectDetectClass deepObjectDetectClass = new DeepObjectDetectClass();
+            this.DataContext = deepObjectDetectClass;
+        }
+    }
+}

BIN
MvvmScaffoldFrame48/testfile/model/Detect_20250818T1328175385.bin


BIN
MvvmScaffoldFrame48/testfile/testimage/2025-08-04-13-14-00-655.jpg


BIN
MvvmScaffoldFrame48/testfile/testimage/2025-08-04-13-14-00-920.jpg


BIN
MvvmScaffoldFrame48/testfile/testimage/2025-08-04-13-14-01-169.jpg


BIN
MvvmScaffoldFrame48/testfile/testimage/2025-08-04-13-14-01-436.jpg


BIN
MvvmScaffoldFrame48/testfile/testimage/2025-08-04-13-28-43-744.jpg


BIN
MvvmScaffoldFrame48/testfile/testimage/2025-08-04-13-28-43-994.jpg


BIN
MvvmScaffoldFrame48/testfile/testimage/2025-08-04-13-28-44-259.jpg


BIN
MvvmScaffoldFrame48/testfile/testimage/2025-08-04-13-28-44-495.jpg


BIN
MvvmScaffoldFrame48/testfile/testimage/2025-08-04-13-28-44-754.jpg