#ifndef ASJ_PULLUP_H #define ASJ_PULLUP_H #include #include #include #include #include #include #include #include #include #include #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 prepareStatueQueue; // 用于记录准备状态队列 Queue eyeStatusQueue; // 用于判断头顶持续多少帧没过杠 std::vector handBox; // 用于存放双手box的vector Queue handStatusQueue; // 用于开始考试后存放手部的状态 Queue leftHandStatusQueue; // 左手状态 Queue rightHandStatusQueue; // 右手状态 // float legLength[2]; // 准备状态下左右腿平均长度 // Queue leftLegLengthQueue; // 左腿长度队列 // Queue 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