# RemoteVisionConsole **Repository Path**: believingheart/remote-vision-console ## Basic Information - **Project Name**: RemoteVisionConsole - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2020-10-12 - **Last Updated**: 2022-04-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 这是什么? 一个视觉处理的容器应用. 一个页面对应一个视觉处理单元. - 一个视觉处理单元包含: 1. 视觉的图像处理方法的实现(继承`IVisionProcessor`的Processor类) 2. 适配层面的配置参数配置(继承`IVisionAdapter`的Adapter类) ## 能做什么? 1. 离线运行图像文件,显示图像, 输出数据到sqlite数据库 2. 接受来自上位机软件的`byte[]`, 除实现离线运行的功能外, 可以反馈数据和结果到上位机软件 3. 设置数据的上下限, 根据上下限信息判断测试项的结果. 通过`IVisionCliet.GetBoundaryItems`, 上位机程序可以获取上下限. 也可以通过`IVsionClient.BoundaryItemsChanged`事件来获取上下限数据的更新(目前仅在`InProcessVisionClient`实现) ## 特点? 1. 预置图像显示, 图像保存, 运行异常处理, 穴位(Cavity)补偿运算逻辑,上下限设置以及测试项上下限判定,省去上位机开发者重复进行以上工作 2. 分离上位机和图像处理程序, 避免图像处理代码中的内存问题导致上位机软件崩溃 3. 可作为Prism模块嵌入上位机程序 4. 作为独立应用时,通讯是基于ZeroMQ的, 因此上位机应用可以由任何有ZeroMQ库的语言来实现 ## 短板和补救方法? 1. 作为独立应用(使用`DistributedVisionClient`和`DistributedVisionRunner.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](https://www.nuget.org/packages/DistributedVisionRunner.Interface/), 继承*IVisionProcessor\* ### 上位机工程师 1. 引用Nuget包[DistributedVisionRunner.Interface](https://www.nuget.org/packages/DistributedVisionRunner.Interface/), 继承*IVisionAdapter\* 2. 引用[DistributedVisionRunner.Client](https://www.nuget.org/packages/DistributedVisionRunner.Client/), 实例化`DistributedVisionClient`(独立应用时)或者`InProcessVisionClient`(使用Prism模块嵌入时), 实现同DistributedVisionRunner图像处理系统的数据交互 3. 到`DistributedVisionRunner.App`新增页面, 加载视觉工程师定义的Processor类和上位机工程师的Adapter类即可 ## 界面介绍 1. 配置页面, 一个页面对应一个图像处理单元 ![Initialize](./Images/initialize.png) 2. 配置好的页面 ![Initialize](./Images/HomePage.png) 3. 详细设置, 包括保存数据图片设置, 补偿设置和上下限设置 ![Initialize](./Images/GeneralSettings.png) ![Initialize](./Images/WeightSetting.png) ![Initialize](./Images/BoundarySetting.png) ## 使用(作为ALC的Prism模块时), 同独立运行的使用方法 1. 添加Nuget包[DistributedVisionRunner.Module](https://www.nuget.org/packages/DistributedVisionRunner.Module/) 2. 在`App.xaml.cs`加入以下代码 ```csharp protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) { // Define method for logging messages from DistributedVisionRunnerModule var ea = Container.Resolve(); Action logMethod = logItem => ea.GetEvent().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(); } ``` ## Processor类和Adapter类的设计思想及任务划分 1. Processor类是具体图像算法实现的单元, 在此单元内, 开发者(视觉工程师)只关心图像处理及其产生的原始数据以及需要显示的图像的输出和 2. Adapter类(由上位机工程师实现)负责给出图像显示相关的参数, 定义图像文件转换成数据的方法以及定义byte数组转换成目标类型数组的方法. ## 数据的流动 ![Initialize](./Images/dataflow.jpg) 原始数据由Processor类产生, 全部都是浮点数, 数据的名称由`Processor.RawOutputNames`指定, 最终存放在`DistributedVisionRunnerResultPack.RawResults`中. 假若`Processor.EnableWeighting=true`, 则原始数据会根据视觉工程师给出的公式经过补偿服务后, 存放在`DistributedVisionRunnerResultPack.WeightedResults`中. 上位机工程师还可以在Adapter类中指定预留的输出项`Adapter.ReservedOutputNames`, 这个输出是通过由上位机工程师实现的方法(`Adapter.GetResultTypeAndReservedOutputs`)结合前两个结果(`DistributedVisionRunnerResultPack.RawResults`和`DistributedVisionRunnerResultPack.WeightedResults`)得出的. ## 图片的保存逻辑 1. 假如在视觉工程师负责的API`IVisionProcess.Process(byte[] data, string productType, int cavity)`有未处理的异常抛出, 在*在线运行*的情况下, 首先`ResultType.ERROR`会发送给上位机, 然后图像和错误信息(包括stack trace, 类型, 信息)会保存到图像文件夹下的*Error*文件夹 2. 假如视觉工程师已经在`IVisionProcess.Process(byte[] data, string productType, int cavity)`内部完成try和catch, 但是上位机工程师认为还需要根据视觉工程师的处理结果再得出错误信息并个性化保存. 那么上位机工程师可以在`(ResultType resultType, Statistics reservedResults, string errType, string errMessage) IVisionAdapter.GetResultTypeAndReservedOutputs(Statistics rawStatistics, Dictionary weightedDoubleData)`返回`ResultType.ERROR`和特定的`errType`和`errMessage`, 图片就会保存在图像文件夹下的*CustomError*的文件夹下 ## 依赖项 1. 用户管理服务: 在Release中的`CygiaServices`安装包 2. Sqlite管理服务: 在Release中的`CygiaServices`安装包 3. 捞Sqlite数据的应用: [到此处下载Release](https://gitee.com/believingheart/DataLog/releases)并安装