Visitar URL original
Face Detect Camera | Playground

Face Detect Camera

OpenCV.js (Haar Cascade) を使ったリアルタイム顔検出。処理はすべてブラウザ内で完結します。

開始を押すと、カメラ権限を要求し顔検出を開始します。

How it works

Face Detect Camera は、Web カメラの映像に対して OpenCV.js の Haar Cascade 分類器を使い、ブラウザ内だけでリアルタイム顔検出を行うデモです。検出結果に応じてカメラが自動的にズーム・パンし、顔を追跡します。

OpenCV.js と Web Worker

OpenCV.js(約 10.8 MB)は重量級のライブラリです。メインスレッドをブロックしないよう、顔検出の処理はすべて Web Worker 上で実行しています。

// メインスレッド → Worker へフレームを転送
worker.postMessage(
  { type: "frame", buffer: imageData.data.buffer, width, height },
  [imageData.data.buffer], // Transferable でゼロコピー転送
);

Worker 内では Haar Cascade 分類器 (haarcascade_frontalface_default.xml) を使って顔の矩形座標 {x, y, w, h} を返します。

スムーズズーム

検出された顔の矩形を元にビューポートを計算し、線形補間(LERP) で現在のビューポートからターゲットへなめらかに遷移します。

function lerp(a: number, b: number, t: number) {
  return a + (b - a) * t;
}
 
// 毎フレーム、現在のビューポートをターゲットに近づける
viewport.x = lerp(viewport.x, target.x, LERP_SPEED);
viewport.y = lerp(viewport.y, target.y, LERP_SPEED);

LERP_SPEED = 0.06 なので、1 フレームあたりターゲットとの差分の 6% だけ移動します。映画のようなゆっくりとしたズームイン演出になります。

ZOOM_PADDING = 2.0 で顔がビューポートの約 50% を占めるようにズーム倍率を調整し、MIN_VIEWPORT = 0.05(最大 20 倍ズーム)で上限を設けています。

顔が消えたときの処理

顔が 60 フレーム(約 1 秒)検出されない場合、ビューポートをゆっくり全体表示に戻します。急に引きになるのではなく、同じ LERP で自然にズームアウトする挙動です。

座標変換

検出は低解像度の OffscreenCanvas 上で行われるため、検出結果の矩形座標を表示用 Canvas の座標系に変換する必要があります。ビューポートの位置・サイズを考慮した変換を行い、緑色のバウンディングボックスを正確な位置に描画しています。

プライバシー

カメラ映像はすべてブラウザ内で処理され、サーバーへのアップロードは一切行いません。ページを離れるとカメラストリームは即座に停止されます。