1.软硬件说明

1.1Arduino IDE介绍

Arduino IDE(Integrated Development Environment,集成开发环境)是专门为 Arduino 开源硬件平台 设计的一款编程软件,用于编写、编译和上传程序到 Arduino 主控板(如 UNO、MEGA、Nano、ESP32 等)。它是所有 Arduino 项目开发的核心工具。

Arduino IDE官网:https://www.arduino.cc/en/software/

1.2行空板K10介绍

行空板K10是一款专为快速体验和学习人工智能而设计的开发学习板,100%采用国产芯片,知识产权自主可控,符合信息科技课程中编程学习、物联网及人工智能等教学需求。该板集成LCD彩屏、WiFi蓝牙、摄像头、麦克风、扬声器、RGB指示灯、多种传感器及丰富的扩展接口。凭借高度集成的板载资源,教学过程中无需额外连接其他设备,便可轻松实现传感器控制、物联网应用以及人脸识别、语音识别、语音合成等人工智能项目。

行空板K10商城购买链接:https://www.dfrobot.com.cn/goods-4014.html

2.硬件连接

准备材料

  • 硬件
    • 行空板K10 x 1
    • HUSKYLENS 2 x 1
    • USB数据线 x2
    • 4pin连接线(或杜邦线)x1

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

Interface Diagram

3.编程准备

3.1安装行空板K10 SDK

从官网下载Arduino IDE::https://www.arduino.cc/en/software/

安装 Arduino IDE SDK

在Arduino IDE中,行空板K10将会以SDK(软件开发包)的形式在下载后集成入Arduino IDE。

  • SDK URL:
    https://downloadcd.dfrobot.com.cn/UNIHIKER/package_unihiker_index.json
  • 在Arduino IDE中打开 "File->Preference"

Interface Diagram

将 "Compiler warnings" 设置为 none

Interface Diagram

点击下图箭头中的按钮来添加SDK URL

Interface Diagram

在对话框中另起一行,添加本文上方的SDK URL:

https://downloadcd.dfrobot.com.cn/UNIHIKER/package_unihiker_index.json
最后点击OK。

Interface Diagram

打开 "Tools->Board->Boards Manager"

Interface Diagram

在对话框中搜索"unihiker"并且点击install进行安装

Interface Diagram

等待安装完成后,即可在Arduino IDE中选择行空板k10(unihiker k10)进行开发.

Interface Diagram

3.2加载HUSKYLENS 2 库

第一步:首先需要下载HUSKYLENS Arduino Library,

点击此处进行下载:https://gitee.com/dfrobot/DFRobot_HuskylensV2/repository/archive/master.zip

第二步:将下载的文件解压到Arduino IDE所在的“libraries”文件夹的目录下,并将文件名修改为HUSKYLENS2。

Interface Diagram

4.人脸识别代码示例

4.1识别人脸输出相关数据

在人脸识别功能下,当人脸出现在HuskyLens 2屏幕中时,可以被检测和框出,从而获取检测到的人脸总数、指定人脸的相关数据。

