# ROI（关注区域）交互工作流

**导航：** 返回 [SKILL.md](./SKILL.md) | 类型定义 [types-guide.md](./types-guide.md)

> 当用户需要为对象检测定义 ROI（关注区域）时，遵循此交互工作流。

## 工作流步骤

### 第 1 步：生成网格参考

```bash
node scripts/show-grid.mjs <image> <output-grid.png>
```

向用户显示网格图像并解释行和列标签。

### 第 2 步：询问 ROI 目的

"你想在这个区域检测什么？例如：
- 进入收银区域的人员
- 停车场中的车辆
- 货架上的产品"

### 第 3 步：用户指定顶点

用户根据网格标签指定角。

**矩形 ROI 示例：**
- 用户："从 B2 到 G5"
- 转换为 4 个顶点：[B2、G2、G5、B5]

### 第 4 步：验证顶点顺序

"这些点是否围绕周边形成闭合多边形？（顺时针或逆时针）"

### 第 5 步：预览 ROI

```bash
node scripts/visualize.mjs <image> '[]' preview.png \
  --overlays '[{"kind":"ROI","name":"test","points":[x1,y1,x2,y2,x3,y3,x4,y4]}]'
```

### 第 6 步：用户确认

"ROI 位置是否正确？"

### 第 7 步：调用技能

```bash
echo '{"input0":{"image":"photo.jpg","roi":{"id":"1","name":"zone","kind":"ROI","points":[...]}}}' | \
  node scripts/invoke.mjs ep-xxxx-yyyy
```

> **重要：** 自定义 ROI 必须通过 `invoke.mjs` 传入。不要使用 `intent-invoke.mjs`，因为它会自动添加全图 ROI 覆盖掉你的自定义区域。

---

## 常见错误

❌ 不要假设矩形 ROI
✅ 支持任意多边形

❌ 不要允许无序的顶点
✅ 顶点必须按顺序排列

❌ 不要跳过预览验证
✅ 始终显示预览图像以确认

---

## 完整对话示例

### 示例 1：矩形入口区域

**用户**："我想检测进入办公室的人员"

**你**：
1. 生成网格：
```bash
node scripts/show-grid.mjs office.jpg office-grid.png
```
2. 问："查看网格，入口大概在哪里？"
3. 用户："大约从 B1 到 G3"
4. 确认："所以顶点是 B1、G1、G3、B3，对吧？"
5. 用户："是的"
6. 预览 ROI
7. 问："这个矩形是否覆盖了入口？"
8. 用户："完美！"
9. 调用技能进行检测

### 示例 2：复杂多边形（L 形区域）

**用户**："我需要监视 L 形存储区域"

**你**：
1. 生成网格
2. 问："使用网格坐标标记 L 形的所有角，从一个角开始"
3. 用户："从左上角开始：A2、E2、E4、D4、D6、A6"
4. 确认："这些点是否按顺序形成 L 形的边界？确认它关闭回 A2"
5. 用户："是的"
6. 预览 L 形多边形
7. 验证没有自交
8. 调用技能

---

## 数据结构

详见 [types-guide.md](./types-guide.md) 了解完整的定义、子对象和示例。
