2D 试衣间原型先拆边界:本地手势换装与 LLM 语义指令分别验证
“挥手换一件衣服”和“衣服贴合人体”不是同一个问题。前者可以是有限手势触发资源切换,后者需要人体定位、尺寸与遮挡处理。把两者混成一个 AI 试衣 Demo,容易让截图替代了能力说明。
这次只做可解释的 2D 原型
MediaPipe Hand Landmarker 返回手部关键点,不会顺带给出肩线和衣服版型。原型先采用人工提供的肩部锚点,手势识别只发出 next 或 previous。这个范围适合验证交互,不证明虚拟试穿的真实贴合效果。
10 月 22 日公开的 Decisions API 把模型决策限制到调用方定义的类型与动作。可以借用这种边界思想处理“换成蓝色外套”,但本例不调用任何在线模型;我们只验证一个本地命令解析器。模型能读懂一句话,并不代表它能安全提供任意图片 URL 或脚本。
资源 ID 先通过白名单
衣服来自应用内已许可资源表,命令只接受 next、previous、select。坐标来自显式 fixture,先在视频原始归一化坐标中计算,再按 contain 的缩放和留白换算到画布。镜像只应用一次,避免镜像视频叠加未镜像坐标导致左右反转。
const clothes=Object.freeze(['blue-coat','white-shirt','green-vest']); function command(raw,current=0){ if(!Number.isInteger(current)||current<0||current>=clothes.length)throw Error('index'); let x;try{x=typeof raw==='string'?JSON.parse(raw):raw;}catch{return {ok:false,reason:'json'};} if(!x||typeof x!=='object'||Array.isArray(x))return {ok:false,reason:'object'}; const keys=Object.keys(x); if(x.action==='select' && keys.length===2 && keys.includes('id')){ const i=clothes.indexOf(x.id);return i<0?{ok:false,reason:'id'}:{ok:true,index:i}; } if(keys.length===1 && ['next','previous'].includes(x.action)){ return {ok:true,index:(current+(x.action==='next'?1:-1)+clothes.length)%clothes.length}; } return {ok:false,reason:'action'}; } function anchorToCanvas({x,y},video,canvas,mirror=false){ if(![x,y].every(Number.isFinite)||x<0||x>1||y<0||y>1)throw Error('anchor'); if(![...video,...canvas].every(v=>Number.isFinite(v)&&v>0))throw Error('dimensions'); const s=Math.min(canvas[0]/video[0],canvas[1]/video[1]); const w=video[0]*s,h=video[1]*s; return {x:(canvas[0]-w)/2+(mirror?1-x:x)*w,y:(canvas[1]-h)/2+y*h}; } const shoulderFixture={x:0.25,y:0.3}; // 人工输入,绝非手部模型输出衣服不跟踪时,按钮仍然能用
图中左右两条路径分别代表手势事件和语义命令,肩部锚点是人工输入。它不是人体模型的检测结果,更不是试穿实拍。
手势事件需要抬起、触发、冷却和重新武装的状态,不能每帧检测到同一姿势就换装。摄像头失去目标时停止自动切换,保留上一件衣服和键盘可操作的按钮;不要推断“没看到手”等于用户确认购买。
服装的缩放和遮挡尚未解决。真实试衣至少要回答:肩部锚点由什么模型得到?画面旋转后坐标是否正确?手臂经过衣服前方时怎样分层?不同体型与宽松衣物怎样处理?这几项没有验证,就应把页面称为 2D 换装原型。
本轮没有开启摄像头、运行视觉模型或请求 LLM,只验证非法命令、白名单、环绕选择和 contain/镜像坐标。也没有声称本地模型绝不联网:模型文件获取、遥测和资源加载仍要分别审计。
复现记录
本轮在 Node.js v26.3.0 中运行随文核心逻辑的构造样例,进程退出码为 0。测试输出:
PASS: command allowlist, unknown resources, extra fields, contain offset, mirror, invalid anchor将上方完整代码保存为 example.mjs,以 Node.js 26 执行 node example.mjs 可加载核心与教学输入;函数默认不访问网络、模型或硬件。浏览器适配入口需要明确传入对应对象,本轮未执行这些入口。上面的通过项来自独立构造样例,不能替代集成测试。
资料与时效
- Hand landmarks detection guide for Web:首次发布日期未核实;更新 2026-08-17。
- Build more responsive apps with the Decisions API:2026-10-22。
- Introducing Claude Fable 5.1 and Claude Mythos 5.1:2026-09。
本稿对应原预排时段;实际发布前须人工复核来源更正、SDK/API 版本及可用性,不据此预言 10 月 24–31 日的新事件。