示例程序如下。

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
    }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_FACE_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_FACE_RECOGNITION);
	if ((huskylens.available(ALGORITHM_FACE_RECOGNITION))) {
		if (((huskylens.getCachedResultByID(ALGORITHM_FACE_RECOGNITION, 1) != NULL))) {
			k10.canvas->canvasText((String("人脸总数:") + String((huskylens.getCachedResultNum(ALGORITHM_FACE_RECOGNITION)))), 1, 0xFF0000);
			k10.canvas->canvasText((String("靠中心的人脸ID:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), Result, ID)))), 3, 0xFF0000);
			k10.canvas->canvasText((String("第一个人脸ID:") + String((RET_ITEM_NUM(huskylens.getCachedResultByIndex(ALGORITHM_FACE_RECOGNITION, 1-1), Result, ID)))), 5, 0xFF0000);
			k10.canvas->updateCanvas();
		}
	}
}

将HuskyLens 2的摄像头对准画面中的人脸分别学习,如何学习人脸详细操作请看:人脸识别

学习完成后,对准该人脸,可在K10屏幕上观察输出结果。

**运行结果:**如下,可以获取画面中检测到的人脸总数,不论该人脸是否已学习;可以指定获取靠近摄像头画面中心的人脸ID、第一个检测到的人脸ID(未学习过的人脸ID为0)。

Interface Diagram

4.2获取指定人脸的五官数据

可以获取指定人脸的五官、位置数据,可以读取的人脸数据有:人脸ID、人脸名称、宽度、高度以及人脸中心点的X坐标位置和Y坐标位置、左/右眼X坐标、左/右眼Y坐标、左/右嘴角X坐标、左/右嘴角Y坐标、鼻子X/Y坐标位置。

如以下示例程序可以获取靠近摄像头中心画面的人脸的五官数据,未学习的人脸亦可获取。

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
    }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_FACE_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_FACE_RECOGNITION);
	if ((huskylens.available(ALGORITHM_FACE_RECOGNITION))) {
		k10.canvas->canvasText((String("靠中心的人脸ID:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), Result, ID)))), 1, 0xFF0000);
		k10.canvas->canvasText((String("其左眼坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), FaceResult, leye_x))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), FaceResult, leye_y)))))))), 3, 0xFF0000);
		k10.canvas->canvasText((String("其右眼坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), FaceResult, reye_x))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), FaceResult, reye_y)))))))), 5, 0xFF0000);
		k10.canvas->canvasText((String("左嘴角坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), FaceResult, lmouth_x))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), FaceResult, lmouth_y)))))))), 7, 0xFF0000);
		k10.canvas->canvasText((String("右嘴角坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), FaceResult, rmouth_x))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), FaceResult, rmouth_y)))))))), 9, 0xFF0000);
		k10.canvas->canvasText((String("其鼻子坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), FaceResult, nose_x))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), FaceResult, nose_y)))))))), 11, 0xFF0000);
		k10.canvas->updateCanvas();
	}
}

**运行结果:**如下图,运行程序,行空板K10屏幕上显示人脸ID号及该人脸的五官坐标数据。由于该人脸未学习,因此人脸ID为0。

Interface Diagram

4.3获取指定人脸的相关数据

除上述数据以外,还可以获取更多人脸数据,如画面中某个指定人脸的总数、该人脸的名称、第一个该人脸的相关数据。(未学习的人脸亦可获取以上数据)

以某个已学习的人脸为例,示例程序如下:

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
    }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_FACE_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_FACE_RECOGNITION);
	if ((huskylens.available(ALGORITHM_FACE_RECOGNITION))) {
		if (((huskylens.getCachedResultByID(ALGORITHM_FACE_RECOGNITION, 1) != NULL))) {
			k10.canvas->canvasText((String("人脸总数:") + String((huskylens.getCachedResultNum(ALGORITHM_FACE_RECOGNITION)))), 1, 0xFF0000);
			k10.canvas->canvasText((String("靠中心的人脸ID:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_FACE_RECOGNITION), Result, ID)))), 3, 0xFF0000);
			k10.canvas->canvasText((String("第一个人脸ID:") + String((RET_ITEM_NUM(huskylens.getCachedResultByIndex(ALGORITHM_FACE_RECOGNITION, 1-1), Result, ID)))), 5, 0xFF0000);
			k10.canvas->updateCanvas();
		}
	}
}

**运行结果:**如下图,运行程序,行空板K10屏幕上显示画面中ID1人脸总数、该人脸的名称,第一个检测到的ID1人脸中心XY坐标。

Interface Diagram

5.物体识别代码示例

5.1识别物体输出相关数据

可识别HuskyLens 2视野内的物体(须是可识别的80种固定类别物体,详见物体识别功能介绍,获取物体相关数据,可以读取的数据有:画面中可识别物体的总数、靠近HuskyLens 2摄像头画面中心的物体ID号、检测到的第一个物体。

示例程序如下。

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
    }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_OBJECT_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_OBJECT_RECOGNITION);
	if ((huskylens.available(ALGORITHM_OBJECT_RECOGNITION))) {
		k10.canvas->canvasText((String("物体总数:") + String((huskylens.getCachedResultNum(ALGORITHM_OBJECT_RECOGNITION)))), 1, 0x0000FF);
		k10.canvas->canvasText((String("靠中心的物体:") + String((RET_ITEM_STR(huskylens.getCachedCenterResult(ALGORITHM_OBJECT_RECOGNITION), Result, name)))), 3, 0x0000FF);
		k10.canvas->canvasText((String("第一个物体ID:") + String((RET_ITEM_NUM(huskylens.getCachedResultByIndex(ALGORITHM_OBJECT_RECOGNITION, 1 - 1), Result, ID)))), 5, 0x0000FF);
	}
	k10.canvas->updateCanvas();
	delay(50);
}

程序上传成功后HuskyLens 2进入物体识别功能。将HuskyLens 2的摄像头对准画面中的物体分别学习

学习完成后,对准该物体,可在K10屏幕上观察输出结果。

**运行结果:**可输出识别到的物体总数,可按要求输出相应物体ID号、名称等数据。如果符合要求的物体没有被学习,则ID号为0。

Interface Diagram

5.2获取画面中指定物体的相关数据

HuskyLens 2识别物体后,可获取画面中指定物体的相关数据。例如,判断某个指定的物体是否在画面中、指定物体的名称、可获取画面中指定同类物体的数量,当画面中出现多个同类物体时,可指定获取其中某个物体的相关参数,包括名称、X/Y坐标、宽度、高度。

示例程序如下:

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
    }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_OBJECT_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_OBJECT_RECOGNITION);
	if ((huskylens.available(ALGORITHM_OBJECT_RECOGNITION))) {
		if (((huskylens.getCachedResultByID(ALGORITHM_OBJECT_RECOGNITION, 2) != NULL))) {
			k10.canvas->canvasText((String("检测到几个ID2:") + String((huskylens.getCachedResultNumByID(ALGORITHM_OBJECT_RECOGNITION, 2)))), 1, 0x0000FF);
			k10.canvas->canvasText((String("ID2物体的名称:") + String((RET_ITEM_STR(huskylens.getCachedResultByID(ALGORITHM_OBJECT_RECOGNITION, 2), Result, name)))), 3, 0x0000FF);
			k10.canvas->canvasText("第一个ID2物体", 5, 0x0000FF);
			k10.canvas->canvasText((String("的坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_OBJECT_RECOGNITION, 2, 1-1), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_OBJECT_RECOGNITION, 2, 1-1), Result, yCenter)))))))), 6, 0x0000FF);
		}
	}
	k10.canvas->updateCanvas();
	delay(50);
}

**运行结果:**如图所示,可获取到画面中的物体总数、画面中ID2物体数量、名称,以及检测到的第一个ID2物体的坐标位置。

Interface Diagram

6.物体追踪代码示例

6.1追踪物体输出相关数据

当HUSKYLENS 2检测到可追踪的目标物体时,可获取相关追踪数据。可以获取的数据有:物体的ID、名称、xy坐标、宽度、高度。

示例程序如下。

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_OBJECT_TRACKING);
}
void loop() {
	huskylens.getResult(ALGORITHM_OBJECT_TRACKING);
	if ((huskylens.available(ALGORITHM_OBJECT_TRACKING))) {
		k10.canvas->canvasText((String("物体ID:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_OBJECT_TRACKING), Result, ID)))), 1, 0x0000FF);
		k10.canvas->canvasText((String("物体名称:") + String((RET_ITEM_STR(huskylens.getCachedCenterResult(ALGORITHM_OBJECT_TRACKING), Result, name)))), 3, 0x0000FF);
		k10.canvas->canvasText((String("物体xy坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_OBJECT_TRACKING), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_OBJECT_TRACKING), Result, yCenter)))))))), 5, 0x0000FF);
		k10.canvas->canvasText((String("物体宽高:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_OBJECT_TRACKING), Result, width))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_OBJECT_TRACKING), Result, height)))))))), 7, 0x0000FF);
	}
	k10.canvas->updateCanvas();
	delay(50);
}

上传程序,等待程序上传完成后。

将HUSKYLENS 2摄像头对准要追踪的物体(追踪物体须先框选目标,详见 物体追踪使用说明

框选完成后,对准要追踪的目标物体,可观察输出结果。

**运行结果:**可输出追踪到的物体ID、名称、xy坐标、宽度、高度。物体名称默认为"物体"。

Interface Diagram

7.颜色识别代码示例

7.1识别颜色输出相关数据

可识别HUSKYLENS 2视野内的色块,并输出色块相关数据,可以读取的数据有:靠近HUSKYLENS 2摄像头画面中心的色块ID号、检测到的色块总数、第一个检测到的色块ID号等。

示例程序如下

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_COLOR_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_COLOR_RECOGNITION);
	if ((huskylens.available(ALGORITHM_COLOR_RECOGNITION))) {
		k10.canvas->canvasText((String("靠近中心的色块ID:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_COLOR_RECOGNITION), Result, ID)))), 1, 0x0000FF);
		k10.canvas->canvasText((String("色块总数:") + String((huskylens.getCachedResultNum(ALGORITHM_COLOR_RECOGNITION)))), 3, 0x0000FF);
		k10.canvas->canvasText((String("第一个色块ID:") + String((RET_ITEM_NUM(huskylens.getCachedResultByIndex(ALGORITHM_COLOR_RECOGNITION, 1-1), Result, ID)))), 5, 0x0000FF);
	}
	k10.canvas->updateCanvas();
	delay(50);
}

上传程序,等待程序上传完成。

将HUSKYLENS 2的十字光标对准色块进行学习,如何学习颜色详细操作请看:颜色识别功能
学习完成后,将HUSKYLENS 2摄像头对准色块,观察输出结果。

**运行结果:**可输出检测到的色块总数,无论该色块是否已学习,只要方框框出色块,就会计数。可按要求输出相应色块ID号,其中靠近画面中心的色块被白框框出,即未学习的色块,因此输出的ID号为0。

Interface Diagram

7.2获取指定颜色的相关数据

HUSKYLENS 2识别颜色后,可获取画面中指定颜色的相关数据。例如,判断某个指定的颜色是否在画面中、指定颜色的名称、可获取画面中相同的指定颜色的色块数量,当画面中出现多个相同颜色的色块时,可指定获取其中某个色块的相关参数,包括名称、X/Y坐标、宽度、高度。

示例程序如下:

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_COLOR_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_COLOR_RECOGNITION);
	if ((huskylens.available(ALGORITHM_COLOR_RECOGNITION))) {
		if (((huskylens.getCachedResultByID(ALGORITHM_COLOR_RECOGNITION, 1) != NULL))) {
			k10.canvas->canvasText((String("ID1色块总数:") + String((huskylens.getCachedResultNumByID(ALGORITHM_COLOR_RECOGNITION, 1)))), 1, 0x0000FF);
			k10.canvas->canvasText((String("ID1色块名称:") + String((RET_ITEM_STR(huskylens.getCachedResultByID(ALGORITHM_COLOR_RECOGNITION, 1), Result, name)))), 3, 0x0000FF);
			k10.canvas->canvasText("第一个ID1色块", 5, 0x0000FF);
			k10.canvas->canvasText((String("的坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_COLOR_RECOGNITION, 1, 1-1), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_COLOR_RECOGNITION, 1, 1-1), Result, yCenter)))))))), 5, 0x0000FF);
		}
	}
	k10.canvas->updateCanvas();
	delay(50);
}

**运行结果:**如图所示,可获取到画面中ID1的色块总数、ID1的色块名称,以及第一个检测到的ID1色块的坐标位置。(颜色名称可以自定义,默认为“颜色”)

Interface Diagram

8.自学习分类代码示例

8.1识别已学习物体输出ID与名称

在自学习分类功能下,当已学习某一物体后,HUSKYLENS 2 再次见到该物体就能识别出来,可以使用以下示例程序获取识别的已学习物体对应ID和名称。

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_SELF_LEARNING_CLASSIFICATION);
}
void loop() {
	huskylens.getResult(ALGORITHM_SELF_LEARNING_CLASSIFICATION);
	if ((huskylens.available(ALGORITHM_SELF_LEARNING_CLASSIFICATION))) {
		k10.canvas->canvasText((String("物体ID:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_SELF_LEARNING_CLASSIFICATION), Result, ID)))), 1, 0x0000FF);
		k10.canvas->canvasText((String("物体名称:") + String((RET_ITEM_STR(huskylens.getCachedCenterResult(ALGORITHM_SELF_LEARNING_CLASSIFICATION), Result, name)))), 3, 0x0000FF);
	}
	k10.canvas->updateCanvas();
	delay(50);
}

上传程序,等待程序上传完成后。

HUSKYLENS 2学习物体完成后,将HUSKYLENS 2摄像头对准已学习的物体,观察输出结果。如何学习物体详细操作请看:自学习分类

**运行结果:**如下,当已学习过的某一物体出现在画面中时会被框出同时显示该物体名称、ID与置信度。如果未设置该物体的名称,则输出名称默认为:物体。

Interface Diagram

9.手势识别示例程序

9.1识别手势输出相关数据

可检测HuskyLens 2视野内的手势,获取手势相关数据,可以读取的数据有:画面中检测到的手势总数、靠近HuskyLens 2摄像头画面中心的手势ID号、检测到的第一个手势ID号。

示例程序如下。

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
    }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_HAND_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_HAND_RECOGNITION);
	if ((huskylens.available(ALGORITHM_HAND_RECOGNITION))) {
		k10.canvas->canvasText((String("手势总数:") + String((huskylens.getCachedResultNum(ALGORITHM_HAND_RECOGNITION)))), 1, 0xFF0000);
		k10.canvas->canvasText((String("靠中心的手势ID:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_HAND_RECOGNITION), Result, ID)))), 3, 0xFF0000);
		k10.canvas->canvasText((String("第一个手势ID:") + String((RET_ITEM_NUM(huskylens.getCachedResultByIndex(ALGORITHM_HAND_RECOGNITION, 1-1), Result, ID)))), 5, 0xFF0000);
		k10.canvas->updateCanvas();
	}
}

上传程序,等待程序上传完成后。

HuskyLens 2进入手势识别功能。将HuskyLens 2的摄像头对准画面中的手势进行学习,如何学习手势详细操作请看:手势识别功能-学习手势

**运行结果:**可输出检测到的手势总数,不管是否为学习过的手势,只要检测到手势都会计数(方框框出即检测为手势)。可按要求输出相应手势的ID号,学习过的手势会按照学习顺序分配ID号,未学习过的手势,其ID号为0。

Interface Diagram

9.2获取手势关键点数据

可以获取指定手势的ID号、名称、手指、手腕等关键点的数据,详细数据有:手势ID、手势名称、手势中心点的X坐标位置和Y坐标位置、宽度、高度、手腕X/Y坐标,每根手指的根部、关节、指尖的X/Y坐标。详情请看手势识别积木说明。

如以下示例程序可以获取靠近摄像头画面中心的手势的手腕、五根手指指尖的X/Y坐标数据,未学习的手势亦可获取。

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
    }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_HAND_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_HAND_RECOGNITION);
	if ((huskylens.available(ALGORITHM_HAND_RECOGNITION))) {
		k10.canvas->canvasText((String("靠中心的手势ID:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_HAND_RECOGNITION), Result, ID)))), 1, 0xFF0000);
		k10.canvas->canvasText((String("手腕坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_HAND_RECOGNITION), HandResult, wrist_x))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_HAND_RECOGNITION), HandResult, wrist_y)))))))), 3, 0xFF0000);
		k10.canvas->canvasText((String("拇指指尖:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_HAND_RECOGNITION), HandResult, thumb_tip_x))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_HAND_RECOGNITION), HandResult, thumb_tip_y)))))))), 5, 0xFF0000);
		k10.canvas->canvasText((String("食指指尖:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_HAND_RECOGNITION), HandResult, index_finger_tip_x))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_HAND_RECOGNITION), HandResult, index_finger_tip_y)))))))), 7, 0xFF0000);
		k10.canvas->canvasText((String("中指指尖:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_HAND_RECOGNITION), HandResult, middle_finger_tip_x))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_HAND_RECOGNITION), HandResult, middle_finger_tip_y)))))))), 9, 0xFF0000);
		k10.canvas->canvasText((String("无名指指尖:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_HAND_RECOGNITION), HandResult, ring_finger_tip_x))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_HAND_RECOGNITION), HandResult, ring_finger_tip_y)))))))), 11, 0xFF0000);
		k10.canvas->canvasText((String("小指指尖:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_HAND_RECOGNITION), HandResult, pinky_finger_tip_x))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_HAND_RECOGNITION), HandResult, pinky_finger_tip_y)))))))), 13, 0xFF0000);
		k10.canvas->updateCanvas();
	}
}

**运行结果:**如下图,运行程序,K10屏幕上显示手势ID号及该手势的关键点数据。由于该手势未学习,因此手势ID为0。

Interface Diagram

9.3获取指定手势的相关数据

除以上数据,还可以获取更多指定手势的数据。例如,判断某个指定手势是否在画面中、指定手势的名称、可获取画面中相同手势的数量,当画面中出现多个相同手势时,可指定获取其中某个手势的相关参数,包括名称、手势中心X/Y坐标、宽度、高度、指尖坐标、手腕坐标数据等等。

示例程序如下:

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
    }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_HAND_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_HAND_RECOGNITION);
	if ((huskylens.available(ALGORITHM_HAND_RECOGNITION))) {
		k10.canvas->canvasText((String("靠中心的手势ID:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_HAND_RECOGNITION), Result, ID)))), 1, 0xFF0000);
		if (((huskylens.getCachedResultByID(ALGORITHM_HAND_RECOGNITION, 1) != NULL))) {
			k10.canvas->canvasText((String("ID1手势总数:") + String((huskylens.getCachedResultNumByID(ALGORITHM_HAND_RECOGNITION, 1)))), 1, 0xFF0000);
			k10.canvas->canvasText((String("ID1手势名称:") + String((RET_ITEM_STR(huskylens.getCachedResultByID(ALGORITHM_HAND_RECOGNITION, 1), Result, name)))), 3, 0xFF0000);
			k10.canvas->canvasText("第一个ID1手势", 5, 0xFF0000);
			k10.canvas->canvasText((String("的坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_HAND_RECOGNITION, 1, 1-1), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_HAND_RECOGNITION, 1, 1-1), Result, yCenter)))))))), 6, 0xFF0000);
			k10.canvas->updateCanvas();
		}
	}
}

**运行结果:**如图所示,可获取到画面中ID1手势数量、名称,以及检测到的第一个ID1手势的坐标位置。

Interface Diagram

10.实例分割代码示例

10.1实例分割并输出相关数据

在实例分割功能下,HUSKYLENS可以识别中图像中物体的类别并标记出每个物体的轮廓。可以使用程序打印出HUSKYLENS识别出的实例总数墩号靠近中心的实例和指定ID实例的名称、ID、中心点X、Y坐标以及物体的宽度和高度。

示例程序如下。

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_SEGMENT);
}
void loop() {
	huskylens.getResult(ALGORITHM_SEGMENT);
	if ((huskylens.available(ALGORITHM_SEGMENT))) {
		k10.canvas->canvasText((String((String("实例有:") + String((huskylens.getCachedResultNum(ALGORITHM_SEGMENT))))) + String("个")), 1, 0x0000FF);
		k10.canvas->canvasText((String("靠近中心实例ID为") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_SEGMENT), Result, ID)))), 2, 0x0000FF);
		k10.canvas->canvasText("识别第1个实例的坐标", 3, 0x0000FF);
		k10.canvas->canvasText((String((RET_ITEM_NUM(huskylens.getCachedResultByIndex(ALGORITHM_SEGMENT, 1 - 1), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedResultByIndex(ALGORITHM_SEGMENT, 1 - 1), Result, yCenter)))))), 4, 0x0000FF);
	}
	k10.canvas->updateCanvas();
	delay(500);
}

**运行结果:**当程序上传成功后,HUSKYLENS 2会自动切换到实例分割功能下,将HUSKYLENS 2对准待识别的物体(必须是80类之中),观察行空板K10屏幕显示出现识别到的实例数量、指定实例的ID、中心点坐标等数据。实例分割功能说明

Interface Diagram

10.2 获取指定实例的相关数据

在实例分割功能下,HUSKYLENS 2 学习后,可获取画面中指定实例的相关数据。例如,判断某个已学习的实例是否在画面中、指定手实例的名称、同类实例的数量,当画面中出现多个相同类别是实例时,可指定获取其中某个实例的相关参数,包括名称、X/Y坐标、宽度、高度。

示例程序如下。

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_SEGMENT);
}
void loop() {
	huskylens.getResult(ALGORITHM_SEGMENT);
	if ((huskylens.available(ALGORITHM_SEGMENT))) {
		if (((huskylens.getCachedResultByID(ALGORITHM_SEGMENT, 1) != NULL))) {
			k10.canvas->canvasText((String("ID1实例总数为:") + String((huskylens.getCachedResultNumByID(ALGORITHM_SEGMENT, 1)))), 1, 0x0000FF);
			k10.canvas->canvasText((String("ID1实例名称为:") + String((RET_ITEM_STR(huskylens.getCachedResultByID(ALGORITHM_SEGMENT, 1), Result, name)))), 2, 0x0000FF);
			k10.canvas->canvasText("第1个ID1实例坐标为:", 3, 0x0000FF);
			k10.canvas->canvasText((String((String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_SEGMENT, 1, 1-1), Result, xCenter))) + String(","))) + String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_SEGMENT, 1, 1-1), Result, yCenter)))), 4, 0x0000FF);
		}
	}
	k10.canvas->updateCanvas();
	delay(500);
}

**运行结果:**当程序上传成功后,HUSKYLENS 2会自动切换到实例分割功能下,当同一类别的多个实例出现在画面中时可以识别同一类别的实例的数量,行空板K10显示指定实例的ID、中心点坐标、ID等相关数据。

Interface Diagram

11.姿态识别示例

11.1识别人体姿态输出相关数据

可识别HuskyLens 2视野内的人体姿态,获取姿态相关数据,可以读取的数据有:检测到的人体总数、靠近HuskyLens 2摄像头画面中心的人体姿态ID号、检测到的第一个姿态的ID号。

示例程序如下。


#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
    }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_POSE_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_POSE_RECOGNITION);
	if ((huskylens.available(ALGORITHM_POSE_RECOGNITION))) {
		k10.canvas->canvasText((String("人体总数:") + String((huskylens.getCachedResultNum(ALGORITHM_POSE_RECOGNITION)))), 1, 0xFF0000);
		k10.canvas->canvasText((String("靠中心的人体ID:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_POSE_RECOGNITION), Result, ID)))), 3, 0xFF0000);
		k10.canvas->canvasText((String("第一个人体ID:") + String((RET_ITEM_NUM(huskylens.getCachedResultByIndex(ALGORITHM_POSE_RECOGNITION, 1-1), Result, ID)))), 5, 0xFF0000);
		  k10.canvas->updateCanvas(); 
	}
}

上传程序,程序上传成功后,HuskyLens 2进入姿态识别功能。将HuskyLens 2的摄像头对准画面中的人体姿态进行学习,如何学习姿态详细操作请看:姿态识别功能-学习姿态

学习完成后,对准该姿态,可在K10屏幕上观察输出结果。

**运行结果:**可输出检测到的人体总数;可输出指定人体姿态ID号,已学习的人体姿态会按学习顺序分配ID号,未学习的姿态,ID号为0。

Interface Diagram

11.2获取人体关键点数据

可以获取指定人体姿态的ID号、名称、五官、人体关节等关键点的数据,详细数据有:人体ID、人体姿态名称、人体中心点的X坐标位置和Y坐标位置、宽度、高度,左右眼耳鼻X/Y坐标,左右两边肩膀、手肘、手腕、臀部、膝盖、脚踝的X/Y坐标。详情请看姿态识别积木说明。

如以下示例程序可以获取靠近摄像头画面中心的人体的鼻子、左边肩膀、手肘、臀部、膝盖、脚踝的X/Y坐标数据,未学习的人体姿态亦可获取。

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
    }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_POSE_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_POSE_RECOGNITION);
	if ((huskylens.available(ALGORITHM_POSE_RECOGNITION))) {
		k10.canvas->canvasText((String("靠中心的人体ID:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_POSE_RECOGNITION), Result, ID)))), 1, 0xFF0000);
		k10.canvas->canvasText((String("鼻子坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_POSE_RECOGNITION), PoseResult, nose_x))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_POSE_RECOGNITION), PoseResult, nose_y)))))))), 3, 0xFF0000);
		k10.canvas->canvasText((String("左肩坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_POSE_RECOGNITION), PoseResult, lshoulder_x))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_POSE_RECOGNITION), PoseResult, lshoulder_y)))))))), 5, 0xFF0000);
		k10.canvas->canvasText((String("左肘坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_POSE_RECOGNITION), PoseResult, lelbow_x))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_POSE_RECOGNITION), PoseResult, lelbow_y)))))))), 7, 0xFF0000);
		k10.canvas->canvasText((String("左臀坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_POSE_RECOGNITION), PoseResult, lhip_x))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_POSE_RECOGNITION), PoseResult, lhip_y)))))))), 9, 0xFF0000);
		k10.canvas->canvasText((String("左膝坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_POSE_RECOGNITION), PoseResult, lknee_x))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_POSE_RECOGNITION), PoseResult, lknee_y)))))))), 11, 0xFF0000);
		k10.canvas->canvasText((String("左踝坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_POSE_RECOGNITION), PoseResult, lankle_x))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_POSE_RECOGNITION), PoseResult, lankle_y)))))))), 13, 0xFF0000);
		k10.canvas->updateCanvas();
	}
}

**运行结果:**如下图,运行程序,K10屏幕上显示人体ID号及该人体的鼻子、部分人体关键点的坐标数据。由于该人体姿态未学习,因此人体ID为0。

Interface Diagram

11.3获取指定姿态数据

除以上数据,还可以获取更多人体姿态数据。例如,判断某指定ID的姿态是否在画面中、指定姿态的名称、可获取画面中相同姿态的数量,当画面中出现多个相同姿态时,可指定获取其中某个姿态的相关参数,包括名称、X/Y坐标、宽度、高度及人体关键点坐标数据。

示例程序如下:

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
    }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_POSE_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_POSE_RECOGNITION);
	if ((huskylens.available(ALGORITHM_POSE_RECOGNITION))) {
		if (((huskylens.getCachedResultByID(ALGORITHM_POSE_RECOGNITION, 1) != NULL))) {
			k10.canvas->canvasText((String("ID1姿态总数:") + String((huskylens.getCachedResultNumByID(ALGORITHM_POSE_RECOGNITION, 1)))), 1, 0xFF0000);
			k10.canvas->canvasText((String("ID1姿态名称:") + String((RET_ITEM_STR(huskylens.getCachedResultByID(ALGORITHM_POSE_RECOGNITION, 1), Result, name)))), 3, 0xFF0000);
			k10.canvas->canvasText("第一个ID1姿态", 5, 0xFF0000);
			k10.canvas->canvasText((String("的坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_POSE_RECOGNITION, 1, 1-1), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_POSE_RECOGNITION, 1, 1-1), Result, yCenter)))))))), 6, 0xFF0000);
			k10.canvas->updateCanvas();
		}
	}
}

**运行结果:**如图所示,可获取到画面中ID1姿态数量、名称,以及检测到的第一个ID1姿态的坐标位置。

Interface Diagram

12.车牌识别示例

12.1识别车牌输出相关数据

在车牌识别功能下,当车牌出现在HUSKYLENS 2屏幕中时,可以被识别和框出,并获车牌的相关数据。可以读取车牌的数据有:指定车牌的ID、名称、车牌内容(车牌号)、宽度、高度以及车牌中心点的X坐标位置和Y坐标位置,画面中的车牌总数。

示例程序如下。

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_LICENSE_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_LICENSE_RECOGNITION);
	if ((huskylens.available(ALGORITHM_LICENSE_RECOGNITION))) {
		k10.canvas->canvasText((String("靠近中心的车牌ID:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_LICENSE_RECOGNITION), Result, ID)))), 1, 0x0000FF);
		k10.canvas->canvasText((String("车牌总数:") + String((huskylens.getCachedResultNum(ALGORITHM_LICENSE_RECOGNITION)))), 3, 0x0000FF);
		k10.canvas->canvasText((String("第一个车牌ID:") + String((RET_ITEM_NUM(huskylens.getCachedResultByIndex(ALGORITHM_LICENSE_RECOGNITION, 1-1), Result, ID)))), 5, 0x0000FF);
	}
	k10.canvas->updateCanvas();
	delay(50);
}

上传程序,等待程序上传完成后。

将HuskyLens 2的摄像头对准画面中的车牌进行学习,如何学习车牌详细操作请看车牌识别功能说明

将HUSKYLENS 2的摄像头对准车牌,观察行空板K10屏幕上的数据。

**运行结果:**如下,车牌总数包含已学习的车牌和未学习的车牌,如果指定的车牌是未学习的车牌,ID号为0,如果指定车牌是已学习的车牌,则输出其对应ID号。

Interface Diagram

12.2输出指定ID车牌的数据

当画面中出现多个相同ID的车牌时,可以使用以下示例程序统计画面中的该ID车牌的相关数据。

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_LICENSE_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_LICENSE_RECOGNITION);
	if ((huskylens.available(ALGORITHM_LICENSE_RECOGNITION))) {
		if (((huskylens.getCachedResultByID(ALGORITHM_LICENSE_RECOGNITION, 1) != NULL))) {
			k10.canvas->canvasText((String("ID1车牌总数:") + String((huskylens.getCachedResultNumByID(ALGORITHM_LICENSE_RECOGNITION, 1)))), 1, 0x0000FF);
			k10.canvas->canvasText("第一个ID1车牌", 3, 0x0000FF);
			k10.canvas->canvasText((String("的车牌号:") + String((RET_ITEM_STR(huskylens.getCachedIndexResultByID(ALGORITHM_LICENSE_RECOGNITION, 1, 1-1), Result, content)))), 4, 0x0000FF);
			k10.canvas->canvasText("第一个ID1车牌", 6, 0x0000FF);
			k10.canvas->canvasText((String("的坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_LICENSE_RECOGNITION, 1, 1-1), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_LICENSE_RECOGNITION, 1, 1-1), Result, yCenter)))))))), 7, 0x0000FF);
		}
	}
	k10.canvas->updateCanvas();
	delay(50);
}

**运行结果:**如下,当画面中出现多个指定ID的车牌时,可获取画面中该ID车牌的总数、该ID下指定车牌的车牌号、车牌坐标等数据。

Interface Diagram

13.光学字符识别示例

13.1识别文字输出相关数据

在光学字符识别功能下,HUSKYLENS 2 可识别并框出视野内文字块出现的区域,并将识别到的文字显示在屏幕上,可使用以下示例程序,统计画面中可识别文字块的总数、获取画面中离十字光标最近的文字块相关数据,可以读取的数据有:文字块的ID 、名称、内容、中心点X坐标和Y坐标、文字块宽度和高度。

示例程序如下。

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_OCR_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_OCR_RECOGNITION);
	if ((huskylens.available(ALGORITHM_OCR_RECOGNITION))) {
		k10.canvas->canvasText((String("文字块数量:") + String((huskylens.getCachedResultNum(ALGORITHM_OCR_RECOGNITION)))), 1, 0x0000FF);
		k10.canvas->canvasText((String("靠近中心的文字ID:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_OCR_RECOGNITION), Result, ID)))), 3, 0x0000FF);
		k10.canvas->canvasText("靠近中心的文字内容:", 5, 0x0000FF);
		k10.canvas->canvasText((RET_ITEM_STR(huskylens.getCachedCenterResult(ALGORITHM_OCR_RECOGNITION), Result, content)), 6, 0x0000FF);
		k10.canvas->canvasText("靠近中心的文字块", 8, 0x0000FF);
		k10.canvas->canvasText((String("的中心坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_OCR_RECOGNITION), Result, width))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_OCR_RECOGNITION), Result, height)))))))), 9, 0x0000FF);
		k10.canvas->canvasText("靠中心的文字块", 11, 0x0000FF);
		k10.canvas->canvasText((String("的宽高:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_OCR_RECOGNITION), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_OCR_RECOGNITION), Result, yCenter)))))))), 12, 0x0000FF);
	}
	k10.canvas->updateCanvas();
	delay(50);
}

上传程序,等待程序上传成功后。

将HUSKYLENS 2的摄像头对准任意光学字符,观察K10屏幕显示的结果。

**运行结果:**如下,对于未学习过的文字块默认输出ID为0。

Interface Diagram

可以对准一张学习过的文字块,如何学习光学字符详细操作请看 :光学字符识别-学习文字

**运行结果:**如下,对于已学习过的文字块输出ID与HUSKYLENS 2屏幕显示的ID保持一致。

注:在光学字符识别功能下,HUSKYLENS 2能检测出画面中所有文字块出现的区域并用方框圈出,但是只识别十字光标所在的一个文字块区域的内容并讲文字内容显示在方框左上角。

Interface Diagram

14.巡线代码示例

在巡线功能下,HUSKYLENS 2可以标记出画面中路线的轨迹,获取当前路线的长度、角度和X、Y分量。当路线出现分支时,可以获取路口的分支数量和逆时针方向起每条分支的相应数据。

示例程序如下。

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_LINE_TRACKING);
}
void loop() {
	huskylens.getResult(ALGORITHM_LINE_TRACKING);
	if ((huskylens.available(ALGORITHM_LINE_TRACKING))) {
		k10.canvas->canvasText((String("路线的角度为:") + String((RET_ITEM_NUM(huskylens.getCurrentBranch(ALGORITHM_LINE_TRACKING), Result, angle)))), 0, 0, 0x0000FF, k10.canvas->eCNAndENFont24, 50, true);
		k10.canvas->canvasText((String("路线的长度为:") + String((RET_ITEM_NUM(huskylens.getCurrentBranch(ALGORITHM_LINE_TRACKING), Result, length)))), 0, 30, 0x0000FF, k10.canvas->eCNAndENFont24, 50, true);
		k10.canvas->canvasText("路线的X和Y分量为:", 0, 60, 0x0000FF, k10.canvas->eCNAndENFont24, 50, true);
		k10.canvas->canvasText((String((RET_ITEM_NUM(huskylens.getCurrentBranch(ALGORITHM_LINE_TRACKING), Result, xTarget))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCurrentBranch(ALGORITHM_LINE_TRACKING), Result, yTarget)))))), 0, 90, 0x0000FF, k10.canvas->eCNAndENFont24, 50, true);
		k10.canvas->canvasText((String("路口分支数量为:") + String((huskylens.getUpcomingBranchCount(ALGORITHM_LINE_TRACKING)))), 0, 120, 0x0000FF, k10.canvas->eCNAndENFont24, 50, true);
	}
	k10.canvas->updateCanvas();
	delay(1000);
}

**运行结果:**如图所示,将HUSKYLENS的镜头对准带有路线的地图,观察K10屏幕显示可以输出当前路线的长度、角度等数据。当路线由多个分支时,可以输出分支数量。

Interface Diagram

15.表情识别代码示例

15.1识别表情输出相关数据

在表情识别功能下,HUSKYLENS 2 能识别7种特定的表情:愤怒(ID为1)、厌恶(ID为2)、恐惧(ID为3)、开心(ID为4)、中性(ID为5)、悲伤(ID为6)和惊讶(ID为7)。以上表情已经在HUSKYLENS 2 出厂时学习完毕,无需用户再次手动学习,表情识别的详细功能使用说明请见表情识别

通过以下示例程序能统计当前HUSKYLENS 2 摄像头画面出识别出的所有表情的数量、输出指定表情的ID。

示例程序如下

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_EMOTION_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_EMOTION_RECOGNITION);
	if ((huskylens.available(ALGORITHM_EMOTION_RECOGNITION))) {
		k10.canvas->canvasText((String("靠近中心的表情ID:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_EMOTION_RECOGNITION), Result, ID)))), 1, 0x0000FF);
		k10.canvas->canvasText((String("表情总数:") + String((huskylens.getCachedResultNum(ALGORITHM_EMOTION_RECOGNITION)))), 3, 0x0000FF);
		k10.canvas->canvasText((String("第一个表情ID:") + String((RET_ITEM_NUM(huskylens.getCachedResultByIndex(ALGORITHM_EMOTION_RECOGNITION, 1-1), Result, ID)))), 5, 0x0000FF);
	}
	k10.canvas->updateCanvas();
	delay(50);
}

上传程序,等待程序上传完成。

当任意以上七种表情出现在摄像头画面中,观察HUSKYLENS 2 的屏幕会将表情框出,显示表情ID、名称和置信度。同时,行空板K10屏幕上显示根据程序输出的结果数据。

**运行结果如下:**根据程序要求,输出了指定的表情ID、画面中表情总数。

Interface Diagram

15.2获取画面中指定表情的相关数据

当画面中出现多个相同ID的表情时,可以使用以下示例程序统计画面中的该ID表情的相关数据。

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_EMOTION_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_EMOTION_RECOGNITION);
	if ((huskylens.available(ALGORITHM_EMOTION_RECOGNITION))) {
		if ((huskylens.available(ALGORITHM_EMOTION_RECOGNITION))) {
			if (((huskylens.getCachedResultByID(ALGORITHM_EMOTION_RECOGNITION, 4) != NULL))) {
				k10.canvas->canvasText((String("ID4表情总数:") + String((huskylens.getCachedResultNumByID(ALGORITHM_EMOTION_RECOGNITION, 4)))), 1, 0x0000FF);
				k10.canvas->canvasText((String("ID4表情名称:") + String((RET_ITEM_STR(huskylens.getCachedResultByID(ALGORITHM_EMOTION_RECOGNITION, 4), Result, name)))), 3, 0x0000FF);
				k10.canvas->canvasText("第一个ID4表情", 5, 0x0000FF);
				k10.canvas->canvasText((String("的坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_EMOTION_RECOGNITION, 4, 1-1), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_EMOTION_RECOGNITION, 4, 1-1), Result, yCenter)))))))), 6, 0x0000FF);
			}
		}
		k10.canvas->updateCanvas();
		delay(50);
	}
}

**运行结果:**如下,当画面中出现多个指定ID的表情时,可获取画面中该ID表情的总数、名称、该ID下某个指定表情的坐标等数据。

Interface Diagram

16.标签识别代码示例

16.1识别标签输出相关数据

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

示例程序如下。

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_OCR_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_OCR_RECOGNITION);
	if ((huskylens.available(ALGORITHM_OCR_RECOGNITION))) {
		k10.canvas->canvasText((String("文字块数量:") + String((huskylens.getCachedResultNum(ALGORITHM_OCR_RECOGNITION)))), 1, 0x0000FF);
		k10.canvas->canvasText((String("靠近中心的文字ID:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_OCR_RECOGNITION), Result, ID)))), 3, 0x0000FF);
		k10.canvas->canvasText("靠近中心的文字内容:", 5, 0x0000FF);
		k10.canvas->canvasText((RET_ITEM_STR(huskylens.getCachedCenterResult(ALGORITHM_OCR_RECOGNITION), Result, content)), 6, 0x0000FF);
		k10.canvas->canvasText("靠近中心的文字块", 8, 0x0000FF);
		k10.canvas->canvasText((String("的中心坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_OCR_RECOGNITION), Result, width))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_OCR_RECOGNITION), Result, height)))))))), 9, 0x0000FF);
		k10.canvas->canvasText("靠中心的文字块", 11, 0x0000FF);
		k10.canvas->canvasText((String("的宽高:") + String((String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_OCR_RECOGNITION), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_OCR_RECOGNITION), Result, yCenter)))))))), 12, 0x0000FF);
	}
	k10.canvas->updateCanvas();
	delay(50);
}

上传程序,等待程序上传完成后。

将HuskyLens 2的摄像头对准画面中的标签可进行学习,如何学习标签详细操作请看:标签识别功能-学习标签

将HUSKYLENS 2的摄像头对准标签码,观察K10屏幕显示的结果。

**运行结果:**如图所示,可输出检测到的标签码数量(无论是否该标签码已学习)、可输出指定的标签ID,未学习的标签码则为0。

Interface Diagram

16.2获取画面中指定标签的相关数据

HuskyLens 2识别标签后,可获取画面中指定标签的相关数据。例如,判断某个指定ID的标签是否在画面中、可获取画面中相同ID的标签数量,当画面中出现多个相同ID的标签时,可指定获取其中某个标签的相关参数,包括名称、内容、X/Y坐标、宽度、高度。

示例程序如下:


#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_TAG_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_TAG_RECOGNITION);
	if ((huskylens.available(ALGORITHM_TAG_RECOGNITION))) {
		if (((huskylens.getCachedResultByID(ALGORITHM_TAG_RECOGNITION, 0) != NULL))) {
			k10.canvas->canvasText((String("ID0标签总数:") + String((huskylens.getCachedResultNumByID(ALGORITHM_TAG_RECOGNITION, 0)))), 1, 0x0000FF);
			k10.canvas->canvasText("第一个ID0标签", 3, 0x0000FF);
			k10.canvas->canvasText((String("内容:") + String((RET_ITEM_STR(huskylens.getCachedIndexResultByID(ALGORITHM_TAG_RECOGNITION, 0, 1-1), Result, content)))), 4, 0x0000FF);
			k10.canvas->canvasText("第二个ID0标签", 6, 0x0000FF);
			k10.canvas->canvasText((String("的坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_TAG_RECOGNITION, 0, 2-1), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_TAG_RECOGNITION, 0, 2-1), Result, yCenter)))))))), 7, 0x0000FF);
		}
	}
	k10.canvas->updateCanvas();
	delay(50);
}

**运行结果:**如图所示,画面中有两个未学习的标签码(ID为0),第一个ID0标签是左边的,该标签的内容是48,第二个ID0标签是右边的,该标签的坐标是(505,263)。

Interface Diagram

17.二维码识别积木

17.1识别二维码输出相关数据

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

示例程序如下。

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_QRCODE_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_QRCODE_RECOGNITION);
	if ((huskylens.available(ALGORITHM_QRCODE_RECOGNITION))) {
		k10.canvas->canvasText((String("靠中心的二维码ID:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_QRCODE_RECOGNITION), Result, ID)))), 1, 0x0000FF);
		k10.canvas->canvasText((String("二维码总数:") + String((huskylens.getCachedResultNum(ALGORITHM_QRCODE_RECOGNITION)))), 3, 0x0000FF);
		k10.canvas->canvasText((String("第一个二维码ID:") + String((RET_ITEM_NUM(huskylens.getCachedResultByIndex(ALGORITHM_QRCODE_RECOGNITION, 1-1), Result, ID)))), 5, 0x0000FF);
	}
	k10.canvas->updateCanvas();
	delay(50);
}


上传程序,等待程序上传完成后。

将HuskyLens 2的摄像头对准画面中的二维码可进行学习,如何学习二维码详细操作请看二维码识别功能-学习二维码

将HUSKYLENS 2的摄像头对准二维码,观察K10屏幕显示的结果。

**运行结果:**如图所示,可输出检测到的二维码数量(无论是否该二维码已学习)、可输出指定的二维码ID,未学习的二维码则为0。

Interface Diagram

17.2获取画面中指定二维码的相关数据

HuskyLens 2识别二维码后,可获取画面中指定二维码的相关数据。例如,判断某个指定ID的二维码是否在画面中、可获取画面中相同ID的二维码数量,当画面中出现多个相同ID的二维码时,可指定获取其中某个二维码的相关参数,包括名称、内容、X/Y坐标、宽度、高度。

示例程序如下:

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_QRCODE_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_QRCODE_RECOGNITION);
	if ((huskylens.available(ALGORITHM_QRCODE_RECOGNITION))) {
		if (((huskylens.getCachedResultByID(ALGORITHM_QRCODE_RECOGNITION, 0) != NULL))) {
			k10.canvas->canvasText((String("ID0二维码总数:") + String((huskylens.getCachedResultNumByID(ALGORITHM_QRCODE_RECOGNITION, 0)))), 1, 0x0000FF);
			k10.canvas->canvasText("第一个ID0二维码", 3, 0x0000FF);
			k10.canvas->canvasText((String("的内容:") + String((RET_ITEM_STR(huskylens.getCachedIndexResultByID(ALGORITHM_QRCODE_RECOGNITION, 0, 1-1), Result, content)))), 4, 0x0000FF);
			k10.canvas->canvasText("第二个ID0二维码", 6, 0x0000FF);
			k10.canvas->canvasText((String("的坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_QRCODE_RECOGNITION, 0, 2-1), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_QRCODE_RECOGNITION, 0, 2-1), Result, yCenter)))))))), 7, 0x0000FF);
		}
	}
	k10.canvas->updateCanvas();
	delay(50);
}

**运行结果:**如图所示,画面中有两个未学习的二维码(ID为0),第一个ID0二维码是右边的,该标签的内容是“南瓜面包”,第二个ID0二维码是左边的,该二维码的坐标是(138,228)。

Interface Diagram

18.条形码识别积木

18.1识别条形码输出相关数据

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

示例程序如下。

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_BARCODE_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_BARCODE_RECOGNITION);
	if ((huskylens.available(ALGORITHM_BARCODE_RECOGNITION))) {
		k10.canvas->canvasText((String("靠中心的条形码ID:") + String((RET_ITEM_NUM(huskylens.getCachedCenterResult(ALGORITHM_BARCODE_RECOGNITION), Result, ID)))), 1, 0x0000FF);
		k10.canvas->canvasText((String("条形码总数:") + String((huskylens.getCachedResultNum(ALGORITHM_BARCODE_RECOGNITION)))), 3, 0x0000FF);
		k10.canvas->canvasText((String("第一个条形码ID:") + String((RET_ITEM_NUM(huskylens.getCachedResultByIndex(ALGORITHM_BARCODE_RECOGNITION, 1-1), Result, ID)))), 5, 0x0000FF);
	}
	k10.canvas->updateCanvas();
	delay(50);
}

上传程序,,等待程序上传成功后将HuskyLens 2的摄像头对准画面中的条形码可进行学习,如何学习条形码详细操作请看: 条形码识别功能-学习条形码:

将HUSKYLENS 2的摄像头对准条形码,观察K10屏幕显示的结果。

**运行结果:**如图所示,可输出检测到的条形码数量(无论是否该条形码已学习)、可输出指定的条形码ID,未学习的条形码则为0。

Interface Diagram

18.2获取画面中指定条形码的相关数据

HuskyLens 2识别条形码后,可获取画面中指定条形码的相关数据。例如,判断某个指定ID的条形码是否在画面中、可获取画面中相同ID的条形码数量,当画面中出现多个相同ID的条形码时,可指定获取其中某个条形码的相关参数,包括名称、内容、X/Y坐标、宽度、高度。

示例程序如下:

#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2  huskylens;
UNIHIKER_K10 k10;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	Wire.begin();
  while (!huskylens.begin(Wire)) {
    delay(100);
  }
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	huskylens.switchAlgorithm(ALGORITHM_BARCODE_RECOGNITION);
}
void loop() {
	huskylens.getResult(ALGORITHM_BARCODE_RECOGNITION);
	if ((huskylens.available(ALGORITHM_BARCODE_RECOGNITION))) {
		if (((huskylens.getCachedResultByID(ALGORITHM_BARCODE_RECOGNITION, 0) != NULL))) {
			k10.canvas->canvasText((String("ID0条形码总数:") + String((huskylens.getCachedResultNumByID(ALGORITHM_BARCODE_RECOGNITION, 0)))), 1, 0x0000FF);
			k10.canvas->canvasText("第一个ID0条形码", 3, 0x0000FF);
			k10.canvas->canvasText((String("的内容:") + String((RET_ITEM_STR(huskylens.getCachedIndexResultByID(ALGORITHM_BARCODE_RECOGNITION, 0, 1-1), Result, content)))), 4, 0x0000FF);
			k10.canvas->canvasText("第二个ID0条形码", 6, 0x0000FF);
			k10.canvas->canvasText((String("的坐标:") + String((String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_BARCODE_RECOGNITION, 0, 2-1), Result, xCenter))) + String((String(",") + String((RET_ITEM_NUM(huskylens.getCachedIndexResultByID(ALGORITHM_BARCODE_RECOGNITION, 0, 2-1), Result, yCenter)))))))), 7, 0x0000FF);
		}
	}
	k10.canvas->updateCanvas();
	delay(50);
}

**运行结果:**如图所示,画面中有两个未学习的条形码(ID为0),第一个ID0条形码是下边的,该条形码的内容是“dfrobot”,第二个ID0条形码是上边的,该条形码的坐标是(345,47)。

Interface Diagram