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

2025-11-20196
AI 快速预览详细 收起
本文介绍了如何使用HUSKYLENS 2 AI视觉传感器和行空板K10实现车牌识别。HUSKYLENS 2支持多种预置AI模型,包括车牌识别。通过I2C接口连接行空板K10和HUSKYLENS 2,可以实时提取车牌号码、位置等信息。该项目适用于智能交通管理和停车系统,适合学生进行STEAM实践。

一、相关知识点
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.jpg
01-.jpg
02.jpg

三、车牌识别(License Plate Recognition,简称 LPR)是一种基于计算机视觉和图像处理的智能识别技术,主要用于自动检测、识别并解析车辆车牌上的文字和数字信息。车牌识别是智慧城市和智能交通的关键技术之一,也是智能交通系统(ITS)中的核心功能之一,广泛应用于停车管理、道路监控、电子收费、安防等领域。

 

16.jpg

 

(1)车牌识别的基本定义
车牌识别是指:通过摄像头采集车辆图像,并利用图像处理与字符识别算法,自动提取车牌区域,识别车牌号码、颜色、类型等信息。
它让系统具备“看懂车牌”的能力,从而实现自动化管理与数据记录。

(2)车牌识别的关键流程
图像采集:通过固定或移动摄像头拍摄车辆图像。
车牌定位:在图像中识别车牌区域,排除背景干扰。
图像预处理:去除噪声、增强对比度、校正倾斜等。
字符分割:将车牌上的字符逐个提取出来。
字符识别:使用 OCR(光学字符识别)技术识别文字和数字。
结果输出:返回车牌号码、颜色、归属地等信息。

(3)应用场景举例
智能停车场自动识别进出车辆
交通执法系统识别违章车辆
高速公路电子收费(ETC)
企业或小区门禁车辆管理
边境或海关车辆身份核验

(4)常见参数设置(在识别系统中)

 

01.jpg


(5)相关场景

 

02.gif03.jpg05.gif
 

四、【花雕动手做】HUSKYLENS 2 AI视觉传感器之识别车牌输出相关数据
在车牌识别功能下,当车牌出现在HUSKYLENS 2屏幕中时,可以被识别和框出,并获车牌的相关数据。可以读取车牌的数据有:指定车牌的ID、名称、车牌内容(车牌号)、宽度、高度以及车牌中心点的X坐标位置和Y坐标位置,画面中的车牌总数。

1、实际测试的几个范本

 

000.jpg
00.jpg
00-.jpg
00-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传感器初始化重试机制
	// 确保AI视觉传感器正常连接并完成启动自检
	while (!huskylens.begin(Wire)) {
		delay(100);                 // 等待100ms后重试,避免I2C总线冲突和电源冲击
	}
	
	k10.initScreen(screen_dir);     // 按照指定方向初始化LCD显示屏控制器
	k10.creatCanvas();              // 创建图形画布缓冲区,实现双缓冲显示机制
	
	// 设置HUSKYLENS算法模式为车牌识别
	// 车牌识别是计算机视觉中的特定目标检测与OCR结合的应用
	huskylens.switchAlgorithm(ALGORITHM_LICENSE_RECOGNITION);
	
	// 在屏幕第2行显示系统标题
	k10.canvas->canvasText("识别车牌数据", 2, 0xFF0000);  // 红色标题,第2行
}

