(十五)图像处理
1.创建非托管数组的双缓冲内存管理器
需求:相机和探测器会传输图片信息, 保存到内存中,我们需要对内存做一个管理--->双缓冲内存.
比如第一张图片放到缓存区一中,第二张图片就需要放到缓存区二,因为此时缓存区一可能正在被应用层进行读取,如果此时访问可能进行内存泄漏,第三张再放到缓存区一这样交替使用。
1.1 实现
在core层model包创建双缓存区数组

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() 不同。在构造函数中使用此方法在同样需要初始设置的属性之间建立绑定。
在容器中公共接口注册并初始化该类

3.4 图像接收服务
自动加载即IOC负责实例化

服务实例化后开始订阅采集数据事件

事件响应:图片写到双缓存区域中

存储过程类写入时观察者会响应

因为双缓存的写数据时buffer会发生变化current

这个缓存区时被观察者,他会通知观察者去更新数据图片

4.采集平板探测器图像数据至双缓冲内存区域
4.1 16位平板探测器的图像数据接口
管理原始数据并提供一个观察者,因为会对数据进行处理后续,所以要一个原数据,一个目标数据,对应2个观察者

4.2 相机BGRA32位图像处理模型

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

执行流程与相机的类似

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










浙公网安备 33010602011771号