1.12. 三基色和颜色识别

人类眼睛对事物的形状、位置、颜色等视觉反应,这些反应必须借助于外接光的辅助,以及大脑对眼睛所能获取的信息和经验进行综合分析。光、事物、 眼睛和大脑是产生视觉反应的四要素。本节内容中不考虑事物的形状、位置,只考虑颜色。准确地说,我们需要了解人是如何区分颜色,然后我们 试图让机器能向人一样地识别颜色。


1.12.1. 颜色和光

在一个阳光明媚的海滩上,你看到某人穿着红色的衣服,这是因为他穿的衣服吸收了阳光中大多数成分,将大量红色成分反射到你的眼睛里,加上 你大脑对衣服颜色的综合结果。夜间光线较暗时,当你又遇到此人时,他仍穿着同一件衣服,或许你认为他的衣服颜色是黑色的,这是因为很少光线 能够反射到你的眼睛里。

在科学的范畴里,光代表整个电磁波谱。我们通常所说的光,仅仅指的是可见光,可见光的波长范围380~760nm。我们看不见电视遥控器发出的红外 光线,红外光不在可见光范围。波长,我们常用于区分光谱(电磁波谱)中不同光成分的单位。仅基于中学物理的基础,我们就能够明白:任何事物都 具有对光谱成分有选择性地吸收、透射和反射特性。借助于这一特性,人类设计出特定用途的滤光片、反光片等光学装置。

../../_static/images/bluefi_basics/color_visual_lignt.jpeg

总之,人眼对事物颜色的视觉反应取决于环境光,以及事物对光谱成分有选择性地吸收、透射和反射特性。模拟人眼的机器视觉传感器都遵循这一科学 原理。当我们需要了解一种特定的视觉传感器时,首先要了解其最敏感的波长范围。使用视觉传感器时需要根据自己的特定目的为传感器配置滤光片等 光学装置来优化设计。

BlueFi的集成光学传感器使用红外光谱进行接近度识别和手势识别,这个工作模式下仅仅对红外光敏感,如果你用极少红外光成分的手机照明灯、 手电筒等发出的强光照射BlueFi的集成光学传感器,但你会发现这些强光几乎不会干扰识别结果!由于太阳光有较强的红外光成分,在强太阳光 照射下BlueFi的集成光学传感器几乎正确地工作。

BlueFi的集成光学传感器具有可见光敏感组件,可以用来识别颜色。由于颜色和环境光照的光线强度具有强相关性,BlueFi的集成光学传感器也 能测量环境光亮度,在前一节中我们已经用过这一功能。BlueFi的集成光学传感器能够给出4个通道的可见光数据:R、G、B和C,前三个 通道的数据分别是三基色分量,C则是光亮度分量。

1.12.2. 颜色识别传感器的4通道数据

我们首先需要了解BlueFi的集成光学传感器输出的4通道数据。为此目的,我们使用多行文本的形式将4通道数据分别显示在BlueFi的LCD屏幕上, 便于观察输出数据和颜色直接关系。示例代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
  import time
  from hiibot_bluefi.basedio import Button, PWMLED
  from hiibot_bluefi.sensors import Sensors
  from hiibot_bluefi.screen import Screen
  screen = Screen()
  sensors = Sensors()
  rgbc = sensors.color
  button = Button()
  led = PWMLED()
  led.white = 0
  ledon = False

  def ledControl():
      global ledon
      button.Update()
      if button.B_wasPressed:
          if not ledon:
              led.white=20000
              ledon = True
          else:
              led.white=0
              ledon = False

  show_data = screen.simple_text_display(title="BlueFi Color sensor", title_scale=1, text_scale=2)
  while True:
      ledControl()
      rgbc = sensors.color
      show_data[2].text = "R: {}".format(rgbc[0])
      show_data[2].color = screen.RED
      show_data[3].text = "G: {}".format(rgbc[1])
      show_data[3].color = screen.GREEN
      show_data[4].text = "B: {}".format(rgbc[2])
      show_data[4].color = screen.BLUE
      show_data[5].text = "C: {}".format(rgbc[3])
      show_data[5].color = screen.WHITE
      show_data.show()
      time.sleep(0.1)

将本示例程序保存到BlueFi的/CIRCUITPY/code.py文件中,当BlueFi执行程序期间,你可以使用B按钮开关白光灯(亮度固定为最大亮度的1/3),开启 白光灯的目的是避免被识别的事物会遮挡住环境光线造成被反射到传感器的光量过小,你可以根据自己的环境光情况确定是否开启白光灯作为传感器的辅助光 源。

整个程序的结构在前几节我们已经多次遇到过,此处不必详细赘述。请你准备几张彩色纸片和记录纸,参考下表在记录纸上绘制数据记录表,并依次将纸片 置放于BlueFi的集成光学传感器的正上方(约1~2公分距离),记录数据。

序号 彩纸 R= G= B= C=
1 红纸 R= G= B= C=
2 绿纸 R= G= B= C=
3 蓝纸 R= G= B= C=
4 白纸 R= G= B= C=

备注:上表仅仅是一个设计参考,你可以自行设计自己的试验记录纸,最好能找来很多种不同颜色纸片做试验。

通过这个示例程序和试验,我们将会从记录纸上的数据中初步确定颜色和4个通道数据直接的关系。

1.12.3. 颜色识别

通过前一个示例和试验所记录的数据,相信你已经发现:即使人眼看起来纯单色的纸片,传感器的4个通道值并不能明显给出单色的结论。 事实上,纯单色的事物几乎不存在,根据颜色、光、纸片反射特性等因素之间关系,传感器给出的4个通道值与人眼、大脑所综合分析出来 的颜色之间存在较大差别是正常的,但是仍存在明显的相关性。

从试验所记录的数据中分析颜色与4个通道数值之间的相关性,确定一个较为合理的颜色识别算法。


总结:

  • 电磁波谱和光谱
  • 可见光
  • 颜色、光反射
  • 颜色识别和光学传感器
  • 多行文本显示的数据结构
  • 文本字体的缩放
  • 颜色识别算法
  • 本节中,你总计完成了37行代码的编写工作

重要

Sensors类的三基色和亮度接口

  • color (属性, 元组类型, 只读, 每个分量的有效值: 0~65535), BlueFi的Sensors类color属性, 集成光学传感器的三基色和亮度值
    • color[0]: 红色分量
    • color[1]: 绿色分量
    • color[2]: 蓝色分量
    • color[3]: 亮度分量