asj_pe_pullup.h 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #ifndef ASJ_PULLUP_H
  2. #define ASJ_PULLUP_H
  3. #include <iostream>
  4. #include <string>
  5. #include <unistd.h>
  6. #include <vector>
  7. #include <cmath>
  8. #include <queue>
  9. #include <sys/time.h>
  10. #include <cstring>
  11. #include <algorithm>
  12. #include <limits>
  13. #include "dl_api.h"
  14. #include "PEStatus.h"
  15. #include "queue.h"
  16. #include "asj_pe_base.h"
  17. typedef struct
  18. {
  19. sampleRunJoint_OBJECT_ITEM_S object;
  20. int idx;
  21. }Hand_ST;
  22. class Asj_PE_Pullup {
  23. public:
  24. int init(); // 初始化
  25. int set(PullUp_ST pullup_s); // 根据传入结构体设置参数
  26. int get(PullUp_ST *pullup_s); // 得到当前设置的参数
  27. int examReset(); // 算法数据清零
  28. int processPrepare(sampleRunJoint_RESULT_S *mResults, int *prepareStatus); // 输入算法结果进行处理当前帧(用于准备状态)
  29. int processExam(sampleRunJoint_RESULT_S *mResults, PullUpResult_ST *result); // 输入算法结果进行处理当前帧(用于考试状态)
  30. private:
  31. bool prevFrameStatus; // 用于记录下颜前一帧的状态
  32. bool isStraighten; // 用于引体向上落下的时候身体是否伸直
  33. bool isEyeoverbar; // 用于记录眼部是否过杠(前一帧)
  34. bool isFinishone; // 用于记录这次是否已经过杠
  35. bool eyeStatus; // 用于记录眼部是否高过杠的状态
  36. // PullUpExamCode currentExamStatue; // 用于记录考试状态下当前帧的结果
  37. Queue<int> prepareStatueQueue; // 用于记录准备状态队列
  38. Queue<int> eyeStatusQueue; // 用于判断头顶持续多少帧没过杠
  39. std::vector<Hand_ST> handBox; // 用于存放双手box的vector
  40. Queue<int> handStatusQueue; // 用于开始考试后存放手部的状态
  41. Queue<int> leftHandStatusQueue; // 左手状态
  42. Queue<int> rightHandStatusQueue; // 右手状态
  43. // float legLength[2]; // 准备状态下左右腿平均长度
  44. // Queue<float> leftLegLengthQueue; // 左腿长度队列
  45. // Queue<float> rightLegLengthQueue; // 右腿长度队列
  46. sampleRunJoint_POINT_S leftBar, rightBar, centerBar; // 杠的标定线
  47. float handAngle; // 双手判断的角度
  48. float legAngle; // 双腿判断的角度
  49. float shouldersRatio; // 手部的距离要小于等于肩部的距离 * (1 + shoulders_ratio)
  50. int handQueueLength; // 左右手状态的队列
  51. int overTime; // 两次完整动作时间间隔/秒
  52. float handKeypointDisThresh; // 手部关键点到杠的距离阈值
  53. PullUp_ST pullup_st; // 额外设置的结构体
  54. PullUpResult_ST pullupResult_st; // 存放统计结果的结构体
  55. struct timeval preFinishTime, nowTime; // 记录上一个完成的时间和当前的时间
  56. int processPrepareCPP(sampleRunJoint_RESULT_S *mResults, int &prepareStatus); // 输入算法结果进行处理当前帧(用于准备状态)
  57. int processExamCPP(sampleRunJoint_RESULT_S *mResults, PullUpResult_ST &result); // 输入算法结果进行处理当前帧(用于考试状态)
  58. void findNearestPeople(sampleRunJoint_RESULT_S *mResults, int &personIndex); // 寻找离杠中心点最近的人
  59. int fbHeadDetect(sampleRunJoint_POINT_S *landmark, bool isLeft); // 根据当前坐标判断正反手
  60. bool checkHandIsStraighten(sampleRunJoint_POINT_S *landmark); // 判断双手是否伸直
  61. bool checkLegIsStraighten(sampleRunJoint_POINT_S *landmark); // 判断双腿是否伸直
  62. bool checkIsBackHand(); // 根据历史状态判断正反手
  63. };
  64. #endif