4.1 识别颜色#

4.1.1 算法简介#

1

指定一个或多个识别区域,其位置和大小可根据需要进行设置,返回该区域的颜色标签以及红色分量值R、绿色分量值G与蓝色分量值B。


4.1.2 颜色分类标签#

Sengo2定义了7 种颜色的分类标签:

标签值

含义

标签值

含义

1

黑色

2

白色

3

红色

4

绿色

5

蓝色

6

黄色

0

未知

注:不在表格中的常见的颜色如紫色、青色(蓝绿色)、橙色、灰色等,其颜色区分度较低,容易误识别为表格中的颜色, 因此这几种颜色被归为未知颜色。如若需要识别以上颜色,可根据返回的RGB分量值自行进行判定。

示例1:

2

串口标签值输出为:(可以看到5个识别框输出的颜色标签值都为3,与表格中的标签值对应)

22

示例2:

3

串口标签值输出为:(可以看到前两个识别框对应红色,中间识别框对应白色,最后两个识别卡对应绿色,而输出的标签值也与表格对应)

23


4.1.3 配置参数#

用户可指定识别区域坐标和识别框的大小,如未指定新的参数,则以默认值运行,参数定义如下:

参数

含义

默认值

param.x_value

识别区域中心横坐标x

50

param.y_value

识别区域中心纵坐标y

50

param.width

识别区域宽度w

3

param.height

识别区域高度h

4

代码:(代码中5个识别框的设置代码)

	  int param_num = 5;                          // 设置检测点数量(范围1-5)
	//别的代码...
  for (size_t i = 1; i <= param_num; i++) {
    // 设置检测区域位置(水平等距分布)
    param.x_value = 100 * i / (param_num + 1);  // X坐标(0-100%)
    param.y_value = 50;                         // Y坐标固定50%

    // 设置检测区域大小(递增)
    param.width = i * 2 + 1;   // 区域宽度(奇数)
    param.height = i * 2 + 1;  // 区域高度(奇数)

    // 将参数写入传感器
    err = sengo.SetParam(VISION_TYPE, &param, i);
	//别的代码...
  }

4.1.4 返回数据#

主控器获取检测结果时,算法会返回以下数据:

形参

含义

kRValue

红色分量值R,范围0-255

kGValue

绿色分量值G,范围0-255

kBValue

蓝色分量值B,范围0-255

kLabel

颜色分类标签

代码:

      // 获取第i个物体的标签(颜色ID)
      int label = sengo.GetValue(VISION_TYPE, kLabel, i);

sengo.GetValue(VISION_TYPE, kLabel, i);中的形参kLabel = 5,所以返回的是颜色分类标签值,加入我将他替换成"kRValue",sengo.GetValue(VISION_TYPE, kRValue, i);那么返回是是红色分量值R(0-255)


4.1.5 识别颜色算法使用技巧#

  1. 当识别区域较小时,譬如2x2,虽然识别速度快,但因像素点过少,结果易被干扰,其可信度较低,只适用于背景单一可控的应用场合;

  2. 当识别区域较大时,譬如20x20,因像素点多,区域内杂色的干扰被会滤除,结果具有较高的可信度,但识别速度慢;

  3. 当识别区域内不同颜色的面积相当时,结果可能会反复跳变;


4.1.6 代码#

#include <Arduino.h>
#include <Sentry.h>  // 引入Sentry机器视觉传感器库

typedef Sengo2 Sengo;  // 为Sengo2类型创建别名Sengo,简化后续使用

// 通信方式选择(通过取消注释启用其中一种)
#define SENGO_I2C  // 当前启用I2C通信
// #define SENGO_UART   // 备用选项:UART串口通信

#ifdef SENGO_I2C
#include <Wire.h>  // I2C通信所需的库
#endif

