# 视觉理解 ## 概述 从摄像头视频流到 AI 语义理解的技术链路:**帧采样** → **图像编码** → **多模态 LLM** → **语义结果**。 摄像头每秒 30 帧,全部送入 LLM 不现实也不经济,帧采样是第一个需要解决的问题。 ## 帧采样策略 | 策略 | 原理 | 适用场景 | |------|------|---------| | 固定间隔采样 | 每 N 秒取一帧 | 画面变化缓慢 | | 关键帧检测 | 对比相邻帧差异,变化超阈值时触发 | 画面动态变化较多 | | 事件驱动采样 | 用户主动触发(如拍照按钮) | 精确提问场景 | | **混合策略** | 低频定时 + 高频事件触发 | **通用推荐方案** | 关键帧检测核心逻辑(TypeScript 实现,`EdgeProcessor/index.tsx`): ```typescript // 降低分辨率到 160x120 做检测,兼顾速度与精度 const DETECT_WIDTH = 160; const DETECT_HEIGHT = 120; function calcSimilarity(prev: ImageData, curr: ImageData): number { const pixelCount = prev.width * prev.height; let diffSum = 0; // 只比较 RGB 三通道,跳过 Alpha for (let i = 0; i < prev.data.length; i += 4) { diffSum += Math.abs(prev.data[i] - curr.data[i]) + Math.abs(prev.data[i+1] - curr.data[i+1]) + Math.abs(prev.data[i+2] - curr.data[i+2]); } const avgDiff = diffSum / (pixelCount * 3); return 1 - avgDiff / 255; // 相似度:1 = 完全相同,0 = 完全不同 } ``` 阈值说明: - 对话模式:`similarity > 0.9` 时跳过(视为重复帧) - 观察模式:`similarity < 0.85` 时触发变化回调 ## 图像编码与多模态输入 主流多模态 LLM(GPT-4o、Claude)接受图片的两种方式: | 方式 | 适用场景 | |------|---------| | Base64 内联 | 本地/实时场景 | | URL 引用 | 已有图床的场景 | OpenAI 兼容接口调用示例: ```typescript const response = await openai.chat.completions.create({ model: "gpt-4o", messages: [ { role: "user", content: [ { type: "text", text: "请描述画面中的内容" }, { type: "image_url", image_url: { url: `data:image/jpeg;base64,${base64Image}`, detail: "low" // "low" | "high" | "auto" } } ] } ] }); ``` **detail 参数影响**: - `low`:65x65 缩略图,约 85 tokens,适合快速识别 - `high`:按 512px 方块切分,细节丰富但 token 数激增 - 实时对话场景建议默认 `low`,仅在用户追问细节时切换 `high` ## 视觉理解的局限性 - **运动模糊**:快速移动物体在低帧率下容易模糊 - **光线变化**:逆光、暗光环境下识别率显著下降 - **细小文字**:低分辨率下 OCR 能力受限 - **空间推理**:精确的距离、尺寸判断仍是短板