facedetector 是 chromium 实验性 api,非标准 html 功能,需检测存在性、确保安全上下文、正确加载图像并处理坐标缩放,兼容性差,推荐 fallback 至 face-api.js 或服务端方案。

HTML 本身没有 FaceDetector 或 detect 方法——这是 Web API 中的 FaceDetector 接口,仅在部分 Chromium 内核浏览器(如 Chrome 117+、Edge 117+)中可用,且需显式启用实验性功能或满足安全上下文要求。直接在 HTML 文件里写 new FaceDetector() 会报 ReferenceError: FaceDetector is not defined,除非你确认运行环境支持并已正确调用。
FaceDetector API 是否可用必须先检测
不能假设 FaceDetector 存在。它不是标准 DOM API,而是实验性图像分析能力,目前仅在安全上下文(HTTPS 或 localhost)下可用,且部分浏览器默认禁用:
- 检查是否存在:
if (typeof FaceDetector !== 'undefined'),否则降级到face-api.js或后端 API - 即使存在,也需捕获构造失败:
try { detector = new FaceDetector({ supportedFormats: ['yuv420'] }); } catch (e) { console.warn('FaceDetector init failed:', e); } - Chrome 中需手动开启
chrome://flags/#enable-experimental-web-platform-features才能启用(生产环境不可依赖)
detect() 要求输入是 ImageBitmap 或 HTMLImageElement
FaceDetector.detect() 不接受 base64 字符串、File 对象或 Blob,必须先转为可绘制图像源:
- 从
<input type="file">读取图片时,用createImageBitmap(file)而非URL.createObjectURL()(后者返回的是 URL,不是图像数据) - 若用
<img>元素,确保img.complete === true且img.naturalWidth > 0,否则detect()返回空数组 - 不支持跨域图片(如 CDN 上的图片),会触发
SecurityError;需服务端加CORS头或提前 fetch +createImageBitmap(response.body)
detect() 返回的 faceRect 坐标是相对图像原始尺寸的
结果中的 boundingBox(即 {x, y, width, height})基于图像原始像素尺寸,不是 canvas 渲染尺寸。若你在 <canvas></canvas> 中缩放显示图片,直接用这些坐标画框会错位:
- 例如图片是 1200×800,但 canvas 显示为 600×400(CSS 缩放),则需按比例换算:
scale = canvas.width / img.naturalWidth - 关键点(
landmarks)同样需同比例缩放,且注意landmarks是数组,每个点含{x, y}属性 - 某些浏览器(如 Chrome 122)返回的
boundingBox可能包含负值或超出图像边界,需做截断:x = Math.max(0, Math.min(x, img.naturalWidth - width))
替代方案比 FaceDetector 更可靠
截至 2026 年 5 月,FaceDetector 仍属不稳定实验接口:Safari 完全不支持,Firefox 无计划支持,Android WebView 大多缺失。实际项目中更推荐:
- 前端轻量方案:
face-api.js+tf.js,模型可本地加载,兼容性好,支持关键点和姿态估计 - 服务端方案:调用 Azure Face API 的
/detect端点,指定detectionModel=detection_03提升小脸/侧脸精度,返回标准faceRectangle结构 - 混合方案:用
FaceDetector尝试,失败后自动 fallback 到 wasm 加速的@tensorflow-models/blazeface
真正容易被忽略的点是:你写的 detect() 调用本身没问题,但整个链路卡在图像加载时机、跨域策略或浏览器支持判断上——别急着 debug 检测逻辑,先确认 FaceDetector 构造成功、输入图像就绪、坐标没被 CSS 渲染干扰。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