#ifdef SENGO_UART
#include <SoftwareSerial.h>               // 软串口库(用于非硬件串口)
#define TX_PIN 11                         // 自定义TX引脚
#define RX_PIN 10                         // 自定义RX引脚
SoftwareSerial mySerial(RX_PIN, TX_PIN);  // 创建软串口对象
#endif

#define VISION_TYPE Sengo::kVisionColor  // 定义视觉算法类型(颜色识别)
Sengo sengo;                             // 创建Sengo传感器对象

void setup() {
  sentry_err_t err = SENTRY_OK;  // 错误状态变量

  Serial.begin(9600);  // 初始化串口用于调试输出
  Serial.println("Waiting for sengo initialize...");

  // 根据选择的通信方式初始化传感器
#ifdef SENGO_I2C
  Wire.begin();  // 初始化I2C总线
  // 持续尝试连接直到成功
  while (SENTRY_OK != sengo.begin(&Wire)) {
    yield();  // 在等待时允许其他任务运行
  }
#endif

#ifdef SENGO_UART
  mySerial.begin(9600);  // 初始化软串口
  while (SENTRY_OK != sengo.begin(&mySerial)) {
    yield();
  }
#endif

  Serial.println("Sengo begin Success.");

  // 配置检测参数
  int param_num = 5;                          // 设置检测点数量(范围1-5)
  sengo.SetParamNum(VISION_TYPE, param_num);  // 应用检测点数量

  sentry_object_t param;  // 参数结构体
  for (size_t i = 1; i <= param_num; i++) {
    // 设置检测区域位置(水平等距分布)
    param.x_value = 100 * i / (param_num + 1);  // X坐标(0-100%)
    param.y_value = 50;                         // Y坐标固定50%

    // 设置检测区域大小(递增)
    param.width = i * 2 + 1;   // 区域宽度(奇数)
    param.height = i * 2 + 1;  // 区域高度(奇数)

    // 将参数写入传感器
    err = sengo.SetParam(VISION_TYPE, &param, i);
    if (err) {  // 错误处理
      Serial.print("sengo.SetParam");
      Serial.print(i);
      Serial.print(" Error: 0x");
      Serial.println(err, HEX);  // 打印16进制错误码
      while (1)
        ;  // 死循环阻塞(需手动重启)
    }
  }

  // 启动视觉识别算法
  err = sengo.VisionBegin(VISION_TYPE);
  Serial.print("sengo.VisionBegin(kVisionColor) ");
  if (err) {
    Serial.print("Error: 0x");
  } else {
    Serial.print("Success: 0x");
  }
  Serial.println(err, HEX);  // 输出初始化结果
}

void loop() {
  // 读取检测到的物体数量(kStatus表示获取状态)
  int obj_num = sengo.GetValue(VISION_TYPE, kStatus);

  if (obj_num > 0) {  // 如果检测到物体
    Serial.print("Totally ");
    Serial.print(obj_num);
    Serial.println(" objects");

    // 遍历所有检测到的物体
    for (int i = 1; i <= obj_num; ++i) {
      // 获取第i个物体的标签(颜色ID)
      int label = sengo.GetValue(VISION_TYPE, kLabel, i);
      Serial.print('|');
      Serial.print(label);  // 输出标签(如 |1|3|5|)
    }
    Serial.println("|\n");  // 结束标记
  }
  delay(500);  // 延时500ms降低刷新率
}

4.1.7 代码结果#

上传代码后,AI视觉模块上将出现5个大小不一样的识别框,每个识别框都会对它所代表的框中的颜色,然后通过串口监视器打印识别到颜色对应的标签值。

4

24

4.1.8 扩展玩法#

颜色密码锁

  • 玩法简介: 设定一个颜色序列作为“密码”(如:红-蓝-绿)。只有按正确顺序向摄像头展示相应颜色,才能触发成功信号(如舵机转动、灯亮)。

  • 实现: 编程记录短时间内识别到的颜色序列。只有序列与预设的“密码”完全匹配时,才执行解锁动作。这可用来打开一个简单的盒子或启动一个设备。