开始之前:
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。
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。
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手势的坐标位置。