// 主循环函数 - 持续执行车牌识别和数据显示
void loop() {
	// 触发HUSKYLENS执行车牌识别算法并获取结果
	// 内部处理流程:图像采集 → 车牌区域检测 → 字符分割 → 字符识别 → 结果输出
	huskylens.getResult(ALGORITHM_LICENSE_RECOGNITION);
	
	// 检查是否有新的车牌识别结果可用
	if ((huskylens.available(ALGORITHM_LICENSE_RECOGNITION))) {
		// === 显示画面中心区域的车牌名称 ===
		// 名称可能是车牌的类型标识或自定义标签
		k10.canvas->canvasText((String("靠中心的车牌名称: ") + 
			String((RET_ITEM_STR(huskylens.getCachedCenterResult(ALGORITHM_LICENSE_RECOGNITION), Result, name)))), 
			4, 0x0000FF);  // 第4行,蓝色文字
		
		// === 显示检测到的车牌总数 ===
		// 反映当前画面中识别到的独立车牌数量
		k10.canvas->canvasText((String("车牌总数: ") + 
			String((huskylens.getCachedResultNum(ALGORITHM_LICENSE_RECOGNITION)))), 
			5, 0x0000FF);  // 第5行,蓝色文字,环境统计信息
		
		// === 显示中心车牌的内容标签 ===
		k10.canvas->canvasText("靠中心的车牌内容: ", 6, 0x0000FF);  // 第6行,蓝色标签
		
		// === 显示中心车牌识别的具体号码内容 ===
		// 这是车牌识别的核心结果,如"京A·12345"
		k10.canvas->canvasText((RET_ITEM_STR(huskylens.getCachedCenterResult(ALGORITHM_LICENSE_RECOGNITION), Result, content)), 
			7, 0x0000FF);  // 第7行,蓝色显示识别出的车牌号码
		
		// === 显示车牌位置信息标签 ===
		k10.canvas->canvasText("靠中心车牌的", 8, 0x0000FF);  // 第8行,蓝色标签
		
		// === 显示车牌的中心坐标信息 ===
		// xCenter, yCenter表示车牌在图像中的中心点坐标
		// 用于后续的跟踪、测距或其他空间分析
		k10.canvas->canvasText((String("中心坐标: ") + 
			String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_LICENSE_RECOGNITION), Result, xCenter))) + 
			String((String(",") + 
			String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_LICENSE_RECOGNITION), Result, yCenter)))))))), 
			9, 0x0000FF);  // 第9行,蓝色显示坐标信息
	}
	
	// 更新画布显示:将内存缓冲区中的图形数据一次性刷新到物理屏幕
	// 采用双缓冲技术确保显示平滑,避免闪烁
	k10.canvas->updateCanvas();
	
	// 控制循环频率:50ms延迟对应20Hz刷新率
	// 平衡识别实时性、处理负载和系统功耗
	delay(50);
}

3、代码解读:

系统架构与硬件平台
1. 整体硬件架构

 

25-.jpg

 

2. 软件架构层次
text
应用层: 车牌识别显示系统
   ↓
算法层: HUSKYLENS固件(车牌识别专用算法)
   ↓    ├── 车牌检测(YOLO/SSD)
驱动层: I2C通信协议 + 屏幕驱动   ├── 字符分割(投影法)
   ↓    └── 字符识别(CNN)
硬件层: 摄像头 + 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();              // 分配双缓冲显存,避免显示撕裂
   
   // 切换至车牌识别专用算法模式
   huskylens.switchAlgorithm(ALGORITHM_LICENSE_RECOGNITION);
}
关键技术实现:
硬件抽象:通过面向对象封装底层硬件差异
通信可靠性:I2C连接的重试机制确保系统鲁棒性
显示优化:双缓冲技术消除屏幕闪烁

2. 主循环实时处理流水线
cpp
void loop() {
   // 阶段1: 数据采集与处理(触发识别)
   huskylens.getResult(ALGORITHM_LICENSE_RECOGNITION);
   
   // 阶段2: 状态检查与数据可用性验证
   if (huskylens.available(ALGORITHM_LICENSE_RECOGNITION)) {
       // 阶段3: 信息提取与可视化渲染
       extractAndDisplayLicenseInfo();
   }
   
   // 阶段4: 显示输出与时序控制
   k10.canvas->updateCanvas();
   delay(50);  // 精确的时序控制
}
车牌识别核心技术栈
1. HUSKYLENS车牌识别算法流程
text
图像采集
   ↓
预处理(去噪、对比度增强、色彩空间转换)
   ↓
