(二十二)显示处理后的图像

1. 调用opencv函数并显示图像

image
image

1.1 16位FPD探测器图像的处理服务管理器

以单例注册到IOC

  /// <summary>
  /// 16位FPD探测器图像的处理服务管理器
  /// </summary>
  [ExposedService(Lifetime.Singleton,AutoInitialize =true)]
  public  class DetectorProcessManager
  {
      public IFlowProvider FlowProvider { get; }
      public DetectorProcessModel ProcessModel { get; }
      public DetectorProcessManager(IFlowProvider flowProvider,DetectorProcessModel processModel)
      {
          FlowProvider = flowProvider;
          ProcessModel = processModel;
          Subscribe();
      }

      /// <summary>
      /// 合并观察者
      /// </summary>
      private void Subscribe()
      {
           List<IObservable<Unit>> list = new List<IObservable<Unit>>();
          //IObservable<T> 是 Rx 库中的一个接口,表示可以订阅的异步数据流。
          //Unit 是 Rx 库中的一个类型,通常用来表示没有实际数据的信号(类似于 void)。


          //操作符每500毫秒从原始数据流中采样一次数据,减少数据流的频率。
          list.Add(ProcessModel.SourceObservable.Sample(TimeSpan.FromMilliseconds(500)).Select(p => Unit.Default));//当探测器图像内容被更新时
          list.Add(FlowProvider.GetObservable());//当图像算法集合被更新时


          //.CombineLatest 方法将列表中的所有 IObservable<T> 实例合成一个新的数据流。
          list.CombineLatest(p=>Unit.Default)//合并订阅
              //.Throttle 方法确保在指定时间内只处理最新的一次事件,这里是500毫秒。
              //如果在这段时间内有多个事件发生,只有最后一个会被传递。
              .Throttle(TimeSpan.FromMilliseconds(500))//每500毫秒执行一次
              .ObserveOn(RxApp.TaskpoolScheduler)//后台线程处理
              .Subscribe(p =>Process(ProcessModel.SourcePhoto));//订阅回调函数
      }

      private void Process(UnmanagedArray2D<ushort> sourcePhoto)
      {
          if (sourcePhoto == null) return;
          //取一个他的副本
          using (UnmanagedArray2D<ushort> temp = sourcePhoto.DeepClone())
          {
              if(FlowProvider.DoFilters(temp))//做图像处理
              {
                  ProcessModel.Write(temp);//显示处理后的图像
              }
              else
              {
                  ProcessModel.Write(sourcePhoto);//显示原图
              }
          }
      }
  }

1.2 显示16位探测器图像的模型

 /// <summary>
 ///  显示16位探测器图像的模型
 /// </summary>
 [ExposedService(Lifetime.Singleton,typeof(IDetectorDisplayModel))]
 public class DetectorDisplayModel : IDetectorDisplayModel
 {
     public DetectorDisplayModel(IDetectorProcessModel processModel)
     {
         this.processModel = processModel;
         processModel.TargetObservable.Subscribe(x => UpdateImageSource());
         Observable = this.WhenAnyValue(p => p._buffer.Current);
 
     }


     private void UpdateImageSource()
     {
         if(processModel.TargetPhoto != null)
         {
             _buffer.Write(processModel.TargetPhoto);
         }
        
     }
     private DoubleBuffer<ushort> _buffer { get; set; } = new DoubleBuffer<ushort>();
     private readonly IDetectorProcessModel processModel;

     public UnmanagedArray2D<ushort> Photo => _buffer.Current;

     public IObservable<UnmanagedArray2D<ushort>> Observable {get; set;}
 }

2. 调用opencv中值滤波器函数

2.1 创建界面

image

注意在模块类中注册页面

2.2 绑定vm并创建算法实体

public class MedianBlurFilterViewModel:FilterViewModelBase<MedianBlurFilterModel>
image

到UI层新增图标

2.3 添加算法函数c#和c++层

image

image
并在source文件中添加名字

3. 添加opencv高斯滤波算法

3.1 创建界面

image

注意在模块类中注册页面

3.2 绑定vm并创建算法实体

public class GaussianBlurViewModel:FilterViewModelBase<GaussianBlurModel>
image

到UI层新增图标

3.3 添加算法函数c#和c++层

image

image
并在source文件中添加名字

posted @ 2024-02-23 14:52  huihui不会写代码  阅读(31)  评论(0)    收藏  举报