4.1 识别颜色#
4.1.1 算法简介#

指定一个或多个识别区域,其位置和大小可根据需要进行设置,返回该区域的颜色标签以及红色分量值R、绿色分量值G与蓝色分量值B。
4.1.2 颜色分类标签#
Sengo2定义了7 种颜色的分类标签:
标签值 |
含义 |
标签值 |
含义 |
|---|---|---|---|
1 |
黑色 |
2 |
白色 |
3 |
红色 |
4 |
绿色 |
5 |
蓝色 |
6 |
黄色 |
0 |
未知 |
注:不在表格中的常见的颜色如紫色、青色(蓝绿色)、橙色、灰色等,其颜色区分度较低,容易误识别为表格中的颜色, 因此这几种颜色被归为未知颜色。如若需要识别以上颜色,可根据返回的RGB分量值自行进行判定。
示例1:

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

示例2:

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

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, ¶m, 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 识别颜色算法使用技巧#
当识别区域较小时,譬如2x2,虽然识别速度快,但因像素点过少,结果易被干扰,其可信度较低,只适用于背景单一可控的应用场合;
当识别区域较大时,譬如20x20,因像素点多,区域内杂色的干扰被会滤除,结果具有较高的可信度,但识别速度慢;
当识别区域内不同颜色的面积相当时,结果可能会反复跳变;
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, ¶m, 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.1.8 扩展玩法#
颜色密码锁
玩法简介: 设定一个颜色序列作为“密码”(如:红-蓝-绿)。只有按正确顺序向摄像头展示相应颜色,才能触发成功信号(如舵机转动、灯亮)。
实现: 编程记录短时间内识别到的颜色序列。只有序列与预设的“密码”完全匹配时,才执行解锁动作。这可用来打开一个简单的盒子或启动一个设备。