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

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

头像 驴友花雕 2025.11.18 18 2

一、相关知识点
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实践。

 

13.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.jpg01-.jpg02.jpg
 

三、识别二维码,是指通过图像采集与解码技术,从二维码图案中提取出所包含的信息。二维码(QR Code)是一种二维条码,它以黑白模块构成的矩阵图案编码数据,具有高密度、容错性强、可快速读取等特点。

(1)什么是二维码识别?
二维码识别是指设备(如摄像头、扫描器或图像处理系统)对二维码图像进行分析、定位、解码,从而获取其中存储的信息,如网址、文本、产品编号、身份信息等。

(2)识别流程简述
图像采集:通过摄像头或扫描器获取二维码图像。
图像预处理:去除噪声、增强对比度、校正角度。
定位二维码区域:识别二维码的位置与边界。
解码分析:根据二维码标准(如 QR Code、Data Matrix)解析模块排列,提取编码数据。
输出信息:将解码结果转换为可读内容,如字符串、链接、指令等。

(3)技术实现方式
硬件识别:使用专用扫码枪或嵌入式模块进行快速识别。
软件识别:利用图像处理库(如 OpenCV、Zxing、ZBar)在计算机或移动设备上识别二维码。
AI增强识别:结合深度学习模型提升识别准确率,尤其在模糊、遮挡或复杂背景下。

(4)应用场景
移动支付与扫码登录
工业自动化与产品追踪
医疗标签与药品识别
零售商品管理与促销活动
门票验证与身份识别

 

10 (1).gif
10 (2).gif
10 (3).gif

四、HUSKYLENS 2能识别出现在画面中的二维码,可以通过编程获取画面中检测到的二维码相关数据。可以读取的二维码数据有:检测到的二维码总数,指定二维码的数据,包括二维码ID、内容、宽度、高度以及二维码中心点的X坐标位置和Y坐标位置。

1、实际测试的几个范本

 

10 (1).jpg
10 (2).jpg
10 (3).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开发板对象,控制显示屏和外围设备
uint8_t      screen_dir=2;        // 屏幕方向参数(2通常表示横向显示模式)


// 系统初始化函数
void setup() {
	k10.begin();                    // 初始化UniHiker开发板基础硬件(GPIO、时钟等)
	Wire.begin();                   // 初始化I2C通信协议,默认引脚SDA=8, SCL=9
	
	// HUSKYLENS传感器初始化重试循环
	// 确保传感器连接稳定后再继续执行
	while (!huskylens.begin(Wire)) {
		delay(100);                 // 等待100ms后重试,避免I2C总线冲突
	}
	
	k10.initScreen(screen_dir);     // 按照指定方向初始化LCD显示屏
	k10.creatCanvas();              // 创建画布缓冲区,实现双缓冲显示机制
	
	// 设置HUSKYLENS算法模式为二维码识别
	// QR Code是一种矩阵式二维条码,具有高密度编码和大容量数据存储特性
	huskylens.switchAlgorithm(ALGORITHM_QRCODE_RECOGNITION);
	
	// 在屏幕第一行显示固定的标题文本
	k10.canvas->canvasText("识别二维码数据", 1, 0x0000FF);  // 蓝色标题,第1行
}

// 主循环函数 - 持续执行二维码识别和数据显示
void loop() {
	// 触发HUSKYLENS执行二维码识别算法并获取结果
	huskylens.getResult(ALGORITHM_QRCODE_RECOGNITION);
	
	// 检查是否有新的二维码识别结果可用
	if ((huskylens.available(ALGORITHM_QRCODE_RECOGNITION))) {
		// === 显示靠近画面中心的二维码ID ===
		// 使用getCachedCenterResult优先获取视觉焦点区域的二维码
		k10.canvas->canvasText((String("靠中心的二维码ID: ") + 
			String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_QRCODE_RECOGNITION), Result, ID)))), 
			2, 0xFF0000);  // 第2行,红色文字,突出显示中心目标
		
		// === 显示检测到的二维码总数 ===
		// getCachedResultNum返回当前帧中识别到的所有二维码数量
		k10.canvas->canvasText((String("二维码总数: ") + 
			String((huskylens.getCachedResultNum(ALGORITHM_QRCODE_RECOGNITION)))), 
			3, 0x0000FF);  // 第3行,蓝色文字,显示环境统计
		
		// === 显示第一个检测到的二维码ID ===
		// getCachedResultByIndex按检测顺序获取,索引从0开始(1-1=0)
		k10.canvas->canvasText((String("第一个二维码ID: ") + 
			String((RET_ITEM_NUM(huskylens.getCachedResultByIndex(ALGORITHM_QRCODE_RECOGNITION, 1-1), Result, ID)))), 
			4, 0xFF0000);  // 第4行,红色文字
		
		// === 显示第一个二维码的名称标签 ===
		k10.canvas->canvasText("第一个二维码名称: ", 5, 0x00FFFF);  // 第5行,青色标签文字
		
		// === 显示第一个二维码的具体名称 ===
		// RET_ITEM_STR宏从结果结构中提取字符串类型的name字段
		k10.canvas->canvasText((RET_ITEM_STR(huskylens.getCachedResultByIndex(ALGORITHM_QRCODE_RECOGNITION, 1-1), Result, name)), 
			6, 0x00FFFF);  // 第6行,青色显示实际名称
		
		// === 显示第一个二维码的内容标签 ===
		// 注意:这里文本描述有歧义,应为"第一个二维码内容"
		k10.canvas->canvasText("第一个标签二维码内容: ", 7, 0x0000FF);  // 第7行,蓝色标签文字
		
		// === 显示第一个二维码的编码内容 ===
		// 提取二维码中存储的实际数据内容(URL、文本等信息)
		k10.canvas->canvasText((RET_ITEM_STR(huskylens.getCachedResultByIndex(ALGORIUM_QRCODE_RECOGNITION, 1-1), Result, content)), 
			8, 0x0000FF);  // 第8行,蓝色显示具体内容
	}
	
	// 更新画布显示:将内存缓冲区中的图形数据刷新到物理屏幕
	k10.canvas->updateCanvas();
	
	// 控制循环频率:50ms延迟对应20Hz刷新率
	// 平衡识别实时性和系统功耗
	delay(50);
}

