可通过Canvas getImageData、WebRTC视频流与FaceMesh/MediaPipe实现实时人脸遮罩与特效,核心是每帧读取像素、定位关键点、Canvas绘制遮罩或贴图;需用getUserMedia获取流并绑定video,设固定尺寸防失真,requestAnimationFrame捕获帧,FaceMesh返回468点后映射至Canvas坐标,用fillRect马赛克或drawImage叠加猫耳等特效,配合clip裁剪轮廓、降分辨率/跳帧/复用缓冲区等优化保障30fps以上性能。

可以通过 Canvas 的 getImageData + WebRTC 视频流 + 人脸检测模型(如 TensorFlow.js 的 FaceMesh 或 MediaPipe)实现实时人脸遮罩与特效,核心在于每帧读取视频像素、定位关键点、在 Canvas 上绘制遮罩或图像叠加。
获取并渲染实时视频流
使用 getUserMedia 获取摄像头流,绑定到 <video> 元素,并设置 autoplay 和 playsinline(iOS 必需):
- 将
video尺寸设为固定宽高(如 640×480),避免 Canvas 缩放失真 - 用
requestAnimationFrame持续捕获帧,避免用setInterval导致丢帧 - 确保
video已播放(oncanplay或检查readyState >= 4)再开始处理
用 FaceMesh 定位人脸关键点
引入 TensorFlow.js 和 FaceMesh 模型,在每帧中运行推理:
- 加载模型后调用
model.estimateFaces(video),返回包含 468 个 3D 关键点的数组 - 只处理首个人脸(
faces[0]),降低计算压力;可加置信度阈值(如faces[0].detectionConfidence > 0.7)过滤误检 - 关键点坐标默认归一化(0–1),需映射到 Canvas 像素坐标:
x * canvas.width,y * canvas.height
像素级遮罩与特效绘制
不直接操作原始像素数组(性能差),而是用 Canvas 2D API 高效合成:
立即学习“前端免费学习笔记(深入)”;
-
遮罩(如马赛克):用
ctx.getImageData截取人脸区域,对每个 8×8 块取平均色,再用ctx.fillStyle + fillRect绘制 -
贴图特效(如猫耳):预加载 PNG 图像,根据关键点(如左/右耳根、头顶)计算旋转与缩放,用
ctx.drawImage合成 -
边缘模糊遮罩:用
ctx.clip()裁剪出人脸轮廓路径(用关键点连成多边形),再绘制半透明层
性能优化关键点
实时性依赖帧率稳定在 30fps 以上:
- 降低输入分辨率:FaceMesh 支持
maxWidth: 480等参数,减小推理耗时 - 跳帧处理:非每帧都跑模型,例如每 2–3 帧检测一次,其余帧用插值更新关键点
- 复用 Canvas 缓冲区:创建固定尺寸的离屏 Canvas(
OffscreenCanvas在支持环境下更优),避免反复创建ImageData - 关闭抗锯齿:
ctx.imageSmoothingEnabled = false,提升drawImage速度
整个流程本质是“视频采集 → 人脸定位 → 坐标映射 → Canvas 合成”,无需手动遍历像素数组即可实现丰富特效。重点在于模型轻量化、Canvas 渲染策略和帧调度控制。



















