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