asj_pe_situp.h 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #include <string>
  2. #include <unistd.h>
  3. #include <vector>
  4. #include <cmath>
  5. #include <queue>
  6. #include <sys/time.h>
  7. #include <cstring>
  8. #include <algorithm>
  9. #include <limits>
  10. #ifndef ASJ_SITUP_H
  11. #define ASJ_SITUP_H
  12. #include "dl_api.h"
  13. #include "PEStatus.h"
  14. #include "queue.h"
  15. #include "asj_pe_base.h"
  16. class Asj_PE_Situp{
  17. public:
  18. int init(); // 初始化
  19. int set(SitUp_ST situp_s); // 根据传入结构体设置参数
  20. int get(SitUp_ST *situp_s); // 得到当前设置的参数
  21. int examReset(); // 算法数据清零
  22. int processPrepare(sampleRunJoint_RESULT_S *mResults, int *prepareStatus); // 输入算法结果进行处理当前帧(用于准备状态)
  23. int processExam(sampleRunJoint_RESULT_S *mResults, SitUpResult_ST *result); // 输入算法结果进行处理当前帧(用于考试状态)
  24. private:
  25. int streamHeight, streamWidth; // 媒体流的高宽
  26. SitUpExamCode currentExamStatue; // 用于记录考试状态下当前帧的结果
  27. bool isLieFalt; // 判断背部是否与地面平行
  28. bool isHipLift; // 判断仰卧时,臀部是否离垫
  29. bool isHandNotCloseHand; // 用于存放手部是否贴近头部的状态
  30. bool isNewRound; // 判断是否开始新的回合
  31. bool isUp; // 利用肩臀膝角度来判断是否在进行起坐状态
  32. bool isClockWise; // 仰卧起坐中,身体的右侧面向摄像头为true,反之为false
  33. bool isLegAngleLegal; // 判断膝盖角度是否合格
  34. Queue<int> prepareStatueQueue; // 用于记录准备状态队列
  35. Queue<int> handStatueQueue; // 用于存放手部是否贴近头部的状态
  36. Queue<int> kneeStatueQueue; // 用于存放膝盖角度是否符合要求的状态
  37. Queue<int> shoulderHipKneeQueue; // 用于记录肩臀膝角度队列
  38. int upStatueAngle; // 用于判断是否满足up状态的角度(肩臀平角)
  39. int newRoundAngle; // 用于判断是否开启新回合的角度(肩臀平角)
  40. SitUp_ST situp_st; // 额外设置的结构体
  41. SitUpResult_ST situpResult_st; // 存放统计结果的结构体
  42. void getPeopleNums(sampleRunJoint_RESULT_S *mResults, int &personIndex);
  43. bool checkIsLieFlat(sampleRunJoint_POINT_S *landmark, float limit);
  44. bool checkIsUpStatus(sampleRunJoint_POINT_S *landmark);
  45. bool checkIsTouchKnee(sampleRunJoint_POINT_S *landmark, float limit);
  46. bool checkHipIsLiftPad(sampleRunJoint_POINT_S *landmark);
  47. bool checkKneeAngle(sampleRunJoint_POINT_S *landmark);
  48. void resetFlag();
  49. int processPrepareCPP(sampleRunJoint_RESULT_S *mResults, int &prepareStatus); // 输入算法结果进行处理当前帧(用于准备状态)
  50. int processExamCPP(sampleRunJoint_RESULT_S *mResults, SitUpResult_ST &result); // 输入算法结果进行处理当前帧(用于考试状态)
  51. };
  52. #endif