#include #include #include #include #include #include #include #include #include #ifndef ASJ_SITUP_H #define ASJ_SITUP_H #include "dl_api.h" #include "PEStatus.h" #include "queue.h" #include "asj_pe_base.h" class Asj_PE_Situp{ public: int init(); // 初始化 int set(SitUp_ST situp_s); // 根据传入结构体设置参数 int get(SitUp_ST *situp_s); // 得到当前设置的参数 int examReset(); // 算法数据清零 int processPrepare(sampleRunJoint_RESULT_S *mResults, int *prepareStatus); // 输入算法结果进行处理当前帧(用于准备状态) int processExam(sampleRunJoint_RESULT_S *mResults, SitUpResult_ST *result); // 输入算法结果进行处理当前帧(用于考试状态) private: int streamHeight, streamWidth; // 媒体流的高宽 SitUpExamCode currentExamStatue; // 用于记录考试状态下当前帧的结果 bool isLieFalt; // 判断背部是否与地面平行 bool isHipLift; // 判断仰卧时,臀部是否离垫 bool isHandNotCloseHand; // 用于存放手部是否贴近头部的状态 bool isNewRound; // 判断是否开始新的回合 bool isUp; // 利用肩臀膝角度来判断是否在进行起坐状态 bool isClockWise; // 仰卧起坐中,身体的右侧面向摄像头为true,反之为false bool isLegAngleLegal; // 判断膝盖角度是否合格 Queue prepareStatueQueue; // 用于记录准备状态队列 Queue handStatueQueue; // 用于存放手部是否贴近头部的状态 Queue kneeStatueQueue; // 用于存放膝盖角度是否符合要求的状态 Queue shoulderHipKneeQueue; // 用于记录肩臀膝角度队列 int upStatueAngle; // 用于判断是否满足up状态的角度(肩臀平角) int newRoundAngle; // 用于判断是否开启新回合的角度(肩臀平角) SitUp_ST situp_st; // 额外设置的结构体 SitUpResult_ST situpResult_st; // 存放统计结果的结构体 void getPeopleNums(sampleRunJoint_RESULT_S *mResults, int &personIndex); bool checkIsLieFlat(sampleRunJoint_POINT_S *landmark, float limit); bool checkIsUpStatus(sampleRunJoint_POINT_S *landmark); bool checkIsTouchKnee(sampleRunJoint_POINT_S *landmark, float limit); bool checkHipIsLiftPad(sampleRunJoint_POINT_S *landmark); bool checkKneeAngle(sampleRunJoint_POINT_S *landmark); void resetFlag(); int processPrepareCPP(sampleRunJoint_RESULT_S *mResults, int &prepareStatus); // 输入算法结果进行处理当前帧(用于准备状态) int processExamCPP(sampleRunJoint_RESULT_S *mResults, SitUpResult_ST &result); // 输入算法结果进行处理当前帧(用于考试状态) }; #endif