回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【花雕动手做】HUSKYLENS 2 AI视觉传感器之识别颜色输出相关数据 简单

头像 驴友花雕 2025.11.21 3 0

一、相关知识点
1、HUSKYLENS 2(二哈识图2)是DFRobot推出的新一代AI视觉传感器,搭载6TOPS算力的Kendryte K230双核RISC-V芯片,集成1GB LPDDR4内存与8GB存储,支持人脸识别、物体检测、姿态估计等20余种预置AI模型,同时允许用户通过自训练模型部署实现定制化识别
。其硬件配置包括200万像素摄像头、2.4英寸触摸屏、可更换镜头模组(支持显微/夜视)及RGB补光灯,搭配UART/I2C接口可无缝连接Arduino、树莓派等开发板,实现实时图传与多模态交互。内置MCP服务打通本地视觉与大模型能力,例如识别午餐图片后可生成膳食建议,而模型广场提供车牌识别、跌倒检测等垂直领域即用型方案。作为教育利器,它已融入《中小学人工智能通识教育指南》课程体系,通过Mind+图形化编程工具降低AI开发门槛,助力创客教育与STEAM实践。

 

14-.jpg


2、行空板 K10 是一款专为中小学信息科技教学和创客项目设计的国产 AIoT 开发板,以 ESP32-S3 为核心,高度集成 2.8 英寸全彩 LCD 屏、摄像头、双麦扬声器、WiFi 蓝牙模块及温湿度、光线、加速度等多种传感器,无需额外配件即可实现离线语音识别(支持 200 词库)、人脸识别、二维码读取、物联网联动等功能,支持 Mind + 图形化编程与 MicroPython 代码编程,兼顾入门便捷性与功能扩展性,丰富的扩展接口还能连接外部传感器、执行器,轻松落地 AI、物联网类创意项目,是编程学习与科创实践的高性价比选择。

 

13--.jpg


3、Mind + 是 DFRobot 旗下蘑菇云科创教育团队研发的、拥有自主知识产权的国产青少年编程软件,它兼容 Scratch3.0,既支持零基础学习者拖拽图形化积木编程,也能切换至 Python/C/C++ 代码编程,且积木可自动转换为对应代码助力进阶学习,同时适配行空板M10\ K10、Arduino、micro:bit 等众多主流开源硬件与上百种电子模块,集成图像识别、语音识别等 AI 功能及物联网开发能力,还搭配实时交互、程序烧录脱机运行等模式与丰富教学案例,适配校内外编程教学、创客项目及竞赛等场景,是兼顾低入门门槛与高拓展性的科创教育工具。

 

二、硬件连接
准备材料
行空板K10 x 1
HUSKYLENS 2 x 1
USB数据线 x 2
4pin连接线(或杜邦线)x 1

准备一根USB数据线和一根4Pin白色硅胶线。使用USB数据线连接电脑与行空板K10,使用4Pin黑胶先连接行空板K10与HuskyLens 2,再使用额外的USB数据线n连接示意图如下连接HUSKYLENS 2的Type-C接口与电源,为HUSKYLENS 2进行额外供电。接线图可参考下图。

 

01.jpg
01-.jpg
02.jpg

三、颜色识别(Color Recognition)是一种计算机视觉与感知技术,其核心目标是:通过摄像头、图像传感器或算法,自动检测并判断物体或图像中的颜色信息。颜色识别是视觉智能的重要基础能力,它让设备具备“看懂颜色”的能力,是智能识别、自动控制、人机交互等系统中的基础功能之一。

(1)颜色识别的基本定义
颜色识别是指:
将图像中的像素值转换为颜色模型中的数值(如 RGB、HSV、Lab),并根据设定规则或模型判断颜色类别或属性。
它不仅识别“是什么颜色”,还可以分析颜色的分布、比例、变化趋势等。

(2)常见颜色模型

 

59.jpg

 

(3)颜色识别的技术流程
图像采集:通过摄像头或图像文件获取视觉数据。
颜色空间转换:将图像从 RGB 转换为 HSV 或 Lab 等更适合识别的模型。
区域提取:识别目标区域或物体轮廓。
颜色分析:统计像素值并判断颜色类别或比例。
结果输出:返回识别结果,如“红色球”、“绿色标签”、“蓝色背景”等。

(4)应用场景举例
教育实验:识别颜色球、颜色卡片进行互动教学
手机相机美颜或滤镜识别肤色与背景色
工业检测:识别产品颜色是否合格
智能交通:识别红绿灯颜色进行自动驾驶控制
零售系统:识别商品包装颜色进行分类
机器人视觉:识别颜色目标进行抓取或导航

(5)技术优势与挑战

 

