(二十二)显示处理后的图像
1. 调用opencv函数并显示图像


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 创建界面

注意在模块类中注册页面
2.2 绑定vm并创建算法实体
public class MedianBlurFilterViewModel:FilterViewModelBase<MedianBlurFilterModel>

到UI层新增图标
2.3 添加算法函数c#和c++层


并在source文件中添加名字
3. 添加opencv高斯滤波算法
3.1 创建界面

注意在模块类中注册页面
3.2 绑定vm并创建算法实体
public class GaussianBlurViewModel:FilterViewModelBase<GaussianBlurModel>

到UI层新增图标
3.3 添加算法函数c#和c++层


并在source文件中添加名字


浙公网安备 33010602011771号