Files
CamTalk/docs/07-视觉理解.md
hhs 10f676f3b4 docs: 扁平化目录结构,优化文档为 Coding Agent 可读格式
- 移除 Obsidian 特有语法(callout、wikilinks、YAML frontmatter)
- 目录结构从 3 层嵌套扁平化为编号文件(01~09)
- 新增 docs/README.md 文档索引与推荐阅读顺序
- 精简冗余解释,保留所有代码块和实现参考
- CLAUDE.md 全面中文化
2026-06-12 17:08:20 +08:00

74 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 视觉理解
## 概述
从摄像头视频流到 AI 语义理解的技术链路:**帧采样** → **图像编码****多模态 LLM****语义结果**
摄像头每秒 30 帧,全部送入 LLM 不现实也不经济,帧采样是第一个需要解决的问题。
## 帧采样策略
| 策略 | 原理 | 适用场景 |
|------|------|---------|
| 固定间隔采样 | 每 N 秒取一帧 | 画面变化缓慢 |
| 关键帧检测 | 对比相邻帧差异,变化超阈值时触发 | 画面动态变化较多 |
| 事件驱动采样 | 用户主动触发(如拍照按钮) | 精确提问场景 |
| **混合策略** | 低频定时 + 高频事件触发 | **通用推荐方案** |
关键帧检测核心逻辑:
```python
import numpy as np
def is_keyframe(prev_frame, curr_frame, threshold=30):
"""通过帧间像素差异判断是否为关键帧"""
diff = np.mean(np.abs(prev_frame.astype(int) - curr_frame.astype(int)))
return diff > threshold
```
> 实际开发中,先降低分辨率(如 320x240做关键帧检测再对命中帧保留原始分辨率送入 LLM兼顾速度与精度。
## 图像编码与多模态输入
主流多模态 LLMGPT-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 能力受限
- **空间推理**:精确的距离、尺寸判断仍是短板