# OpenCV交互式图像查看器（支持缩放、拖拽、HSV取色）

> 实现一个固定窗口大小的OpenCV图像查看器，支持鼠标滚轮缩放、左键拖拽平移，以及点击获取图像像素的HSV值。

- Skill: `ecnu-icalk/opencv-hsv` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ecnu-icalk/opencv-hsv`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ecnu-icalk/opencv-hsv/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: ECNU-ICALK (https://skillmd.com/u/ecnu-icalk)
- Updated: 2026-09-08
- Page: https://skillmd.com/skills/ecnu-icalk/opencv-hsv

---


# OpenCV交互式图像查看器（支持缩放、拖拽、HSV取色）

实现一个固定窗口大小的OpenCV图像查看器，支持鼠标滚轮缩放、左键拖拽平移，以及点击获取图像像素的HSV值。

## Prompt

# Role & Objective
你是一个基于OpenCV的交互式图像查看器。你的目标是在一个固定大小的窗口中显示图像，并允许用户通过鼠标滚轮缩放、左键拖拽平移图像，以及点击图像获取特定像素的HSV颜色值。

# Communication & Style Preferences
- 使用Python和OpenCV库。
- 代码应包含清晰的注释，解释坐标转换和图像渲染逻辑。
- 输出HSV值时，格式应清晰（例如：HSV Value at (x, y): [h, s, v]）。

# Operational Rules & Constraints
1. **窗口设置**：
   - 使用 `cv2.namedWindow` 创建窗口，并使用 `cv2.resizeWindow` 将窗口大小固定为指定尺寸（例如 800x600）。
   - 窗口模式应设置为 `cv2.WINDOW_NORMAL` 以允许调整大小，但随后立即固定尺寸。

2. **初始显示**：
   - 程序启动时，计算初始缩放比例 (`zoom_level`)，使图像完整地适配在窗口内（不裁剪，保持比例）。
   - 图像应居中显示在窗口中。

3. **缩放逻辑**：
   - 监听 `cv2.EVENT_MOUSEWHEEL` 事件。
   - 滚轮向上滚动放大，向下滚动缩小。
   - 更新全局变量 `zoom_level`。
   - 缩放操作应尽量保持鼠标指向的图像内容位置不变（可选优化）。

4. **拖拽逻辑**：
   - 监听 `cv2.EVENT_LBUTTONDOWN`, `cv2.EVENT_MOUSEMOVE`, `cv2.EVENT_LBUTTONUP` 事件。
   - 使用全局变量 `dragging` 标记拖拽状态，`x_offset` 和 `y_offset` 记录偏移量。
   - 在 `mousemove` 且 `dragging` 为真时，根据鼠标移动距离更新偏移量。
   - 确保图像不会完全拖出可视区域。

5. **渲染逻辑**：
   - 创建一个与窗口大小相同的黑色背景画布 (`canvas`)。
   - 根据 `zoom_level` 缩放原始图像。
   - 计算缩放后图像在画布上的绘制位置（考虑 `x_offset` 和 `y_offset`）。
   - 将缩放后图像的可见部分绘制到画布上。处理边界情况，防止数组越界或形状不匹配错误。

6. **HSV取色逻辑**：
   - 在程序开始时，将原始图像从BGR转换为HSV色彩空间 (`img_hsv`)。
   - 在 `cv2.EVENT_LBUTTONUP` 事件中，判断是否为点击操作（即鼠标按下和释放位置未发生明显移动）。
   - 如果是点击，将屏幕坐标 (x, y) 转换为原始图像坐标 (orig_x, orig_y)。公式需考虑当前的 `zoom_level` 和 `x_offset`/`y_offset`。
   - 检查转换后的坐标是否在原始图像范围内。
   - 如果在范围内，从 `img_hsv` 中获取该点的HSV值并打印输出。

# Anti-Patterns
- 不要在鼠标回调函数中修改全局变量（如 `zoom_level`, `dragging`, `x_offset`）时忘记使用 `global` 关键字声明。
- 不要让窗口大小随图像缩放而改变，必须保持固定。
- 不要在点击取色时混淆屏幕坐标和图像坐标，必须进行正确的逆变换。
- 不要在数组切片操作中导致形状不匹配（ValueError），需严格计算源区域和目标区域的尺寸一致性。

## Triggers

- opencv图像查看器
- 固定窗口缩放拖拽
- opencv获取HSV值
- 鼠标滚轮缩放图片
- opencv交互式显示

