File size: 1,859 Bytes
ea35075
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import { Class } from 'type-fest'

// https://github.com/google/mediapipe/blob/master/docs/solutions/pose.md#resources
import type { Results, Pose, PoseConfig } from '@mediapipe/pose'
import * as MediapipePose from '@mediapipe/pose'
import assets from '../assets'

// @mediapipe/pose is not an es module ??
// Extract Pose from the window to solve the problem
// To prevent optimization, just print it
console.log('@mediapipe/pose', MediapipePose)
const MyPose = import.meta.env.DEV
    ? MediapipePose.Pose
    : ((window as any).Pose as Class<Pose, [PoseConfig]>)
console.log('MyPose', MyPose)

const AliyuncsBase =
    'https://openpose-editor.oss-cn-beijing.aliyuncs.com/%40mediapipe/pose'
const JsdelivrBase = 'https://cdn.jsdelivr.net/npm/@mediapipe/pose'

let UseJsdelivrBase = true
function GetCDNBase() {
    if (UseJsdelivrBase) return JsdelivrBase
    else return AliyuncsBase
}

export function SetCDNBase(isJsdelivrBase: boolean) {
    UseJsdelivrBase = isJsdelivrBase
}

const pose = new MyPose({
    locateFile: (file) => {
        if (file in assets) {
            console.log('local', file)
            return (assets as any)[file]
        }
        const url = `${GetCDNBase()}/${file}`

        console.log('load pose model', url)
        return url
    },
})

// https://github.com/google/mediapipe/blob/master/docs/solutions/pose.md#solution-apis
pose.setOptions({
    modelComplexity: 1,
    smoothLandmarks: true,
    enableSegmentation: true,
    smoothSegmentation: true,
    minDetectionConfidence: 0.5,
    minTrackingConfidence: 0.5,
})

export function DetectPosefromImage(image: HTMLImageElement): Promise<Results> {
    return new Promise((resolve) => {
        pose.reset()
        pose.send({ image: image })
        pose.onResults((result) => {
            console.log(result)
            resolve(result)
        })
    })
}