You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中Mediapipe Selfie Segmentation的onResults函数用法及触发问题

代码含义与底层逻辑

首先纠正你对这行代码的理解偏差:selfieSegmentation.onResults(onResults_sefli_segmentation) 是回调注册逻辑,不是onResults返回结果再传入处理函数。

你可以把onResults理解成Mediapipe提供的「结果通知订阅入口」:你把自己写的处理函数传进去,相当于告诉Mediapipe:「每次你跑完一帧图像的分割计算,就自动调用我给你的这个函数,把计算结果当参数传给它就行」。

这种设计的核心原因是Mediapipe的模型推理是异步操作:你调用selfieSegmentation.send()传入视频帧后,模型需要一定时间完成计算,无法立刻返回结果。用回调的方式可以避免主线程阻塞,等结果就绪后主动触发你的处理逻辑,无需你主动轮询查询结果。

完整的运行流程如下:

  1. 调用camera.start()启动摄像头,摄像头每采集到新的一帧画面,就会触发你定义的onFrame回调
  2. onFrame里调用selfieSegmentation.send()把当前视频帧传给分割模型
  3. 模型在后台完成分割推理,生成包含分割掩码、原始帧的results对象
  4. 模型自动调用你之前注册的onResults_sefli_segmentation函数,把results作为参数传入,执行你写的画布绘制逻辑
回调不触发的常见原因与解决方案

你可以按照以下顺序排查问题:

  • 检查摄像头权限是否正常获取:浏览器仅允许HTTPS域名和localhost调用摄像头,如果你的页面部署在HTTP域名下,或者用户拒绝了摄像头权限申请,摄像头无法采集画面,自然不会有后续的推理和回调触发。解决方案:确保线上部署用HTTPS协议,本地调试用localhost地址,权限申请弹窗选择允许。
  • 检查模型初始化是否正常:打开浏览器控制台,查看是否有模型文件加载失败的报错。如果你的项目有跨域限制或者代理拦截,会导致无法从CDN加载Mediapipe的模型文件,模型初始化失败就无法正常运行。可以在Network面板过滤.tflite后缀的请求,确认所有模型文件都返回200状态码。
  • 检查帧发送逻辑是否正常执行:在onFrame回调里加console.log打点,确认摄像头每一帧都能正常触发回调,selfieSegmentation.send()没有抛出错误。如果videoElement获取失败或者没有正常加载画面,会导致send方法执行异常,中断流程。
  • 检查DOM加载时序:如果你的JS代码放在head标签里执行,运行时DOM还没渲染完成,getElementsByClassName获取到的video、canvas元素是undefined,后续执行报错会打断整个流程。解决方案:把JS代码放到body标签末尾,或者用DOMContentLoaded事件包裹所有JS逻辑,确保DOM加载完成后再执行代码。
  • 检查函数名拼写一致性:你当前代码里注册的回调函数名和定义的函数名一致,所以没有问题,但如果集成到其他项目时拼写不一致(比如你这里sefli是少写了一个l的拼写,要确保两边拼写完全匹配),会导致回调无法被触发。

内容的提问来源于stack exchange,提问作者Swapnil Gautam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:36:02