车牌区域检测(基于颜色、纹理、形状特征)
   ↓
车牌矫正(透视变换、旋转校正)
   ↓
字符分割(垂直投影、连通域分析)
   ↓
字符识别(卷积神经网络分类)
   ↓
后处理(规则校验、格式标准化)
   ↓
结果输出(结构化数据)
2. 车牌识别专用技术特性
车牌检测阶段技术:
颜色模型:HSV色彩空间中的蓝色/黄色区域检测
边缘特征:Sobel算子提取车牌边框特征
形态学操作:开运算、闭运算消除噪声
长宽比过滤:基于车牌标准尺寸的比例筛选

字符识别阶段技术:
投影分割:垂直投影法分离单个字符
模板匹配:与标准字符模板进行相似度计算
CNN分类:使用训练好的神经网络识别字符
规则引擎:基于车牌编码规则进行校验和纠正

数据结构与信息架构
1. 车牌识别结果数据结构
cpp
// HUSKYLENS返回的车牌识别数据结构
typedef struct {
   uint16_t ID;                    // 目标唯一标识(用于跟踪)
   char name[32];                  // 车牌类型标识("蓝牌","黄牌","新能源")
   char content[16];               // 识别出的车牌号码("京A·12345")
   uint16_t xCenter;               // 中心X坐标(0-320)
   uint16_t yCenter;               // 中心Y坐标(0-240)
   uint16_t width;                 // 检测框宽度
   uint16_t height;                // 检测框高度
   float confidence;               // 整体识别置信度(0.0-1.0)
   Rect boundingBox;               // 完整边界框坐标
   char province[4];               // 省份简称("京","沪","粤")
   char plateColor[8];             // 车牌颜色("blue","yellow","green")
} LicensePlateResult;
2. 信息显示架构设计
text
行2: [系统标题]           - 红色突出,项目标识
    ↓
行4: [车牌名称]           - 蓝色,类型分类信息
    ↓  
行5: [车牌总数]           - 蓝色,环境感知统计
    ↓
行6-7: [车牌号码]         - 蓝色,核心识别结果
    ↓
行8-9: [空间坐标]         - 蓝色,定位信息
实时性能优化分析
1. 20Hz刷新率设计考量
cpp
delay(50); // 50ms周期分解:
图像采集与传输:8-12ms (OV摄像头数据读取)
车牌检测推理:18-22ms (神经网络前向计算)
字符识别处理:10-14ms (OCR流水线)
数据通信:2-3ms (I2C数据传输)
显示渲染:3-5ms (文本渲染和缓冲交换)
系统余量:3-5ms (处理波动余量)

2. 数据处理优化策略
cpp
// 条件执行避免不必要的处理开销
if (huskylens.available(ALGORITHM_LICENSE_RECOGNITION)) {
   // 只在检测到新结果时更新显示
   // 减少字符串操作和内存分配频率
}
关键技术难点与解决方案
1. 复杂环境适应性
挑战:光照变化影响
解决方案:自动白平衡、自适应阈值、多尺度检测
挑战:角度倾斜变形
解决方案:仿射变换矫正、关键点检测、透视校正
挑战:运动模糊干扰
解决方案:时序滤波、多帧融合、运动补偿

2. 多目标处理能力
cpp
// 支持同时识别多个车牌
huskylens.getCachedResultNum(ALGORITHM_LICENSE_RECOGNITION)
// 返回当前帧中检测到的所有车牌数量
 

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

 

22-.jpg


5、实验场景图

 

27 (1).jpg
27 (2).jpg
27 (3).jpg
27 (4).jpg
27 (5).jpg
27 (6).jpg
27 (7).jpg
27 (8).jpg
27 (9).jpg
27 (10).jpg
27 (11).jpg

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(1)
罗罗罗
厉害
驴友花雕
驴友花雕
作者
回复罗罗罗
谢谢罗罗罗老师的鼓励!
- 没有更多了 -