Skip to content

Commit

Permalink
fixup! Face detection
Browse files Browse the repository at this point in the history
Incorporate mediacapture-transform changes.
  • Loading branch information
eehakkin committed Feb 5, 2022
1 parent 6cee839 commit c6b1685
Showing 1 changed file with 18 additions and 20 deletions.
38 changes: 18 additions & 20 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -808,41 +808,39 @@ <h3>Examples</h3>

// Open camera with face detection enabled
const stream = await navigator.mediaDevices.getUserMedia({
video: { faceDetectionMode: 'contour',
faceDetectionNumContourPoints: { exact: 4 } }
video: {
faceDetectionMode: 'contour',
faceDetectionNumContourPoints: {exact: 4}
}
});
const [videoTrack] = stream.getVideoTracks();

// Use a video worker and show to user.
const videoElement = document.querySelector("video");
const videoGenerator = new MediaStreamTrackGenerator({kind: 'video'});
const videoProcessor = new MediaStreamTrackProcessor({track: videoTrack});
const videoSettings = videoTrack.getSettings();
const videoElement = document.querySelector('video');
const videoWorker = new Worker('video-worker.js');
videoWorker.postMessage({
videoReadable: videoProcessor.readable,
videoWritable: videoGenerator.writable
}, [videoProcessor.readable, videoGenerator.writable]);
videoElement.srcObject = new MediaStream([videoGenerator]);
videoWorker.postMessage({track: videoTrack}, [videoTrack]);
const {data} = await new Promise(r => videoWorker.onmessage);
videoElement.srcObject = new MediaStream([data.videoTrack]);

// video-worker.js:
self.onmessage = async function(e) {
const videoTransformer = new TransformStream({
async transform(videoFrame, controller) {
for (const face of videoFrame.detectedFaces) {
self.onmessage = async ({data: {track}}) => {
const generator = new VideoTrackGenerator();
parent.postMessage({videoTrack: generator.track}, [generator.track]);
const {readable} = new MediaStreamTrackProcessor({track});
const transformer = new TransformStream({
async transform(frame, controller) {
for (const face of frame.detectedFaces) {
console.log(
`Face @ (${face.contour[0].x}, ${face.contour[0].y}), ` +
`(${face.contour[1].x}, ${face.contour[1].y}), ` +
`(${face.contour[2].x}, ${face.contour[2].y}), ` +
`(${face.contour[3].x}, ${face.contour[3].y})`);
controller.enqueue(videoFrame);
controller.enqueue(frame);
}
}
});
e.data.videoReadable
.pipeThrough(videoTransformer)
.pipeTo(e.data.videoWritable);
}
await readable.pipeThrough(transformer).pipeTo(generator.writable);
};
</pre>
</section>
</section>
Expand Down

0 comments on commit c6b1685

Please sign in to comment.