{"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"}