(十五)图像处理

1.创建非托管数组的双缓冲内存管理器

需求:相机和探测器会传输图片信息, 保存到内存中,我们需要对内存做一个管理--->双缓冲内存.
比如第一张图片放到缓存区一中,第二张图片就需要放到缓存区二,因为此时缓存区一可能正在被应用层进行读取,如果此时访问可能进行内存泄漏,第三张再放到缓存区一这样交替使用。

1.1 实现

在core层model包创建双缓存区数组
image
bindablebase里面实现了RaisePropertyChanged

  • 写入
    image
  • 释放
    image

1.2 补充知识点

c#中sealed关键字的使用
C# 5.0中使用CallerMemberName、CallerFilePath和CallerLineNumber获取代码的调用方信息

2.图像处理模块

  • 用户控件库
  • prism.unity,reactiveui.fody,reactiveui.wpf,mahapp.metro
  • 生成事件
  • 引入引用
    image
  • 模块管理类
    image
  • 主模块依赖
    image

  • image
  • view和view model创建并绑定
    image

3.采集相机图像数据至双缓冲内存区域

3.1 CameraProcessModel

  • 存储接收的图像数据
  • 观察者:当图像发送变化时,发出通知
  • 要抽象成接口,因为其他模块可能会使用,模块间通讯要通过接口(放在share)

3.2接口要放在share

  • 定义一个观察者
  • 一个图像数据
    image

3.3 实现

WhenAnyValue是reactive框架的扩展,观察者观察的是双缓存区Buffer
this是CameraProcessModel x也指的是CameraProcessModel x.Buffer.Current是指当前缓存区
观察双缓存区中的原始数据发送变化时发出通知(反应式编程)

WhenAnyValue 允许你观察对象上某个属性的值是否发生了变化。对象的属性值发生变化时进行观察,并在设置观察对象时提供一个初始值。与 ObservableForProperty() 不同。在构造函数中使用此方法在同样需要初始设置的属性之间建立绑定。

在容器中公共接口注册并初始化该类
image

3.4 图像接收服务

自动加载即IOC负责实例化
image
服务实例化后开始订阅采集数据事件
image
事件响应:图片写到双缓存区域中
image
存储过程类写入时观察者会响应
image
因为双缓存的写数据时buffer会发生变化current
image
这个缓存区时被观察者,他会通知观察者去更新数据图片
image

4.采集平板探测器图像数据至双缓冲内存区域

4.1 16位平板探测器的图像数据接口

管理原始数据并提供一个观察者,因为会对数据进行处理后续,所以要一个原数据,一个目标数据,对应2个观察者
image

4.2 相机BGRA32位图像处理模型

image

4.3 16位FPD图像接收服务管理器

image

执行流程与相机的类似
image

service中的管理类只能是在当前模块中使用,因为不是以接口形式注入的,不能进行模块间通讯,而models中的2个processmodel是以接口形式注入IOC容器中的,可以被其他模块通过构造函数注入使用
比如image模块可能会引用model中的类,process的服务也会用到model中的类,所以这两个模块独立发开,但公用的model类以接口方式注入

posted @ 2023-12-25 13:38  huihui不会写代码  阅读(60)  评论(0)    收藏  举报