59-.jpg


(6)颜色识别场景

 

77 (3).gif

四、【花雕动手做】HUSKYLENS 2 AI视觉传感器之识别颜色输出相关数据
可识别HUSKYLENS 2视野内的色块,并输出色块相关数据,可以读取的数据有:靠近HUSKYLENS 2摄像头画面中心的色块ID号、检测到的色块总数、第一个检测到的色块ID号等。识别颜色后,可获取画面中指定颜色的相关数据。例如,判断某个指定的颜色是否在画面中、指定颜色的名称、可获取画面中相同的指定颜色的色块数量,当画面中出现多个相同颜色的色块时,可指定获取其中某个色块的相关参数,包括名称、X/Y坐标、宽度、高度。

1、实际测试的几个范本

01 (1).jpg
01 (2).jpg
01 (3).jpg
01 (4).jpg

2、测试实验代码

 

代码
/*【花雕动手做】HUSKYLENS 2 AI视觉传感器之识别颜色输出相关数据
 * MindPlus
 * esp32s3bit
 */

#include "unihiker_k10.h"          // 引入UniHiker开发板库,提供显示屏控制接口
#include "DFRobot_HuskylensV2.h"   // 引入HUSKYLENS AI视觉传感器库,封装颜色识别算法

// 创建全局对象实例
HuskylensV2  huskylens;           // HUSKYLENS视觉传感器对象,负责图像采集和颜色识别
UNIHIKER_K10 k10;                 // UniHiker开发板对象,控制TFT显示屏和用户交互
uint8_t      screen_dir=2;        // 屏幕显示方向参数(2通常表示横向显示模式)


// 系统初始化函数 - 在设备上电时执行一次
void setup() {
	k10.begin();                    // 初始化UniHiker开发板基础硬件(GPIO、SPI、I2C、定时器)
	Wire.begin();                   // 初始化I2C通信总线,默认引脚SDA=8, SCL=9,400kHz速率
	
	// HUSKYLENS传感器初始化重试机制
	// 确保视觉传感器连接稳定并完成启动自检
	while (!huskylens.begin(Wire)) {
		delay(100);                 // 等待100ms后重试,避免I2C总线冲突
	}
	
	k10.initScreen(screen_dir);     // 按照指定方向初始化LCD显示屏驱动
	k10.creatCanvas();              // 创建图形画布缓冲区,实现双缓冲显示机制
	
	// 设置HUSKYLENS算法模式为颜色识别
	// 颜色识别基于色彩空间分析和区域聚类算法
	huskylens.switchAlgorithm(ALGORITHM_COLOR_RECOGNITION);
	
	// 在屏幕第2行显示系统标题
	k10.canvas->canvasText("识别颜色数据", 2, 0xFF0000);  // 红色标题,第2行
}

// 主循环函数 - 持续执行颜色识别和数据显示
void loop() {
	// 触发HUSKYLENS执行颜色识别算法并获取结果
	// 内部流程:图像采集 → 色彩空间转换 → 颜色聚类 → 区域分析 → 结果输出
	huskylens.getResult(ALGORITHM_COLOR_RECOGNITION);
	
	// 检查是否有新的颜色识别结果可用
	if ((huskylens.available(ALGORITHM_COLOR_RECOGNITION))) {
		// === 显示画面中心区域的色块ID ===
		// 每个颜色区域被分配一个唯一ID,用于跟踪和识别
		k10.canvas->canvasText((String("靠中心的色块ID: ") + 
			String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_COLOR_RECOGNITION), Result, ID)))), 
			4, 0x0000FF);  // 第4行,蓝色文字
		
		// === 显示检测到的色块总数 ===
		// 反映当前画面中识别到的独立颜色区域数量
		k10.canvas->canvasText((String("色块总数: ") + 
			String((huskylens.getCachedResultNum(ALGORITHM_COLOR_RECOGNITION)))), 
			5, 0x0000FF);  // 第5行,蓝色文字
		
		// === 显示中心色块的宽度和高度尺寸 ===
		// 提供颜色区域的物理尺寸信息,用于目标大小判断
		k10.canvas->canvasText((String("色块宽高: ") + 
			String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_COLOR_RECOGNITION), Result, width))) + 
			String((String(",") + 
			String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_COLOR_RECOGNITION), Result, height)))))))), 
			6, 0x0000FF);  // 第6行,蓝色显示尺寸信息
		
		// === 显示中心色块的坐标位置 ===
		// 提供颜色区域在图像中的空间位置信息
		k10.canvas->canvasText((String("色块坐标: ") + 
			String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_COLOR_RECOGNITION), Result, xCenter))) + 
			String((String(",") + 
			String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_COLOR_RECOGNITION), Result, yCenter)))))))), 
			7, 0x0000FF);  // 第7行,蓝色显示坐标信息
	}
	
	// 特殊处理:检查ID为1的特定色块是否存在
	// 这种按ID查询的方式适用于需要跟踪特定颜色目标的场景
	if (((huskylens.getCachedResultByID(ALGORITHM_COLOR_RECOGNITION, 1) != NULL))) {
		// === 显示ID=1的色块在画面中的出现次数 ===
		// 用于统计特定颜色目标的数量
		k10.canvas->canvasText((String("ID1色块总数:") + 
			String((huskylens.getCachedResultNumByID(ALGORITHM_COLOR_RECOGNITION, 1)))), 
			9, 0xFF0000);  // 第9行,红色文字,突出显示特定ID信息
		
		// === 显示ID=1的色块的颜色名称 ===
		// 颜色名称可能是预设的标签,如"红色"、"蓝色"等
		k10.canvas->canvasText((String("ID1色块名称:") + 
			String((RET_ITEM_STR(huskylens.getCachedResultByID(ALGORITHM_COLOR_RECOGNITION, 1), Result, name)))), 
			10, 0xFF0000);  // 第10行,红色显示颜色名称
	}
	
	// 更新画布显示:将内存缓冲区中的图形数据刷新到物理屏幕
	k10.canvas->updateCanvas();
	
	// 控制循环频率:50ms延迟对应20Hz刷新率
	delay(50);
}

