.. _methods: 识别方法 ======== 你可以根据目标与条件选择七种识别方法之一。 七段数码管 ---------- 最为优选、可靠且快速的方法,适用于识别大多数数字显示中使用的七段字体及其相近字体。 .. image:: img/KA.png :alt: 七段数码管 :width: 600px :align: center .. note:: 为使该方法正确工作,处理后的图像中数字应为黑色、背景应为白色。如果不是,请勾选/取消勾选 **反转** (:ref:`inversion`)。 网格设置 ~~~~~~~~ .. image:: img/mesh_menu.png :alt: 网格设置 :align: center 要配置该方法,首先进入 **网格设置** 标签,然后指定需要识别的数字个数,并使用 **左偏移**、**顶部偏移**、**宽度**、**高度**、**空格**、**倾斜** 滑块按数字外轮廓调好网格。小数点应位于各平行四边形之间的外部。程序内置了 :ref:`examples` 正确设置的示例。 也可以点击相应按钮自动设置网格。自动构网算法中包含随机性,因此可以多次点击该按钮,直到得到满意的结果。 .. note:: 网格设置被设计为网格不会越过区域边界。因此,例如当网格右边缘已贴近区域右侧时,如果你想增加左偏移,将无法直接实现。你需要先减小宽度或空格。 方法设置 ~~~~~~~~ .. image:: img/KA_method_menu.png :alt: 方法设置 :align: center 接下来,选择 **方法设置** 标签。里面有 **字体宽度** 与 **数字敏感度** 两个滑块,通常默认值已经较为合适,大多数情况下无需调整。但若识别不稳定,可以进行修改:当字体线条较粗时应增大字体宽度,较细时应减小。若图像较暗但无噪点,建议提高敏感度;若数字清晰但存在噪点,建议降低敏感度。重要的是噪点像素数量不要超过数字像素数量。 若勾选 **将空位视为零**,则某个网格平行四边形内的全白区域会作为 0 显示在识别结果中;否则显示为空字符。 通过 **查找点** 可以设置程序忽略小数点或在结果中显示小数点。 **点敏感度** 滑块用于设置小数点的检出逻辑:如果在网格两个平行四边形之间的下边界有黑色像素,则敏感度越高,视为小数点所需的像素数量越少。例如,当该值为 100 时,只需 1 个像素即可被判定为小数点。请根据小数点粗细与噪声多少进行调节。通常默认值适用于大多数情况,仅在必要时修改。 要添加对负号的识别,请点击 **添加减号**,并在当前区域中用两次单击框选一个矩形(每个区域只能选一个减号,且必须在当前区域内)作为减号所在位置。删除减号请点击 **删除减号**。 .. note:: 完成所有设置后别忘了在 :ref:`file` 中保存,以便下次使用该测量设备时不必重新配置。 .. _corner_method: 指针式仪器:角点法 ------------------ 该方法用于指针式(模拟)测量仪表,工作原理如下: 1. 相对于运动物体(指针)进行背景去除。为正确确定背景,程序需要处理一定数量的帧。 2. 寻找特征点 —— 角点 。 3. 通过找到的角点拟合一条直线。并非所有点都参与直线拟合,只保留距离直线不超过一定像素数的点。 4. 累积已找到直线的统计并寻找中心 —— 指针的旋转轴。 5. 将指针的 **倾斜角** 按所选 **刻度方法**(如有需要)转换为 **刻度结果**。 .. image:: img/pointer.png :alt: 指针式仪表 :width: 600px :align: center 为成功实现该方法并便于在程序中广泛应用,提供了 3 个额外的 **设置菜单**。 .. note:: 无需急于修改设置。默认设置很可能已经合适,或只需调整少数几个参数。 .. _img_settings: 图像设置 ~~~~~~~~ .. image:: img/img_menu.png :alt: 图像设置 :align: center **原始** 与 **无背景** 单选按钮用于选择在区域中显示的图像。**原始** 显示叠加了对象的原图;**无背景** 显示减去背景并叠加了对象的图像。 .. note:: **无背景** 模式便于调参数,因为可以直观看到设置变化的效果。 该菜单的其它设置仅影响区域图像上各种对象与标注的显示。对列表中的每个对象,你可以: - 启用/禁用显示 - 设置颜色 - 设置大小 .. _method_settings: 方法设置 ~~~~~~~~ .. image:: img/method_menu.png :alt: 方法设置 :align: center 复选框 **固定背景** 与 **固定中心** 分别用于锁定 **背景** 与 **中心** (指针的旋转轴)。 这意味着新的帧不会影响背景或中心坐标。 固定背景可以在指针静止时仍然保持其识别,但即使是细微的背景变化也会逐渐累积,并可能在某个时刻变得至关重要。 **刻度结果** 与 **结果 - 倾斜角** 单选按钮决定识别结果的类型。若选择 **刻度结果**,识别结果为按刻度换算后的读数;若选择 **结果 - 倾斜角**,识别结果为指针的倾斜角,此时不考虑刻度。 .. note:: 指针的倾斜角从水平向右的位置起,逆时针计数,范围 0 到 360 度。 **内存帧数** 决定用于处理而保存在内存中的帧数量。帧数越多,背景估计越好,直线与中心的统计也越充分,但对图像稳定性的要求越高。换言之,**内存帧数** 较大时,程序对背景变化的适应性较差。 在 **内存帧数** 右侧会显示两个数字 `x/y`,其中 `x` 表示程序已处理用于计算背景的帧数,`y` 表示为计算背景最多会存储的帧数。 当 `x = y` 时,每个新帧都会替换最早的帧,因此在未启用 **固定背景** 时,程序使用 **最后** 的 `x` 帧来计算背景。 .. note:: 修改该值时,用于确定背景的先前帧数据会被清除,背景计算将从头开始。测量过程中不建议修改此值。 **最大偏差** (像素)用于两处: - 拟合描述指针的直线时,只保留距离该直线不超过此值的角点; - 在新帧中搜索描述指针的直线时,该直线不能偏离已找到的中心超过此值。 也就是说,**最大偏差** 越小,中心(不同姿态的指针线交点)的期望离散度越小。 .. note:: 每当在新帧中找到描述指针的直线后,中心值都会被进一步精化。因此,如果测量仪表在画面中缓慢移动,中心也会随之移动。但若发生较大的位移(超过 **最大偏差**),则可能完全找不到新的中心。在这种情况下,请通过 **忘记区域统计** 按钮从头开始处理。另外,保存区域设置时不会保存 **背景** 数据,因此当你打开先前保存的区域设置时,请留出时间让程序重新计算背景。 **最小点数** 决定用于拟合 **指针直线** 所需的最小 **角点** 数量; **最大角点数** 决定单帧内可被检测到的 **角点** 的最大数量; **角点质量阈值** 设定 **角点** 的最低质量,低于该阈值的点将被忽略; **角点最小距离**(像素)设定角点之间的最小间距。在得到角点候选后,会移除相互之间过近(小于 **角点最小距离** 像素)的点; **最小指针长度** 与 **最大指针长度**(像素)设定 **指针直线** 的最小与最大长度,有助于过滤伪直线; **stats: x / [y...z]** 标签会告知用户所收集到的 **指针直线**(每帧最多一条指针)样本量,这些直线用于计算它们交点处的中心。 其中 **x** 为当前已找到的指针直线数量,**y** 为计算中心所需的 **最小样本量**(也就是说,当 `x < y` 时程序不会计算中心), **z** 为 **最大可能的样本量**。当 `x = z` 时,每条新直线都会替换样本中最早的直线。 因此,在未固定中心的情况下,程序会记住最近的 **x** 条指针直线。 **忘记区域统计** 按钮会清除先前帧中找到的所有直线与中心信息,从头开始处理。当图像出现明显变化(例如仪表移动、光照改变或 **中心** 被错误检测)时,这可能是必要的操作。 **忘记背景** 按钮允许重新开始计算背景,当背景突然发生变化时非常有用。 .. note:: 为了在程序启动后的前几秒或按下 **忘记区域统计** 按钮后正确计算 **中心**,指针应在尽可能大的范围内改变其倾斜角。寻找中心需要一定时间,该时间随 **内存帧数** 增大而增大。 .. _grad_settings: 刻度 ~~~~ .. image:: img/grad_menu.png :alt: 刻度 :align: center **刻度** 菜单用于将指针的倾斜角与 **刻度读数** 关联起来。 对于同一 **区域**,可以配置多条 **刻度** 并在需要时切换。 菜单顶部提供了 **刻度列表** 以及 **+** 与 **-** 按钮。 **+ 按钮** 会创建一条 **以当前刻度为模板的新刻度**, **- 按钮** 会在当前刻度不是最后一条时将其删除, 而 **下拉列表** 则用于在现有刻度之间切换。 .. note:: 也可以通过外部命令在刻度之间切换(见 :ref:`external`),这样就能提前配置所有需要的刻度,并在测量过程中无缝切换。 当 **刻度** 菜单打开时,将光标移动到刻度线上并单击左键,图像上会出现新的 **刻度点**,相应记录也会显示在该菜单的表格中。要将这些点与刻度值关联,请在表格中定位到 **刻度值** 列的单元格并双击左键,随后会出现输入框。输入该刻度点的数值。 .. note:: 如需尽可能精确地将刻度点放在刻度线上,请先放大图像(参见 :ref:`size`)。 若要删除不需要的点,请在表格中选中相应行并点击 **删除选中行** (选择时可使用 `ctrl` 与 `shift` 键)。 然后在 **刻度方法** 列表中选择合适的方法。 所有方法可分为两类:**样条**(即在若干区间分别由代数多项式表示的函数)与 **具有显式解析表达式的函数**。 样条包括: - **分段线性插值** - **三次样条** - **拉格朗日插值多项式** 这些方法无需额外设置。详细内容可参考数学与数值方法方面的资料,本说明文档不再展开。 具有显式解析表达式的函数包括: - **线性关系** - **对数关系** - **双曲线** - **自定义函数** 选择任一此类方法后,你会看到用于刻度换算的函数显式表达式,其中变量 `x` 表示角度(度),其余参数(除 `x` 外的任意字母)将由程序自动求取。有时程序无法独立计算出参数的 **精确值**(尤其在函数复杂或参数较多时),这时需要为全部或部分参数输入 **初始猜测**。一般来说,即便程序已能自动求得参数,输入与其接近的初始猜测也有助于后续计算。 选择 **自定义函数** 方法时,你需要自行输入函数表达式:使用 `x` 表示自变量(必需),使用其他字母或单词表示待求的自由参数。还提供一套常用的数学函数与运算符(采用通用记法)。 如果函数表达式不正确,或不包含变量 `x`,输入框上方会提示错误,文本将以红色高亮。 .. note:: 函数表达式也可以完全不包含 **参数**,且与 **刻度点** 无关。例如,可以使用 `mod(90 - x, 360) / 6` 这种“趣味函数”将秒针的倾斜角转换为秒数(函数 `mod(a, b)` 返回 `a` 除以 `b` 的余数)。 点击 **显示图表** 按钮将打开当前区域的 **刻度图** 窗口。该图会实时更新,并显示当前结果。该窗口的菜单包含 **文件** 部分,你可以通过 **保存** 将图表保存至默认目录(见 :ref:`catalog`),或通过 **另存为...** 选择保存路径。 .. image:: img/grad.png :alt: 刻度图 :width: 600px :align: center .. note:: 如果程序未检测到识别结果,**刻度图** 不会更新。因此,如果你修改了 **刻度图**,它只会在首次出现识别结果后更新。 指针式仪表:轮廓法 ------------------ 该方法的工作原理与 :ref:`corner_method` 类似,不同之处在于它检测的是 **轮廓**,并基于指针轮廓上的所有点来寻找 **指针直线**。因此该方法的设置略有不同。 .. note:: 提供多种方法可使程序更具通用性:在某些场景下某一种方法表现更好,在另一些场景下则相反。 图像设置 ~~~~~~~~ 图像设置与 **角度法** 相同(见 :ref:`img_settings`),不同的是这里显示的是 **轮廓** 而非 **角点**。 方法设置 ~~~~~~~~ .. image:: img/contour_method_menu.png :alt: 方法设置 :align: center **轮廓法设置** 中包含与 **角度法设置** (见 :ref:`method_settings`)相同用途的变量: - **固定背景** 与 **固定中心** 复选框 - **刻度结果** 与 **结果 - 倾斜角** 单选项 - **内存帧数** - **最大偏差** 以及若干新的(像素单位)变量: - **指针轮廓最小长度** - **指针轮廓最大长度** - **指针轮廓最小面积** - **指针轮廓最大面积** 这些变量作为长度与面积的过滤条件,帮助在画面中定位目标指针的轮廓。 刻度 ~~~~ 与 **角度法** 完全相同(见 :ref:`grad_settings`)。 指针式仪表:颜色法 ------------------ 该方法与 :ref:`corner_method` 也类似,但有更显著的差异: 1. 该方法同样需要估计背景,但不是相对于运动物体,而是通过颜色筛选得到的像素来定义背景; 2. **指针直线** 基于被筛选的像素拟合。直线搜索的目标是让尽可能多的被筛选像素与直线的距离不超过 **最大偏差** 像素。 随后流程与前述方法相同。 .. note:: 该方法非常适用于指针颜色有明显区分(例如红色)的测量仪表(此类仪表并不少见)。这样可以通过颜色过滤出指针,从而只对指针进行处理。 图像设置 ~~~~~~~~ 与 **角度法** 相同(见 :ref:`img_settings`),但该方法中没有 **角点**。 方法设置 ~~~~~~~~ .. image:: img/color_method_menu.png :alt: 方法设置 :align: center **颜色法设置** 包含与 **角度法设置** (见 :ref:`method_settings`)相同用途的变量: - **固定中心** 复选框 - **刻度结果** 与 **结果 - 倾斜角** 单选项 - **内存帧数** - **最大偏差** - **最小点数** - **最小/最大指针长度** 以及若干新的按钮和变量: - **选择指针颜色**:点击后打开颜色选择窗口,可选择指针颜色。其右侧会显示一个选定颜色的方块。 - 三个滑块用于设置指针颜色的 **范围** (红、绿、蓝)。工作原理:彩色图像的每个像素由三个 0 到 255 的数(红、绿、蓝)表示。对选定颜色 `(x, y, z)`,滑块允许设置范围 `(x ± dx, y ± dy, z ± dz)`,其中 `dx`、`dy`、`dz` 为滑块值。范围之外的像素将被视为背景。 .. note:: 手动设置 **指针颜色** 可能较为繁琐,因此你也可以将光标移动到图像中的指针上并单击左键,即可自动选择指针颜色。此时 **方法设置** 菜单必须处于打开状态。该逻辑等价于 **吸管** 工具。 需要注意的是,**吸管** 同样适用于 **颜色设置窗口**(点击 **选择指针颜色** 打开的窗口),但在 Windows 操作系统上例外。 .. image:: img/pip.png 刻度 ~~~~ 与 **角度法** 完全相同(见 :ref:`grad_settings`)。 神经网络 -------- 神经网络非常擅长识别俄语与英语的印刷体文本。也可以按需添加其他语言,请联系开发者。神经网络对标准字体的识别效果好,但相比 **七段数码管** 方法更新结果的频率较低,并且对数字显示常用字体的识别效果较差。 .. image:: img/net.png :alt: 神经网络 :width: 600px :align: center *图中神经网络正在处理第 2 区域* .. note:: 要使神经网络工作,还需要安装 Tesseract-OCR,并在 :ref:`menu` → :ref:`settings` → :ref:`tesseract` 中指定可执行文件路径。 二维码与条形码 -------------- 该方法可识别选定区域内的二维码与条形码(zxing-cpp 库支持的一维与二维格式)。若区域内有多个码,则每个结果单独占一行显示。 .. note:: **阈值** 滑块对该方法无效。如有需要,可使用 **反转**。为保证可靠识别,区域内的码应清晰可见,避免强反光与严重模糊。 指示器 ------ 该方法用于判定图像的颜色。当你需要监控某些设备的指示状态时会很有用。例如,当设备面板上的红色报警灯亮起时,可以配置触发外部的安全程序。 .. image:: img/diodes.png :alt: 指示器 :width: 600px :align: center 该方法的设置同样包含 **阈值** 滑块与 **反转** 复选框,但与 **七段数码管** 与 **神经网络** 使用灰度图像不同,此方法会同时在三个通道(红、绿、蓝)上处理图像。 .. note:: 例如,当阈值为 100,某像素的 RGB 值为 (90, 150, 200) 时,处理后该像素变为 (0, 255, 255),对应青色;若应用反转,则变为 (255, 0, 0),对应红色。 因此,经过处理后,采用 **指示器** 方法的区域仅保留 8 种颜色。对于每个区域也仅会识别这 8 种颜色。**颜色敏感性** 滑块决定在该区域中最终识别为哪种颜色。 .. note:: **颜色敏感性** 定义了在一个区域中判定某种颜色存在所需的像素占比。 例如,当该值为 100 时,只需每种颜色 1 个像素即可判定颜色存在,因此此时区域的颜色结果将始终为白色(红绿蓝混合为白)。 当该值为 0 时,必须达到 100% 的像素都为某种颜色,才判定该颜色存在,因此结果总是黑色。 介于两者之间的取值可以用来过滤无关的颜色。