3 Star 2 Fork 0

BelievingHeart / RemoteVisionConsole

Create your Gitee Account
Explore and code with more than 6 million developers,Free private repositories !:)
Sign up
This repository doesn't specify license. Without author's permission, this code is only for learning and cannot be used for other purposes.
Clone or download
Cancel
Notice: Creating folder will generate an empty file .keep, because not support in Git
Loading...
readme.md

这是什么?

一个视觉处理的容器应用. 一个页面对应一个视觉处理单元.

  • 一个视觉处理单元包含:
    1. 视觉的图像处理方法的实现(继承IVisionProcessor<T>的Processor类)
    2. 适配层面的配置参数配置(继承IVisionAdapter<T>的Adapter类)

能做什么?

  1. 离线运行图像文件,显示图像, 输出数据到sqlite数据库
  2. 接受来自上位机软件的byte[], 除实现离线运行的功能外, 可以反馈数据和结果到上位机软件
  3. 设置数据的上下限, 根据上下限信息判断测试项的结果. 通过IVisionCliet.GetBoundaryItems, 上位机程序可以获取上下限. 也可以通过IVsionClient.BoundaryItemsChanged事件来获取上下限数据的更新(目前仅在InProcessVisionClient实现)

特点?

  1. 预置图像显示, 图像保存, 运行异常处理, 穴位(Cavity)补偿运算逻辑,上下限设置以及测试项上下限判定,省去上位机开发者重复进行以上工作
  2. 分离上位机和图像处理程序, 避免图像处理代码中的内存问题导致上位机软件崩溃
  3. 可作为Prism模块嵌入上位机程序
  4. 作为独立应用时,通讯是基于ZeroMQ的, 因此上位机应用可以由任何有ZeroMQ库的语言来实现

短板和补救方法?

  1. 作为独立应用(使用DistributedVisionClientDistributedVisionRunner.App通信)时, 受ZeroMQ的Request-respond模式限制, 不能平行运算多个处理请求。如果实际上多次发送请求, 将这些请求排队处理。注: 作为Prism模块运行时(使用InProcessVisionClient和嵌入上位机的页面通信)支持多个处理请求同时进行。
  2. 独立使用时,通讯时间在图像数据较大时消耗较大。实测在i7-8565U, 1.8GHZ,4核心,内存2400MHZ 8GX2,的机器, 传送一组25,000,000 byte的数据平均耗时75ms. 建议的使用模式是, 项目前期阶段独立使用, 可以减少代码量,项目稳定后用Prism模块嵌入的方式使用, 节省CT.
  3. 受应用的设计限制,每一次只处理一个穴(Cavity)的数据,只支持以下的数据模式:
    • 一个byte[]等于一张图像
    • 一个byte[]等于多张图像, 图像传入后可以由自定义的方法切分, 即这些图像尺寸可以不一致。 这些图像共同来描述一个穴(Cavtiy), 例如三维重构, 厚度测量等
  4. 一张图像包含多个穴(Cavity)时, 可以在上位机端先切分图像, 然后分段请求处理
  5. 目前支持的数据类型有byte, byte(RGB), float, ushort, short, 其他数据类型的支持会在日后有需求时加入

使用(独立运行时)

视觉工程师

  1. 引用Nuget包DistributedVisionRunner.Interface, 继承IVisionProcessor<TData>

上位机工程师

  1. 引用Nuget包DistributedVisionRunner.Interface, 继承IVisionAdapter<TData>
  2. 引用DistributedVisionRunner.Client, 实例化DistributedVisionClient(独立应用时)或者InProcessVisionClient(使用Prism模块嵌入时), 实现同DistributedVisionRunner图像处理系统的数据交互
  3. DistributedVisionRunner.App新增页面, 加载视觉工程师定义的Processor类和上位机工程师的Adapter类即可

界面介绍

  1. 配置页面, 一个页面对应一个图像处理单元 Initialize
  2. 配置好的页面
    Initialize
  3. 详细设置, 包括保存数据图片设置, 补偿设置和上下限设置 Initialize Initialize Initialize

使用(作为ALC的Prism模块时), 同独立运行的使用方法

  1. 添加Nuget包DistributedVisionRunner.Module
  2. App.xaml.cs加入以下代码
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
   // Define method for logging messages from DistributedVisionRunnerModule
   var ea = Container.Resolve<IEventAggregator>();
   Action<LogItem> logMethod =
         logItem =>
         ea.GetEvent<LogEvent>().Publish(("General", logItem));

   // Configure module before adding to module
   DistributedVisionRunnerModule.ConfigureModule(logMethod, "VisionRegion", true);
   DistributedVisionRunnerModule.SetDefaultImageBackground(Theme.PrimaryColor.R, Theme.PrimaryColor.G, Theme.PrimaryColor.B);

   // Add module
   moduleCatalog.AddModule<DistributedVisionRunnerModule>();
}

Processor类和Adapter类的设计思想及任务划分

  1. Processor类是具体图像算法实现的单元, 在此单元内, 开发者(视觉工程师)只关心图像处理及其产生的原始数据以及需要显示的图像的输出和
  2. Adapter类(由上位机工程师实现)负责给出图像显示相关的参数, 定义图像文件转换成数据的方法以及定义byte数组转换成目标类型数组的方法.

数据的流动

Initialize 原始数据由Processor类产生, 全部都是浮点数, 数据的名称由Processor.RawOutputNames指定, 最终存放在DistributedVisionRunnerResultPack.RawResults中. 假若Processor.EnableWeighting=true, 则原始数据会根据视觉工程师给出的公式经过补偿服务后, 存放在DistributedVisionRunnerResultPack.WeightedResults中. 上位机工程师还可以在Adapter类中指定预留的输出项Adapter.ReservedOutputNames, 这个输出是通过由上位机工程师实现的方法(Adapter.GetResultTypeAndReservedOutputs)结合前两个结果(DistributedVisionRunnerResultPack.RawResultsDistributedVisionRunnerResultPack.WeightedResults)得出的.

依赖项

  1. 用户管理服务: 在Release中的CygiaServices安装包
  2. Sqlite管理服务: 在Release中的CygiaServices安装包
  3. 捞Sqlite数据的应用: 到此处下载Release并安装

Comments ( 0 )

Sign in for post a comment

Contributors

All

Activities

load more
can not load any more
1
https://gitee.com/believingheart/remote-vision-console.git
git@gitee.com:believingheart/remote-vision-console.git
believingheart
remote-vision-console
RemoteVisionConsole
master

Search