代码解读:

系统架构与硬件平台
1. 硬件组成架构

2. 核心组件功能
ESP32-S3: 双核Xtensa处理器,负责系统调度和数据处理
HUSKYLENS 2: 专有AI芯片,集成二维码识别算法
UniHiker屏幕: TFT-LCD显示屏,提供用户交互界面

代码执行流程深度分析
1. 初始化阶段 (setup())
cpp
// 硬件初始化序列
k10.begin();                    // 1. 开发板基础外设初始化
Wire.begin();                   // 2. I2C总线初始化(400kHz)

// 传感器连接建立(采用重试机制)
while (!huskylens.begin(Wire)) {
   delay(100);                 // 指数退避算法的简化实现
}

// 显示系统初始化
k10.initScreen(screen_dir);     // 3. 屏幕驱动初始化
k10.creatCanvas();              // 4. 创建双缓冲画布

// 算法模式配置
huskylens.switchAlgorithm(ALGORITHM_QRCODE_RECOGNITION); // 5. 切换识别模式
关键技术点
渐进式初始化: 按依赖关系顺序初始化各模块
容错设计: 传感器连接失败时的自动重试机制
资源预分配: 画布缓冲区提前分配,避免运行时内存碎片

2. 主循环处理流程 (loop())
cpp
// 实时处理流水线
huskylens.getResult(ALGORITHM_QRCODE_RECOGNITION);  // 数据采集
if (huskylens.available(...)) {                      // 状态检查
   // 数据处理与显示更新
   DisplayQRCodeInfo();                             // 信息提取与渲染
}
k10.canvas->updateCanvas();                          // 显示输出
delay(50);                                           // 时序控制
二维码识别技术栈解析
1. HUSKYLENS识别算法流程
text
图像传感器采集
   ↓
图像预处理(降噪、二值化)
   ↓
定位图案检测(三个定位角)
   ↓
格式信息解码(纠错等级、掩码模式)
   ↓
数据区域解析(按zig-zag模式读取)
   ↓
RS纠错解码(Reed-Solomon算法)
   ↓
数据输出(原始字节流)

2. 数据结构与内存管理
cpp
// HUSKYLENS返回的数据结构示意
typedef struct {
   uint16_t ID;        // 二维码唯一标识
   char name[32];      // 二维码名称(可自定义)
   char content[256];  // 解码后的数据内容
   uint16_t x, y;      // 屏幕坐标位置
   uint16_t width;     // 识别区域宽度
   uint16_t height;    // 识别区域高度
   float confidence;   // 识别置信度
} QRCodeResult;
显示系统架构分析
1. 双缓冲显示机制
cpp
// 显示缓冲区管理
k10.creatCanvas();              // 创建离屏缓冲区(Back Buffer)
// 所有绘制操作在离屏缓冲区进行
k10.canvas->updateCanvas();     // 缓冲区交换(Present)
优势:
避免屏幕闪烁(tearing)
提高渲染效率
支持复杂的图形操作

2. 信息可视化设计
cpp
// 颜色编码策略
0xFF0000: 红色 - 关键标识(ID信息),高优先级
0x0000FF: 蓝色 - 数据内容,中等优先级  
0x00FFFF: 青色 - 描述信息,低优先级

// 布局层次
行1: 系统标题(固定)
行2: 视觉焦点(中心二维码)
行3: 环境感知(数量统计)
行4-8: 详细信息(首个二维码深度解析)
实时性能优化策略
1. 时序控制分析
cpp
delay(50); // 20Hz刷新率设计考量:
识别延迟: 二维码识别算法约需30-40ms处理时间
显示刷新: TFT屏幕刷新需要5-10ms
系统余量: 保留5ms余量应对处理波动

2. 数据处理优化
cpp
// 条件执行避免不必要的处理
if (huskylens.available(...)) {
   // 只在有新识别结果时更新显示
   // 减少字符串操作和内存分配
}
错误处理与鲁棒性设计
1. 传感器通信可靠性
cpp
// I2C通信错误处理
while (!huskylens.begin(Wire)) {
   delay(100); // 简单的重试机制
   // 实际产品中可加入:
   // - 重试次数限制
   // - 错误日志记录
   // - 降级运行模式
}
2. 数据显示稳定性
cpp
// 通过双缓冲避免显示异常
// 即使数据处理出现异常,显示也不会出现撕裂
应用场景技术适配
1. 不同二维码类型的处理
cpp
// HUSKYLENS支持的二维码变种:
// - QR Code (最常用)
// - Micro QR (小型二维码)
// - iQR Code (可变形二维码)
2. 环境适应性考虑
cpp
// 影响识别率的因素处理:
// 光照条件: 自动曝光调整
// 角度倾斜: 透视变换校正
// 部分遮挡: 纠错码恢复

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

 

17-.jpg

 

5、实验场景图

 

18 (1).jpg
18 (2).jpg
18 (3).jpg
18 (4).jpg
18 (5).jpg

评论

user-avatar
  • 罗罗罗

    罗罗罗2025.11.20

    666

    1
    • 驴友花雕

      驴友花雕2025.11.20

      感谢罗罗罗老师的许多支持和鼓励!

icon 他的勋章
    展开更多