{"_id":"@01works/mediapipe","_rev":"7-ab3d46ca8ce1b5fa8a7a8b1f23709a63","name":"@01works/mediapipe","dist-tags":{"latest":"0.10.21-250425.63951"},"versions":{"0.0.1-250326.80010":{"name":"@01works/mediapipe","version":"0.0.1-250326.80010","keywords":[],"author":{"name":"01.works"},"license":"MIT","_id":"@01works/mediapipe@0.0.1-250326.80010","maintainers":[{"name":"kdnhyk","email":"kdnhyk@gmail.com"}],"dist":{"shasum":"1d266ea23a7240ebc8dbae01220203625575d1c1","tarball":"https://registry.npmjs.org/@01works/mediapipe/-/mediapipe-0.0.1-250326.80010.tgz","fileCount":36,"integrity":"sha512-aBfTO5uhlIveffUD0n2MZafhqWVW4/aD9TIGxXSRDFUuXMe63MY7N7fQDyrahzn/hq/3QN3yP1arD5agykE+IQ==","signatures":[{"sig":"MEUCIBQ/XO+YKvpJ3uY8Bh99ONIO7rk5Y2jNIukAxlwZoLATAiEA3pWFG2oP0k/gyXgAaNKmQTShTqaGcGvvdGWb1vOy9do=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":676296},"main":"./dist/index.cjs","type":"module","_from":"file:01works-mediapipe-0.0.1-250326.80010.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"},"development":"./src/index.ts"},"./package.json":"./package.json"},"scripts":{"lint":"eslint ./src","test":"vitest","build":"tsup","clean":"rimraf ./dist ./coverage","test:watch":"vitest --watch","publish:date":"npm version $(pnpm run -s version:date) --no-git-tag-version && pnpm publish --no-git-checks --access public","test:publish":"publint --strict && attw --pack","version:date":"node ../../../scripts/version-date.js"},"_npmUser":{"name":"kdnhyk","email":"kdnhyk@gmail.com"},"_resolved":"/private/var/folders/mr/1yy73dlx7rg_sb0x6j2hvfs80000gn/T/019ffaee8d3c569e69b0e0ca6575f8c4/01works-mediapipe-0.0.1-250326.80010.tgz","_integrity":"sha512-aBfTO5uhlIveffUD0n2MZafhqWVW4/aD9TIGxXSRDFUuXMe63MY7N7fQDyrahzn/hq/3QN3yP1arD5agykE+IQ==","_npmVersion":"10.9.0","description":"Mediapipe tools for all environments","directories":{},"sideEffects":false,"_nodeVersion":"22.11.0","dependencies":{"@mediapipe/tasks-vision":"^0.10.21"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mediapipe_0.0.1-250326.80010_1742976038680_0.2675019384036099","host":"s3://npm-registry-packages-npm-production"}},"0.0.1-250328.2504":{"name":"@01works/mediapipe","version":"0.0.1-250328.2504","keywords":[],"author":{"name":"01.works"},"license":"MIT","_id":"@01works/mediapipe@0.0.1-250328.2504","maintainers":[{"name":"kdnhyk","email":"kdnhyk@gmail.com"}],"dist":{"shasum":"6f3d41db2aef33cbd302febea4b9b5b6952d7947","tarball":"https://registry.npmjs.org/@01works/mediapipe/-/mediapipe-0.0.1-250328.2504.tgz","fileCount":14,"integrity":"sha512-V5UdmVdmugR6z0q7MCPIIY2fs0jZdS+XK2Uo/Ofrk1TJXpViX7tVp3Jd7fxFGjQJffcegjfHI5/1v9O0opSLfQ==","signatures":[{"sig":"MEUCICa5UzIDuN3A4Qwl5P42ftEU/7glKxDDnLoSlXfG30IgAiEAqtvFH36jO/QliUMMrwuJrUDH2EQFig8cBv2DAhUhPE8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1238122},"main":"./dist/index.cjs","type":"module","_from":"file:01works-mediapipe-0.0.1-250328.2504.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"},"development":"./src/index.ts"},"./package.json":"./package.json"},"scripts":{"lint":"eslint ./src","test":"vitest","build":"tsup","clean":"rimraf ./dist ./coverage","test:watch":"vitest --watch","publish:date":"npm version $(pnpm run -s version:date) --no-git-tag-version && pnpm publish --no-git-checks --access public","test:publish":"publint --strict && attw --pack","version:date":"node ../../../scripts/version-date.js"},"_npmUser":{"name":"kdnhyk","email":"kdnhyk@gmail.com"},"_resolved":"/private/var/folders/mr/1yy73dlx7rg_sb0x6j2hvfs80000gn/T/9fc0b24371e8a00067387163cbd185f0/01works-mediapipe-0.0.1-250328.2504.tgz","_integrity":"sha512-V5UdmVdmugR6z0q7MCPIIY2fs0jZdS+XK2Uo/Ofrk1TJXpViX7tVp3Jd7fxFGjQJffcegjfHI5/1v9O0opSLfQ==","_npmVersion":"10.9.0","description":"Mediapipe tools for all environments","directories":{},"sideEffects":false,"_nodeVersion":"22.11.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.0.0","@mediapipe/tasks-vision":"^0.10.21"},"_npmOperationalInternal":{"tmp":"tmp/mediapipe_0.0.1-250328.2504_1743121522559_0.893531908142954","host":"s3://npm-registry-packages-npm-production"}},"0.10.21-250328.2827":{"name":"@01works/mediapipe","version":"0.10.21-250328.2827","keywords":[],"author":{"name":"01.works"},"license":"MIT","_id":"@01works/mediapipe@0.10.21-250328.2827","maintainers":[{"name":"kdnhyk","email":"kdnhyk@gmail.com"}],"dist":{"shasum":"1ed3231a988808c88c237a351fe8bfb245fb4c91","tarball":"https://registry.npmjs.org/@01works/mediapipe/-/mediapipe-0.10.21-250328.2827.tgz","fileCount":8,"integrity":"sha512-0X7Ewaoa0yCEJph8CyjlPnbY5Y88b3vTRazW4xQ0CQavYopSL80p6J+W8+a4q3beoqpEYP9hnL2VhK8oVA4vhQ==","signatures":[{"sig":"MEYCIQCrc8aF7cJtdR0M35+HjcSiRF1o+0oT2FfMR64f+hqMPQIhAI+zCSZjp01iUpCTgPpf2oKRtni+v+wOzmz/6khG1e+5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":65628},"main":"./dist/index.cjs","type":"module","_from":"file:01works-mediapipe-0.10.21-250328.2827.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./package.json":"./package.json"},"scripts":{"lint":"eslint ./src","test":"vitest","build":"tsup","clean":"rimraf ./dist ./coverage","test:watch":"vitest --watch","publish:date":"npm version $(pnpm run -s version:date) --no-git-tag-version && pnpm publish --no-git-checks --access public","test:publish":"publint --strict && attw --pack","version:date":"node ../../../scripts/version-date.js"},"_npmUser":{"name":"kdnhyk","email":"kdnhyk@gmail.com"},"_resolved":"/private/var/folders/mr/1yy73dlx7rg_sb0x6j2hvfs80000gn/T/5c4a7c026a9279e0a506abb63b67de89/01works-mediapipe-0.10.21-250328.2827.tgz","_integrity":"sha512-0X7Ewaoa0yCEJph8CyjlPnbY5Y88b3vTRazW4xQ0CQavYopSL80p6J+W8+a4q3beoqpEYP9hnL2VhK8oVA4vhQ==","_npmVersion":"10.9.0","description":"Mediapipe tools for all environments","directories":{},"sideEffects":false,"_nodeVersion":"22.11.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.0.0","@mediapipe/tasks-vision":"^0.10.21"},"peerDependencies":{"react":"^19.0.0","@mediapipe/tasks-vision":"^0.10.21"},"_npmOperationalInternal":{"tmp":"tmp/mediapipe_0.10.21-250328.2827_1743121723965_0.06996313234870088","host":"s3://npm-registry-packages-npm-production"}},"0.10.21-250425.63951":{"name":"@01works/mediapipe","version":"0.10.21-250425.63951","description":"Mediapipe tools for all environments","author":{"name":"01.works"},"license":"MIT","keywords":[],"type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./package.json":"./package.json"},"sideEffects":false,"dependencies":{},"devDependencies":{"@mediapipe/tasks-vision":"^0.10.21","react":"^19.1.0"},"peerDependencies":{"@mediapipe/tasks-vision":"^0.10.21","react":"^19.1.0"},"scripts":{"clean":"rimraf ./dist ./coverage","lint":"eslint ./src","test":"vitest","test:watch":"vitest --watch","test:publish":"publint --strict && attw --pack","build":"tsup","version:date":"node ../../../scripts/version-date.js","publish:date":"npm version $(pnpm run -s version:date) --no-git-tag-version && pnpm publish --no-git-checks --access public"},"_id":"@01works/mediapipe@0.10.21-250425.63951","_integrity":"sha512-rF8Zk26ktOC8syKV28FnTIfCM0Q/klLuxlw8hUFD0PtzKKkwiiHGxJ9r0oGePShCWJdavhGPDEh/J3+znlfZpg==","_resolved":"/private/var/folders/mr/1yy73dlx7rg_sb0x6j2hvfs80000gn/T/cb76e3e62eea11a39f93f514c2aa6809/01works-mediapipe-0.10.21-250425.63951.tgz","_from":"file:01works-mediapipe-0.10.21-250425.63951.tgz","_nodeVersion":"22.11.0","_npmVersion":"10.9.0","dist":{"integrity":"sha512-rF8Zk26ktOC8syKV28FnTIfCM0Q/klLuxlw8hUFD0PtzKKkwiiHGxJ9r0oGePShCWJdavhGPDEh/J3+znlfZpg==","shasum":"edaadc6429d3be85bedc733d194c469da1162b63","tarball":"https://registry.npmjs.org/@01works/mediapipe/-/mediapipe-0.10.21-250425.63951.tgz","fileCount":8,"unpackedSize":63796,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICoZ3fepaFFhylBXIa6Ol01JR3XDKiIrbNIb/afoEIdBAiB3k42V1j3WLi3/7jFzUTuRcZPHA2YJsI3JgBRK6HnN4w=="}]},"_npmUser":{"name":"kdnhyk","email":"kdnhyk@gmail.com"},"directories":{},"maintainers":[{"name":"kdnhyk","email":"kdnhyk@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mediapipe_0.10.21-250425.63951_1745563208283_0.4867538347181224"},"_hasShrinkwrap":false}},"time":{"created":"2025-03-26T08:00:38.585Z","modified":"2025-04-25T06:40:08.624Z","0.0.1":"2024-07-24T02:56:22.251Z","0.0.1-250326.80010":"2025-03-26T08:00:38.919Z","0.0.1-250328.2504":"2025-03-28T00:25:22.779Z","0.10.21-250328.2827":"2025-03-28T00:28:44.145Z","0.10.21-250425.63951":"2025-04-25T06:40:08.445Z"},"author":{"name":"01.works"},"license":"MIT","keywords":[],"description":"Mediapipe tools for all environments","maintainers":[{"name":"kdnhyk","email":"kdnhyk@gmail.com"}],"readme":"# MediaPipe 라이브러리\n\nMediaPipe 비전 태스크를 쉽게 사용할 수 있는 래퍼 라이브러리입니다.\n\n## 설치\n\n```bash\nnpm install @01works/mediapipe\n```\n\n## 기능\n\n- 얼굴 랜드마크 감지 (FaceLandmarkerTask)\n- 이미지 세그멘테이션 (ImageSegmenterTask)\n- 객체 감지 (ObjectDetectorTask)\n- 자동 에러 처리 및 리소스 관리\n- 성능 모니터링 (FPS, 프레임 처리 시간)\n- 다양한 시각화 도구 (바운딩 박스, 마스크 등)\n- 자동 및 수동 프레임 처리 지원\n- 비디오, 이미지, 캔버스 입력 지원\n\n## 사용 예시\n\n### 얼굴 랜드마크 감지\n\n#### 자동 프레임 처리 모드\n\n```typescript\nimport {\n  FaceLandmarkerTask,\n  TaskResult,\n  FaceLandmarkerResult,\n  TaskStatus,\n} from '@01works/mediapipe'\n\n// 얼굴 랜드마크 태스크 생성\nconst faceLandmarker = new FaceLandmarkerTask(\n  {\n    enableWebGPU: true, // WebGPU 사용 (기본값: false)\n    numFaces: 1, // 감지할 얼굴 수 (기본값: 1)\n    autoProcess: true, // 자동 프레임 처리 활성화 (기본값: true)\n  },\n  (result: TaskResult<FaceLandmarkerResult>) => {\n    // 결과 처리\n    if (result.data) {\n      console.log('얼굴 랜드마크:', result.data.faceLandmarks)\n    }\n  },\n)\n\n// 태스크 초기화 및 시작\ntry {\n  await faceLandmarker.initialize()\n  await faceLandmarker.initializeVideoStream('user') // 카메라 스트림 초기화\n  await faceLandmarker.start()\n\n  // 얼굴 감지 여부 확인\n  if (faceLandmarker.isFaceDetected()) {\n    console.log('얼굴이 감지되었습니다!')\n  }\n\n  // 특정 얼굴 부위 데이터 가져오기\n  const eyeData = faceLandmarker.getFeatureData('left_eye')\n  if (eyeData) {\n    console.log('왼쪽 눈 위치:', eyeData[0].position)\n  }\n\n  // 성능 정보 확인\n  const { fps, processingTime } = faceLandmarker.getPerformanceInfo()\n  console.log(\n    `FPS: ${fps.toFixed(1)}, 처리 시간: ${processingTime.toFixed(2)}ms`,\n  )\n} catch (error) {\n  console.error('얼굴 랜드마크 오류:', error)\n} finally {\n  // 사용 완료 후 정리\n  await faceLandmarker.dispose()\n}\n```\n\n#### 수동 프레임 처리 모드\n\n```typescript\nimport {\n  FaceLandmarkerTask,\n  TaskResult,\n  FaceLandmarkerResult,\n} from '@01works/mediapipe'\n\n// 얼굴 랜드마크 태스크 생성 (자동 프레임 처리 비활성화)\nconst faceLandmarker = new FaceLandmarkerTask(\n  {\n    enableWebGPU: true,\n    numFaces: 1,\n    autoProcess: false, // 자동 프레임 처리 비활성화\n  },\n  (result: TaskResult<FaceLandmarkerResult>) => {\n    // 결과 콜백 (선택적)\n  },\n)\n\n// 태스크 초기화\nawait faceLandmarker.initialize()\n\n// 이미지 요소에서 얼굴 감지\nconst image = document.getElementById('input-image') as HTMLImageElement\nconst result = await faceLandmarker.processSingleFrame(image)\n\nif (result) {\n  console.log('감지된 얼굴:', result.faceLandmarks)\n}\n\n// 비디오 프레임 처리 (requestAnimationFrame 사용)\nconst video = document.getElementById('input-video') as HTMLVideoElement\nconst processVideoFrame = async () => {\n  if (video.readyState >= 2) {\n    const result = await faceLandmarker.processSingleFrame(video)\n    if (result) {\n      // 결과 처리\n    }\n  }\n  requestAnimationFrame(processVideoFrame)\n}\nrequestAnimationFrame(processVideoFrame)\n\n// 사용 완료 후 정리\nawait faceLandmarker.dispose()\n```\n\n### 이미지 세그멘테이션\n\n#### 자동 프레임 처리 모드\n\n```typescript\nimport {\n  ImageSegmenterTask,\n  ImageSegmenterModelType,\n  TaskResult,\n  ImageSegmenterResult,\n} from '@01works/mediapipe'\n\n// 이미지 세그멘터 태스크 생성\nconst imageSegmenter = new ImageSegmenterTask(\n  {\n    modelType: ImageSegmenterModelType.SELFIE_SEGMENTER, // 모델 타입 (기본값: SELFIE_SEGMENTER)\n    enableWebGPU: true, // WebGPU 사용 (기본값: false)\n    autoProcess: true, // 자동 프레임 처리 활성화 (기본값: true)\n  },\n  (result: TaskResult<ImageSegmenterResult>) => {\n    // 결과 처리\n    if (result.data?.categoryMask) {\n      console.log('세그멘테이션 마스크 크기:', result.data.categoryMask.length)\n    }\n  },\n)\n\n// 태스크 초기화 및 시작\ntry {\n  await imageSegmenter.initialize()\n  await imageSegmenter.initializeVideoStream('user') // 카메라 스트림 초기화\n  await imageSegmenter.start()\n\n  // 마스크 처리 옵션 설정\n  imageSegmenter.setDefaultMaskOptions({\n    threshold: 0.5,\n    foregroundColor: 'rgba(255, 0, 0, 0.5)',\n    backgroundColor: 'rgba(0, 0, 0, 0)',\n    opacity: 0.7,\n  })\n\n  // 마스크 그리기\n  const maskCanvas = imageSegmenter.drawMask()\n  if (maskCanvas) {\n    document.body.appendChild(maskCanvas)\n  }\n} catch (error) {\n  console.error('이미지 세그멘테이션 오류:', error)\n} finally {\n  // 사용 완료 후 정리\n  await imageSegmenter.dispose()\n}\n```\n\n#### 수동 프레임 처리 모드\n\n```typescript\nimport { ImageSegmenterTask, ImageSegmenterModelType } from '@01works/mediapipe'\n\n// 이미지 세그멘터 태스크 생성 (자동 프레임 처리 비활성화)\nconst imageSegmenter = new ImageSegmenterTask({\n  modelType: ImageSegmenterModelType.SELFIE_SEGMENTER,\n  enableWebGPU: true,\n  autoProcess: false, // 자동 프레임 처리 비활성화\n})\n\n// 태스크 초기화\nawait imageSegmenter.initialize()\n\n// 이미지 요소에서 세그멘테이션 수행\nconst image = document.getElementById('input-image') as HTMLImageElement\nconst result = await imageSegmenter.processSingleFrame(image)\n\nif (result?.categoryMask) {\n  // 마스크 데이터 직접 처리\n  const imageData = imageSegmenter.processMaskData(\n    result.categoryMask,\n    result.width,\n    result.height,\n    (value, x, y, index) => {\n      // 각 픽셀에 대한 처리 로직\n      return value > 0.5\n        ? { r: 255, g: 0, b: 0, a: 0.7 } // 전경\n        : { r: 0, g: 0, b: 0, a: 0 } // 배경\n    },\n  )\n\n  // 이미지 데이터를 캔버스에 그리기\n  const canvas = document.getElementById('output-canvas') as HTMLCanvasElement\n  const ctx = canvas.getContext('2d')\n  if (ctx) {\n    ctx.putImageData(imageData, 0, 0)\n  }\n}\n\n// 사용 완료 후 정리\nawait imageSegmenter.dispose()\n```\n\n### 객체 감지\n\n#### 자동 프레임 처리 모드\n\n```typescript\nimport {\n  ObjectDetectorTask,\n  TaskResult,\n  ObjectDetectorResult,\n} from '@01works/mediapipe'\n\n// 객체 감지 태스크 생성\nconst objectDetector = new ObjectDetectorTask(\n  {\n    enableWebGPU: true, // WebGPU 사용 (기본값: false)\n    scoreThreshold: 0.5, // 감지 점수 임계값 (기본값: 0.5)\n    autoProcess: true, // 자동 프레임 처리 활성화 (기본값: true)\n  },\n  (result: TaskResult<ObjectDetectorResult>) => {\n    // 결과 처리\n    if (result.data) {\n      console.log('감지된 객체:', result.data.detections)\n    }\n  },\n)\n\n// 태스크 초기화 및 시작\ntry {\n  await objectDetector.initialize()\n  await objectDetector.initializeVideoStream('environment') // 후면 카메라 스트림 초기화\n  await objectDetector.start()\n\n  // 바운딩 박스 옵션 설정\n  objectDetector.setDefaultBoxOptions({\n    lineWidth: 3,\n    lineColor: 'green',\n    fillColor: 'rgba(0, 255, 0, 0.2)',\n    showLabels: true,\n    showScores: true,\n  })\n\n  // 바운딩 박스 그리기\n  objectDetector.drawBoundingBoxes()\n\n  // 특정 카테고리 필터링\n  const persons = objectDetector.filterByCategories(['person'])\n  console.log('감지된 사람 수:', persons.length)\n\n  // 높은 점수의 객체만 필터링\n  const highConfidenceObjects = objectDetector.filterByScore(0.8)\n  console.log('높은 신뢰도 객체 수:', highConfidenceObjects.length)\n} catch (error) {\n  console.error('객체 감지 오류:', error)\n} finally {\n  // 사용 완료 후 정리\n  await objectDetector.dispose()\n}\n```\n\n#### 수동 프레임 처리 모드\n\n```typescript\nimport { ObjectDetectorTask } from '@01works/mediapipe'\n\n// 객체 감지 태스크 생성 (자동 프레임 처리 비활성화)\nconst objectDetector = new ObjectDetectorTask({\n  enableWebGPU: true,\n  scoreThreshold: 0.5,\n  autoProcess: false, // 자동 프레임 처리 비활성화\n})\n\n// 태스크 초기화\nawait objectDetector.initialize()\n\n// 이미지 요소에서 객체 감지\nconst image = document.getElementById('input-image') as HTMLImageElement\nconst result = await objectDetector.processSingleFrame(image)\n\nif (result?.detections.length) {\n  console.log('감지된 객체:', result.detections)\n\n  // 특정 캔버스에 바운딩 박스 그리기\n  const canvas = document.getElementById('output-canvas') as HTMLCanvasElement\n  objectDetector.drawBoundingBoxes(canvas)\n}\n\n// 사용 완료 후 정리\nawait objectDetector.dispose()\n```\n\n## 에러 처리\n\n모든 태스크는 에러 처리를 위한 메커니즘을 제공합니다:\n\n```typescript\ntry {\n  await faceLandmarker.initialize()\n} catch (error) {\n  console.error('초기화 오류:', error)\n}\n\n// 또는 결과 콜백에서 에러 확인\nfaceLandmarker.setResultCallback((result) => {\n  if (result.error) {\n    console.error('처리 오류:', result.error)\n    return\n  }\n\n  // 정상 결과 처리\n  console.log('결과:', result.data)\n})\n```\n\n## 상태 관리\n\n태스크의 상태를 확인할 수 있습니다:\n\n```typescript\nimport { TaskStatus } from '@01works/mediapipe'\n\nconst status = faceLandmarker.getStatus()\nif (status === TaskStatus.READY) {\n  console.log('태스크가 준비되었습니다.')\n} else if (status === TaskStatus.ERROR) {\n  console.error('태스크 오류:', faceLandmarker.getError())\n}\n```\n\n## 성능 모니터링\n\n태스크의 성능을 모니터링할 수 있습니다:\n\n```typescript\n// 현재 FPS 가져오기\nconst fps = faceLandmarker.getFPS()\nconsole.log(`현재 FPS: ${fps.toFixed(1)}`)\n\n// 프레임 처리 시간 가져오기\nconst processingTime = faceLandmarker.getFrameProcessingTime()\nconsole.log(`프레임 처리 시간: ${processingTime.toFixed(2)}ms`)\n\n// 성능 정보 한 번에 가져오기\nconst { fps, processingTime } = faceLandmarker.getPerformanceInfo()\n```\n\n## 캔버스 및 비디오 접근\n\n태스크의 캔버스와 비디오 요소에 접근할 수 있습니다:\n\n```typescript\n// 캔버스 가져오기\nconst canvas = faceLandmarker.getCanvas()\nif (canvas) {\n  document.body.appendChild(canvas)\n}\n\n// 비디오 요소 가져오기\nconst video = faceLandmarker.getVideo()\n```\n\n## 그리기 옵션 설정\n\n비디오나 이미지를 캔버스에 그리는 방식을 설정할 수 있습니다:\n\n```typescript\nfaceLandmarker.setDrawOptions({\n  fit: 'cover', // 'cover', 'contain', 'fill' 중 하나\n  objectPosition: 'center', // 'center', 'top', 'bottom', 'left', 'right' 중 하나\n})\n```\n\n## 자동 프레임 처리 설정\n\n태스크의 자동 프레임 처리 여부를 동적으로 변경할 수 있습니다:\n\n```typescript\n// 자동 프레임 처리 비활성화\nfaceLandmarker.setAutoProcess(false)\n\n// 자동 프레임 처리 활성화\nfaceLandmarker.setAutoProcess(true)\n\n// 현재 자동 프레임 처리 상태 확인\nconst isAutoProcessing = faceLandmarker.isAutoProcessing()\n```\n\n## 리소스 관리\n\n모든 태스크는 사용 완료 후 반드시 정리해야 합니다:\n\n```typescript\nawait faceLandmarker.dispose()\n```\n\n## 라이선스\n\nMIT\n","readmeFilename":"README.md"}