4、代码解读和架构分析:

系统架构与核心技术
1. 硬件系统架构
text
┌─────────────────┐    I2C通信    ┌──────────────────┐
│   ESP32-S3      │◄─────────────►│   HUSKYLENS 2    │
│  (主控制器)     │                                          │  (AI视觉传感器) │
│   • 240MHz      │                                         │   • Kendryte K230│
│   • 双核处理器  │                                        │   • OV7740摄像头│
└─────────────────┘                    └──────────────────┘
        │
        │ SPI/并行接口
        ▼
┌─────────────────┐
│  UniHiker屏幕   │
│  (240x320 TFT)  │
└─────────────────┘
2. 软件架构层次
text
应用层: 颜色识别显示系统
   ↓
业务层: 双重查询策略(中心优先 + ID定向)
   ↓
算法层: HUSKYLENS固件(颜色识别引擎)
   ↓    ├── 色彩空间转换
驱动层: I2C通信协议 + 屏幕驱动   ├── 颜色聚类算法
   ↓    └── 区域特征提取
硬件层: 摄像头 + AI处理器 + 显示屏

代码执行流程深度分析
1. 初始化阶段技术细节
cpp
void setup() {
   k10.begin();                    // 初始化GPIO、SPI、I2C、定时器外设
   Wire.begin();                   // 初始化I2C,主机模式,400kHz时钟频率
   
   // 传感器握手协议 - 采用指数退避的简化版本
   while (!huskylens.begin(Wire)) {
       delay(100);                 // 固定间隔重试,实际产品建议递增延迟
   }
   
   k10.initScreen(screen_dir);     // 配置LCD控制器初始化序列
   k10.creatCanvas();              // 分配双缓冲显存,消除显示撕裂
   
   // 切换到颜色识别专用模式
   // 算法会在K210芯片上运行,不占用主控制器资源
   huskylens.switchAlgorithm(ALGORITHM_COLOR_RECOGNITION);
}
关键技术实现:
硬件抽象层:通过面向对象设计隐藏硬件差异
通信可靠性:I2C连接的重试机制确保系统稳定性
显示优化:双缓冲技术实现无闪烁更新

2. 主循环实时处理流水线
cpp
void loop() {
   // 阶段1: 触发识别并获取结果
   huskylens.getResult(ALGORITHM_COLOR_RECOGNITION);
   
   // 阶段2: 通用信息显示(中心色块)
   if (huskylens.available(ALGORITHM_COLOR_RECOGNITION)) {
       displayCenterColorInfo();   // 显示中心区域颜色信息
   }
   
   // 阶段3: 特定目标跟踪(ID=1的色块)
   if (huskylens.getCachedResultByID(ALGORITHM_COLOR_RECOGNITION, 1) != NULL) {
       displaySpecificColorInfo(); // 显示特定ID颜色信息
   }
   
   // 阶段4: 显示输出与时序控制
   k10.canvas->updateCanvas();
   delay(50);  // 精确的20Hz时序控制
}
颜色识别核心技术栈
1. HUSKYLENS颜色识别算法流程
text
图像采集(OV7740传感器)
   ↓
预处理(自动白平衡、曝光补偿)
   ↓
