开始之前:
1. 识别人脸输出相关数据
在人脸识别功能下,当人脸出现在HuskyLens 2屏幕中时,可以被检测和框出,从而获取检测到的人脸总数、指定人脸的相关数据。
I2C模式示例程序如下。
#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();
}
}
}
UART模式示例程序如下。
后续示例代码将仅提供I2C模式代码,如需使用UART模式,请仿照setup()中初始化的方式修改代码即可。
#include "unihiker_k10.h"
#include "DFRobot_HuskylensV2.h"
// 创建对象
HuskylensV2 huskylens;
UNIHIKER_K10 k10;
uint8_t screen_dir=2;
// 主程序开始
void setup() {
k10.begin();
Serial1.begin(9600, SERIAL_8N1, P0, P1);
while (!huskylens.begin(Serial1)) {
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)。
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。
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坐标。