UNPKG

mediapipe-pose-smooth

Version:

This will remove the jitter and smooth the landmarks given by Mediapipe

1 lines 3.68 kB
{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["/**\n * This will remove the jitter and smooth the landmarks given by Mediapipe\n * @author Yousuf Kalim\n */\n\ntype Landmarks = Array<{\n x: number;\n y: number;\n z: number;\n visibility: number;\n}>;\n\nexport interface Results {\n poseLandmarks: Landmarks;\n}\n\nconst frameSets: Landmarks[] = [];\nconst smoothFrame: Landmarks = [];\n\n/**\n * smoothLandmarks\n * @param {Object} results This should be coming directly from Mediapipe\n * @param {Function} onResults Optional: If you want to call other function instead of getting return\n * @returns {Object}\n */\nconst smoothLandmarks = (\n results: Results,\n onResults?: (results: Results) => void,\n): Results | void => {\n // Pushing frame at the end of frameSet array\n if (results.poseLandmarks) {\n frameSets.push(results.poseLandmarks);\n }\n\n if (frameSets.length === 8) {\n // This loop will run 33 time to make average of each joint\n for (let i = 0; i < 33; i++) {\n // Making an array of each joint coordinates\n let x = frameSets.map((a) => a[i].x);\n let y = frameSets.map((a) => a[i].y);\n let z = frameSets.map((a) => a[i].z);\n let visibility = frameSets.map((a) => a[i].visibility);\n\n // Sorting the array into ascending order\n x = x.sort((a, b) => a - b);\n y = y.sort((a, b) => a - b);\n z = z.sort((a, b) => a - b);\n visibility = visibility.sort((a, b) => a - b);\n\n // Dropping 2 min and 2 max coordinates\n x = x.slice(2, 6);\n y = y.slice(2, 6);\n z = z.slice(2, 6);\n visibility = visibility.slice(2, 6);\n\n // Making the average of 4 remaining coordinates\n smoothFrame[i] = {\n x: x.reduce((a, b) => a + b, 0) / x.length,\n y: y.reduce((a, b) => a + b, 0) / y.length,\n z: z.reduce((a, b) => a + b, 0) / z.length,\n visibility: visibility.reduce((a, b) => a + b, 0) / visibility.length,\n };\n }\n\n // Removing the first frame from frameSet\n frameSets.shift();\n }\n\n // after first 8 frames we have averaged coordinates, So now updating the poseLandmarks with averaged coordinates\n if (smoothFrame.length > 0) {\n results.poseLandmarks = smoothFrame;\n }\n\n return onResults ? onResults(results) : results;\n};\n\nexport default smoothLandmarks;\n"],"names":["smoothFrame","results","onResults","poseLandmarks","frameSets","push","length","i","map","a","x","y","z","visibility","sort","b","slice","reduce","_loop","shift"],"mappings":"AAgBA,MAA+B,GACzBA,EAAyB,kBAQP,SACtBC,EACAC,GAOA,GAJID,EAAQE,eACVC,EAAUC,KAAKJ,EAAQE,eAGA,IAArBC,EAAUE,OAAc,CAE1B,IAASC,IAAAA,EAAAA,SAAAA,GAEP,MAAQH,EAAUI,IAAI,SAACC,GAAC,SAAOF,GAAGG,CAAC,KAC3BN,EAAUI,IAAI,SAACC,GAAC,SAAOF,GAAGI,CAAC,KAC3BP,EAAUI,IAAI,SAACC,GAAC,OAAMA,EAACF,GAAGK,CAAC,GACrBC,EAAGT,EAAUI,IAAI,SAACC,UAAOA,EAACF,GAAGM,UAAU,GAGrDH,EAAIA,EAAEI,KAAK,SAACL,EAAGM,GAAC,SAASA,CAAC,GAC1BJ,EAAIA,EAAEG,KAAK,SAACL,EAAGM,GAAMN,OAAAA,EAAIM,CAAC,GAC1BH,EAAIA,EAAEE,KAAK,SAACL,EAAGM,GAAC,SAASA,CAAC,GAC1BF,EAAaA,EAAWC,KAAK,SAACL,EAAGM,UAAON,EAAGM,CAAC,GAG5CL,EAAIA,EAAEM,MAAM,EAAG,GACfL,EAAIA,EAAEK,MAAM,EAAG,GACfJ,EAAIA,EAAEI,MAAM,EAAG,GACfH,EAAaA,EAAWG,MAAM,EAAG,GAGjChB,EAAYO,GAAK,CACfG,EAAGA,EAAEO,OAAO,SAACR,EAAGM,UAAON,EAAGM,CAAC,EAAE,GAAKL,EAAEJ,OACpCK,EAAGA,EAAEM,OAAO,SAACR,EAAGM,GAAMN,OAAAA,EAAIM,CAAC,EAAE,GAAKJ,EAAEL,OACpCM,EAAGA,EAAEK,OAAO,SAACR,EAAGM,UAAON,EAAGM,CAAC,EAAE,GAAKH,EAAEN,OACpCO,WAAYA,EAAWI,OAAO,SAACR,EAAGM,GAAC,SAASA,CAAC,EAAE,GAAKF,EAAWP,OAC/D,EAzBKC,EAAI,EAAGA,EAAI,GAAIA,IAAKW,EAApBX,GA6BTH,EAAUe,OACX,CAOD,OAJInB,EAAYM,OAAS,IACvBL,EAAQE,cAAgBH,GAGnBE,EAAYA,EAAUD,GAAWA,CAC1C"}