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

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

头像 驴友花雕 2025.11.20 12 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.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

评论

user-avatar
  • 罗罗罗

    罗罗罗2025.11.21

    厉害

    1
    • 驴友花雕

      驴友花雕2025.11.21

      谢谢罗罗罗老师的鼓励!

icon 他的勋章
    展开更多