色彩空间转换(RGB → HSV/Lab)
   ↓
颜色阈值分割(预设颜色范围)
   ↓
形态学操作(去噪、填充)
   ↓
连通域分析(区域标记)
   ↓
特征提取(重心、面积、边界框)
   ↓
结果序列化(I2C数据包)

2. 颜色识别专用技术特性
色彩空间分析:
HSV空间优势:
H(色调):对光照变化不敏感
S(饱和度):区分颜色纯度
V(明度):处理亮度变化
区域检测算法:

cpp
// 伪代码表示的颜色检测流程
for each pixel in image:
   hsv = RGB_to_HSV(pixel.rgb)
   for each color_range in predefined_ranges:
       if hsv.h in range.h && hsv.s in range.s && hsv.v in range.v:
           mark_pixel_as_color(pixel, color_range.id)

// 连通域标记算法
regions = connected_component_labeling(color_mask)
for each region in regions:
   if region.area > min_area_threshold:
       calculate_centroid(region)
       calculate_bounding_box(region)
       assign_unique_id(region)
数据结构与信息架构
1. 颜色识别结果数据结构
cpp
// HUSKYLENS返回的颜色识别数据结构
typedef struct {
   uint16_t ID;                    // 色块唯一标识(用于目标跟踪)
   char name[32];                  // 颜色名称标签("red", "blue", "custom")
   uint16_t xCenter;               // 中心X坐标(0-320像素)
   uint16_t yCenter;               // 中心Y坐标(0-240像素) 
   uint16_t width;                 // 边界框宽度(像素)
   uint16_t height;                // 边界框高度(像素)
   uint32_t area;                  // 色块像素面积
   uint8_t R, G, B;                // 平均RGB颜色值
   float confidence;               // 识别置信度(0.0-1.0)
   Rect bounding_box;              // 完整边界框{x,y,width,height}
} ColorRecognitionResult;
2. 双重查询机制设计
中心优先查询策略:

cpp
// 获取画面中心区域的色块信息
huskylens.getCachedCenterResult(ALGORITHM_COLOR_RECOGNITION)
应用场景:视觉伺服、目标锁定
技术实现:计算所有色块到图像中心的距离,选择最近的一个
ID定向查询策略:

cpp
// 按预设ID获取特定颜色目标
huskylens.getCachedResultByID(ALGORITHM_COLOR_RECOGNITION, 1)
huskylens.getCachedResultNumByID(ALGORITHM_COLOR_RECOGNITION, 1)
应用场景:多目标跟踪、特定颜色识别
技术实现:维护ID到颜色特征的映射表

实时性能优化分析
1. 20Hz刷新率设计考量
cpp
delay(50); // 50ms周期的时间分配:
图像采集:8-12ms (摄像头传感器读取和传输)
颜色处理:15-20ms (K210芯片上的算法执行)
数据通信:3-5ms (I2C协议数据传输)
显示渲染:5-8ms (文本渲染和缓冲区交换)
系统余量:8-12ms (处理波动和中断响应)

2. 数据处理优化策略
cpp
// 条件执行避免不必要的处理开销
if (huskylens.available(ALGORITHM_COLOR_RECOGNITION)) {
   // 只在检测到新结果时更新显示
   // 减少字符串拼接和内存分配频率
}

// 特定ID的按需查询
if (huskylens.getCachedResultByID(ALGORITHM_COLOR_RECOGNITION, 1) != NULL) {
   // 只在目标存在时进行跟踪显示
}

关键技术难点与解决方案
1. 光照适应性挑战
问题:环境光照变化影响颜色识别准确性
解决方案:
自动白平衡:实时调整图像色温
自适应阈值:根据环境光动态调整颜色范围
色彩归一化:消除光照对颜色感知的影响

2. 多目标跟踪挑战
问题:同时识别和跟踪多个颜色目标
解决方案:
ID分配机制:为每个颜色区域分配唯一标识
时序一致性:基于运动预测的目标跟踪
数据关联:帧间目标匹配算法

应用场景技术适配
1. 工业分拣系统
技术要求:
高精度的颜色分类
快速的目标定位
多目标同时处理能力

2. 机器人视觉导航
技术要求:
实时的颜色目标跟踪
抗光照变化的鲁棒性
精确的空间位置信息

3. 智能交互系统
技术要求:
自然的人机交互接口
低延迟的视觉反馈
多模态信息融合

5、测试实验MInd+图形编程

 

02.jpg

 

6、实验场景图

 

03 (1).jpg
03 (2).jpg
03 (3).jpg
03 (4).jpg
03 (5).jpg
03 (6).jpg
03 (7).jpg

 

评论

user-avatar
icon 他的勋章
    展开更多