import {
RppgProcessor,
MediaPipeFaceFrameSource,
loadFaceMesh,
averageGreenInROI,
} from "@elata-biosciences/rppg-web";
// Step 1: Load face mesh model
const faceMesh = await loadFaceMesh();
// Step 2: Create frame source with face mesh
const source = new MediaPipeFaceFrameSource(faceMesh);
// Step 3: Create processor
const processor = new RppgProcessor("wasm", 30, 10); // 10s window
// Step 4: Process each frame
source.onFrame = (frame) => {
if (!frame.roi) return; // no face detected
const { x, y, w, h } = frame.roi;
const green = averageGreenInROI(frame, x, y, w, h);
processor.pushSample(frame.timestampMs ?? performance.now(), green);
};
// Step 5: Start camera
await source.start();
// Step 6: Poll metrics
setInterval(() => {
const metrics = processor.getMetrics();
console.log(`BPM: ${metrics.bpm?.toFixed(1)} (quality: ${metrics.quality?.toFixed(2)})`);
}, 1000);