Files
CamTalk/docs/07-视觉理解.md
hhs 6e0c67e1cb docs: 文档与代码一致性检查与修复
- 修复心跳 Bug:应用层 ping 不更新 lastPong,60 秒后连接会被错误断开
- 03-接口文档:audio/mpeg→audio/mp3、STTConfig/TTSConfig 补充 Model 字段、
  APP_ENV 环境变量名修正、配置搜索路径补充、.env 加载说明、Vite proxy 说明修正
- 02-系统架构:补充 ConfigPanel/Toast 组件、Model Router/Rate Limiter 标注规划中、
  补充 Gin 框架、MVP 存储改为 Memory、AI 服务 provider 更新、Orchestrator 伪代码对齐
- 04-技术选型:新增 AI 服务栈选型章节(STT/LLM/TTS)、PostgreSQL 标注规划中
- 06-语音交互:VAD 参数名修正、STT 改为一次性识别描述、音频编码格式补充
- 07-视觉理解:关键帧检测代码改为 TypeScript、分辨率修正、阈值逻辑统一
- 08-成本控制:变量名修正、未实现功能标注规划中、对话历史裁剪策略补充
- CLAUDE.md:同步更新技术栈、模块结构、存储策略描述
2026-06-14 08:52:36 +08:00

2.7 KiB
Raw Blame History

视觉理解

概述

从摄像头视频流到 AI 语义理解的技术链路:帧采样图像编码多模态 LLM语义结果

摄像头每秒 30 帧,全部送入 LLM 不现实也不经济,帧采样是第一个需要解决的问题。

帧采样策略

策略 原理 适用场景
固定间隔采样 每 N 秒取一帧 画面变化缓慢
关键帧检测 对比相邻帧差异,变化超阈值时触发 画面动态变化较多
事件驱动采样 用户主动触发(如拍照按钮) 精确提问场景
混合策略 低频定时 + 高频事件触发 通用推荐方案

关键帧检测核心逻辑TypeScript 实现,EdgeProcessor/index.tsx

// 降低分辨率到 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 时触发变化回调

图像编码与多模态输入

主流多模态 LLMGPT-4o、Claude接受图片的两种方式

方式 适用场景
Base64 内联 本地/实时场景
URL 引用 已有图床的场景

OpenAI 兼容接口调用示例:

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 参数影响

  • low65x65 缩略图,约 85 tokens适合快速识别
  • high:按 512px 方块切分,细节丰富但 token 数激增
  • 实时对话场景建议默认 low,仅在用户追问细节时切换 high

视觉理解的局限性

  • 运动模糊:快速移动物体在低帧率下容易模糊
  • 光线变化:逆光、暗光环境下识别率显著下降
  • 细小文字:低分辨率下 OCR 能力受限
  • 空间推理:精确的距离、尺寸判断仍是短板