12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- #ifndef ASJ_PULLUP_H
- #define ASJ_PULLUP_H
- #include <iostream>
- #include <string>
- #include <unistd.h>
- #include <vector>
- #include <cmath>
- #include <queue>
- #include <sys/time.h>
- #include <cstring>
- #include <algorithm>
- #include <limits>
- #include "dl_api.h"
- #include "PEStatus.h"
- #include "queue.h"
- #include "asj_pe_base.h"
- typedef struct
- {
- sampleRunJoint_OBJECT_ITEM_S object;
- int idx;
- }Hand_ST;
- class Asj_PE_Pullup {
- public:
- int init(); // 初始化
- int set(PullUp_ST pullup_s); // 根据传入结构体设置参数
- int get(PullUp_ST *pullup_s); // 得到当前设置的参数
- int examReset(); // 算法数据清零
- int processPrepare(sampleRunJoint_RESULT_S *mResults, int *prepareStatus); // 输入算法结果进行处理当前帧(用于准备状态)
- int processExam(sampleRunJoint_RESULT_S *mResults, PullUpResult_ST *result); // 输入算法结果进行处理当前帧(用于考试状态)
- private:
- bool prevFrameStatus; // 用于记录下颜前一帧的状态
- bool isStraighten; // 用于引体向上落下的时候身体是否伸直
- bool isEyeoverbar; // 用于记录眼部是否过杠(前一帧)
- bool isFinishone; // 用于记录这次是否已经过杠
- bool eyeStatus; // 用于记录眼部是否高过杠的状态
- // PullUpExamCode currentExamStatue; // 用于记录考试状态下当前帧的结果
- Queue<int> prepareStatueQueue; // 用于记录准备状态队列
- Queue<int> eyeStatusQueue; // 用于判断头顶持续多少帧没过杠
- std::vector<Hand_ST> handBox; // 用于存放双手box的vector
- Queue<int> handStatusQueue; // 用于开始考试后存放手部的状态
- Queue<int> leftHandStatusQueue; // 左手状态
- Queue<int> rightHandStatusQueue; // 右手状态
- // float legLength[2]; // 准备状态下左右腿平均长度
- // Queue<float> leftLegLengthQueue; // 左腿长度队列
- // Queue<float> rightLegLengthQueue; // 右腿长度队列
- sampleRunJoint_POINT_S leftBar, rightBar, centerBar; // 杠的标定线
- float handAngle; // 双手判断的角度
- float legAngle; // 双腿判断的角度
- float shouldersRatio; // 手部的距离要小于等于肩部的距离 * (1 + shoulders_ratio)
- int handQueueLength; // 左右手状态的队列
- int overTime; // 两次完整动作时间间隔/秒
- float handKeypointDisThresh; // 手部关键点到杠的距离阈值
- PullUp_ST pullup_st; // 额外设置的结构体
- PullUpResult_ST pullupResult_st; // 存放统计结果的结构体
- struct timeval preFinishTime, nowTime; // 记录上一个完成的时间和当前的时间
- int processPrepareCPP(sampleRunJoint_RESULT_S *mResults, int &prepareStatus); // 输入算法结果进行处理当前帧(用于准备状态)
- int processExamCPP(sampleRunJoint_RESULT_S *mResults, PullUpResult_ST &result); // 输入算法结果进行处理当前帧(用于考试状态)
- void findNearestPeople(sampleRunJoint_RESULT_S *mResults, int &personIndex); // 寻找离杠中心点最近的人
- int fbHeadDetect(sampleRunJoint_POINT_S *landmark, bool isLeft); // 根据当前坐标判断正反手
- bool checkHandIsStraighten(sampleRunJoint_POINT_S *landmark); // 判断双手是否伸直
- bool checkLegIsStraighten(sampleRunJoint_POINT_S *landmark); // 判断双腿是否伸直
- bool checkIsBackHand(); // 根据历史状态判断正反手
- };
- #endif
|