128 lines
3.3 KiB
JavaScript
128 lines
3.3 KiB
JavaScript
/**
|
||
* 手平举运动分析器
|
||
*
|
||
* @alphaair
|
||
* 20220303 created.
|
||
**/
|
||
|
||
const utils = require("../../utils/utils");
|
||
const AiSport = requirePlugin("aiSport");
|
||
const SportBase = AiSport.sports.SportBase;
|
||
const Calculator = AiSport.calc.Calculator;
|
||
|
||
/**
|
||
* 手平举运动分析器
|
||
*/
|
||
class SportHandLift extends SportBase {
|
||
_calc = null
|
||
_calculator = null
|
||
|
||
stateTran = -1
|
||
|
||
/**
|
||
* 初始化分析器
|
||
*
|
||
* @param {int?} pointThreshold 计算器取点评分阈值
|
||
*/
|
||
constructor(pointThreshold) {
|
||
super(pointThreshold);
|
||
|
||
this.tickMode = true; //计次模式
|
||
this._calc = new AiSport.calc.CalcBase();
|
||
this._calculator = new Calculator();
|
||
this._calculator.pointThreshold = this.pointThreshold;
|
||
this.buildRules();
|
||
}
|
||
|
||
buildRules() {
|
||
this.basePose = {
|
||
name: '基本姿态',
|
||
calc: '$and',
|
||
rules: [{
|
||
name: '全身需入镜',
|
||
calc: 'whole'
|
||
}, {
|
||
name: '站立姿态',
|
||
calc: 'stand'
|
||
}, {
|
||
name: '站立姿态',
|
||
calc: 'stand'
|
||
}, {
|
||
name: '任一手平直',
|
||
calc: '$or',
|
||
rules: [{
|
||
name: '左平直状态',
|
||
calc: 'match-angle',
|
||
angleKey: 'left_shoulder',
|
||
secondKey: 'left_hip',
|
||
thirdKey: 'left_wrist',
|
||
angle: 90,
|
||
offset: 20
|
||
}, {
|
||
name: '右平直状态',
|
||
calc: 'match-angle',
|
||
angleKey: 'right_shoulder',
|
||
secondKey: 'right_hip',
|
||
thirdKey: 'right_wrist',
|
||
angle: 90,
|
||
offset: 20
|
||
}]
|
||
}]
|
||
};
|
||
}
|
||
|
||
pushing(body) {
|
||
|
||
if (utils.isNone(body))
|
||
return;
|
||
|
||
//基本姿态不符合要求
|
||
if (!this._calculator.calculating(body, {
|
||
name: '站立姿态',
|
||
calc: 'stand'
|
||
})) {
|
||
let f = this.invalid ? null : -2;
|
||
this.invalid = true;
|
||
return f;
|
||
}
|
||
|
||
if (!this._calculator.calculating(body, this.basePose))
|
||
return;
|
||
|
||
this.invalid = false;
|
||
let nose = this._calc.findPoint(body.keypoints, 'nose');
|
||
if (!nose)
|
||
return;
|
||
|
||
let wrist = null;
|
||
let leftWrist = this._calc.findPoint(body.keypoints, 'left_wrist');
|
||
let rightWrist = this._calc.findPoint(body.keypoints, 'right_wrist');
|
||
if (!leftWrist || !rightWrist)
|
||
return;
|
||
|
||
if (leftWrist && rightWrist)
|
||
wrist = leftWrist.score > rightWrist.score ? leftWrist : rightWrist;
|
||
else
|
||
wrist = leftWrist || rightWrist;
|
||
|
||
//前伸算起始动作
|
||
if (wrist.x > nose.x) {
|
||
this.stateTran = 1;
|
||
return;
|
||
}
|
||
|
||
//到达结束动作,计数1
|
||
if (wrist.x >= nose.x || this.stateTran !== 1)
|
||
return;
|
||
|
||
this.stateTran = -1;
|
||
this.countTimes();
|
||
this.emitTick();
|
||
console.log('on-tick');
|
||
}
|
||
}
|
||
|
||
SportHandLift.KEY = "Hand-Lift";
|
||
SportHandLift.NAME = "自定义-手臂平伸运动";
|
||
|
||
module.exports = SportHandLift; |