DeepObjectDetectClass.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using MvvmScaffoldFrame48.DLL.ImageAlgorithm;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Drawing;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Input;
  10. using System.Windows.Media.Imaging;
  11. using System.Xml.Linq;
  12. using VisionDesigner.MVDCNNDetect;
  13. namespace MvvmScaffoldFrame48.ViewModel.ViewModel
  14. {
  15. public class DeepObjectDetectClass : BaseViewModel
  16. {
  17. #region 界面绑定属性
  18. private BitmapImage _showImage;
  19. public BitmapImage ShowImage
  20. {
  21. get { return _showImage; }
  22. set
  23. {
  24. if (_showImage != value)
  25. {
  26. _showImage = value;
  27. OnPropertyChanged(nameof(ShowImage));
  28. }
  29. }
  30. }
  31. #endregion
  32. #region 界面绑定事件
  33. public ICommand TestCommand{ get; set; }
  34. #endregion
  35. #region 属性
  36. private CPUDeepObjectDetectClass cPUDeepObject = new CPUDeepObjectDetectClass();
  37. #endregion
  38. #region 绑定用Action方法
  39. public void Test(object obj)
  40. {
  41. // 创建一个 Bitmap 对象
  42. Bitmap bitmap = new Bitmap("D:\\work\\MvvmScaffoldFrame48\\MvvmScaffoldFrame48\\MvvmScaffoldFrame48\\testfile\\testimage\\2025-08-04-13-28-45-807.jpg");
  43. cPUDeepObject.LoadImage(bitmap);
  44. cPUDeepObject.LoadDeepModel("D:\\work\\MvvmScaffoldFrame48\\MvvmScaffoldFrame48\\MvvmScaffoldFrame48\\testfile\\model\\Detect_20250818T1328175385.bin");
  45. var result = cPUDeepObject.RunDetect();
  46. PrintRectToBitmap(result, ref bitmap);
  47. // 将 Bitmap 转换为 BitmapImage
  48. BitmapImage bitmapImage = ConvertToBitmapImage(bitmap);
  49. ShowImage = bitmapImage;
  50. }
  51. #endregion
  52. #region 绑定用Predicate方法
  53. private bool CanTrue(object obj)
  54. {
  55. return true;
  56. }
  57. private bool CanFalse(object obj)
  58. {
  59. return false;
  60. }
  61. #endregion
  62. #region 其他方法
  63. public DeepObjectDetectClass()
  64. {
  65. TestCommand = new RelayCommand(Test, CanTrue);
  66. }
  67. // Bitmap 转 BitmapImage 的辅助方法
  68. private BitmapImage ConvertToBitmapImage(Bitmap bitmap)
  69. {
  70. using (MemoryStream memory = new MemoryStream())
  71. {
  72. bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Png);
  73. memory.Position = 0;
  74. var bitmapImage = new BitmapImage();
  75. bitmapImage.BeginInit();
  76. bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
  77. bitmapImage.DecodePixelWidth = 1440; // 设置目标分辨率宽度
  78. bitmapImage.DecodePixelHeight = 1080; // 保持宽高比
  79. bitmapImage.StreamSource = memory;
  80. bitmapImage.EndInit();
  81. return bitmapImage;
  82. }
  83. }
  84. public void PrintRectToBitmap(List<CNNDetectPredInfo> RectData , ref Bitmap bitmap)
  85. {
  86. using (Graphics g = Graphics.FromImage(bitmap))
  87. {
  88. var redPen = new Pen(Color.Red, 2);
  89. var GreenPen = new Pen(Color.SeaGreen, 2);
  90. foreach (var item in RectData)
  91. {
  92. int roix = Convert.ToInt32(item.Box.CenterX - (item.Box.Width/2));
  93. int roiy = Convert.ToInt32(item.Box.CenterY - (item.Box.Height/2));
  94. g.DrawRectangle(item.LabelName== "A坏药"?redPen:GreenPen, new Rectangle(roix, roiy, (int)item.Box.Width, (int)item.Box.Height));
  95. }
  96. }
  97. }
  98. #endregion
  99. }
  100. }