Browse Source

finish arrow control

finalv2
Backpack 2 months ago
parent
commit
a109a3c513
5 changed files with 71 additions and 3 deletions
  1. BIN
      src-py/router/__pycache__/__init__.cpython-38.pyc
  2. BIN
      src-py/router/__pycache__/ws.cpython-38.pyc
  3. +33
    -0
      src/hand_landmark/detector.ts
  4. +37
    -2
      src/hand_landmark/gesture_handler.ts
  5. +1
    -1
      src/view/mainWindow/MainWindow.vue

BIN
src-py/router/__pycache__/__init__.cpython-38.pyc View File


BIN
src-py/router/__pycache__/ws.cpython-38.pyc View File


+ 33
- 0
src/hand_landmark/detector.ts View File

@ -31,6 +31,10 @@ export enum HandGesture {
DELETE_GESTURE = "delete_gesture",
OTHER = "other",
// 游戏手势
DIRECTION_RIGHT = "direction_right",
JUMP = "jump", // 食指 + 拇指上抬
}
interface HandLandmark {
@ -203,6 +207,8 @@ export class Detector {
const fingers = this._fingersUp(hand);
const fingerState = fingers.join(",");
// 定义手势映射表
const gestureMap = new Map<string, HandGesture>([
// 食指举起,移动鼠标
@ -226,6 +232,7 @@ export class Detector {
// 其他手势
["0,0,0,0,0", HandGesture.VOICE_GESTURE_STOP],
["1,1,1,0,0", HandGesture.JUMP],
]);
if (gestureMap.has(fingerState)) {
@ -237,6 +244,12 @@ export class Detector {
return HandGesture.DELETE_GESTURE;
}
// 检查右边手势
if (this._isRightGesture(hand, fingers)) {
return HandGesture.DIRECTION_RIGHT;
}
// 返回默认值
return HandGesture.OTHER;
}
@ -262,6 +275,26 @@ export class Detector {
return isThumbExtended && areOtherFingersClosed && isThumbLeftmost;
}
private static _isRightGesture(hand: HandInfo, fingers: number[]): boolean {
const THUMB_INDEX = 4;
const FINGER_TIPS = [8, 12, 16, 20];
const distance_threshold = 0.05;
const isThumbExtended = fingers[0] === 1;
const areOtherFingersClosed = fingers
.slice(1)
.every((finger) => finger === 0);
const isThumbRightmost = FINGER_TIPS.every(
(tipIndex) =>
hand.landmarks[THUMB_INDEX].x <
hand.landmarks[tipIndex].x - distance_threshold
);
return isThumbExtended && areOtherFingersClosed && isThumbRightmost;
}
/**
*
*/

+ 37
- 2
src/hand_landmark/gesture_handler.ts View File

@ -157,6 +157,12 @@ export class GestureHandler {
private lastDeleteTime: number = 0;
// 小游戏
private lastArrowLeftTime = 0;
private lastArrowRightTime = 0;
private lastJumpTime = 0;
private readonly DIRECTION_INTERVAL = 500; // 防抖间隔(毫秒)
constructor() {
this.triggerAction = new TriggerAction();
this.app_store = use_app_store();
@ -326,7 +332,27 @@ export class GestureHandler {
return;
}
this.lastDeleteTime = now;
this.triggerAction.sendKeys("backspace");
this.triggerAction.sendKeys("left");
}
private handleArrowRight() {
const now = Date.now();
if (now - this.lastDeleteTime < 300) {
return;
}
this.lastDeleteTime = now;
this.triggerAction.sendKeys("right");
}
private handleJump() {
const now = Date.now();
if (now - this.lastDeleteTime < 300) {
return;
}
this.lastDeleteTime = now;
this.triggerAction.sendKeys("up");
}
/**
@ -409,9 +435,18 @@ export class GestureHandler {
case HandGesture.FOUR_FINGERS_UP:
this.handleFourFingers();
break;
case HandGesture.DELETE_GESTURE:
this.handleDelete();
this.handleDelete();
break;
case HandGesture.DIRECTION_RIGHT:
this.handleArrowRight();
break;
case HandGesture.JUMP:
this.handleJump();
break;
}
}
}

+ 1
- 1
src/view/mainWindow/MainWindow.vue View File

@ -235,7 +235,7 @@ const statusText = computed(() => {
@backpack</a
>
</div>
<div v-else class="contributor">@ninjakelly</div>
<div v-else class="contributor">@backpack</div>
</div>
</div>

Loading…
Cancel
Save