docs: insert 51 output images from asset/ into README.md and 教案.md with captions
This commit is contained in:
92
README.md
92
README.md
@@ -398,6 +398,12 @@ explorer.exe .
|
|||||||
|
|
||||||
> **提示**:把 `\\wsl$\Ubuntu\home\你的用户名\vision-training-2026-opencvcpp` 收藏到快速访问栏,后面每个实验都能快速查看输出图片。
|
> **提示**:把 `\\wsl$\Ubuntu\home\你的用户名\vision-training-2026-opencvcpp` 收藏到快速访问栏,后面每个实验都能快速查看输出图片。
|
||||||
|
|
||||||
|
**运行结果预览**:
|
||||||
|
|
||||||
|
| 程序生成的测试图 | 读取后再保存的验证图 |
|
||||||
|
|---|---|
|
||||||
|
|  |  |
|
||||||
|
|
||||||
### 6.6 试试用自己的图片
|
### 6.6 试试用自己的图片
|
||||||
|
|
||||||
把任何一张 `.jpg` 图片复制到 `exp1_read_write/build/` 目录下,然后修改 `main.cpp` 中的文件名,重新编译运行,看看能不能读写你自己的图片。
|
把任何一张 `.jpg` 图片复制到 `exp1_read_write/build/` 目录下,然后修改 `main.cpp` 中的文件名,重新编译运行,看看能不能读写你自己的图片。
|
||||||
@@ -484,6 +490,20 @@ cmake .. && make -j$(nproc)
|
|||||||
|
|
||||||
重点看 `hsv_channel_H.jpg`、`hsv_channel_S.jpg`、`hsv_channel_V.jpg` 三张图,理解 HSV 每个通道"长什么样"。
|
重点看 `hsv_channel_H.jpg`、`hsv_channel_S.jpg`、`hsv_channel_V.jpg` 三张图,理解 HSV 每个通道"长什么样"。
|
||||||
|
|
||||||
|
**运行结果预览**:
|
||||||
|
|
||||||
|
| 原始彩色图 | 灰度转换 | HSV转换 |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
|
| H通道(色相) | S通道(饱和度) | V通道(明度) |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
|
| Lab转换 | YCrCb转换 |
|
||||||
|
|---|---|
|
||||||
|
|  |  |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 8. 第 3 讲:高斯模糊
|
## 8. 第 3 讲:高斯模糊
|
||||||
@@ -557,6 +577,16 @@ cmake .. && make -j$(nproc)
|
|||||||
|
|
||||||
查看 `original.jpg` → `blur_3x3.jpg` → `blur_9x9.jpg` → `blur_21x21.jpg`,对比噪点的消失过程。
|
查看 `original.jpg` → `blur_3x3.jpg` → `blur_9x9.jpg` → `blur_21x21.jpg`,对比噪点的消失过程。
|
||||||
|
|
||||||
|
**运行结果预览**:
|
||||||
|
|
||||||
|
| 原始图片(含散点噪声) | 轻微模糊 (ksize=3×3) | 中度模糊 (ksize=9×9) |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
|
| 重度模糊 (ksize=21×21) | 各向异性模糊 (sigmaX=15, sigmaY=3) |
|
||||||
|
|---|---|
|
||||||
|
|  |  |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 9. 第 4 讲:Canny 边缘检测
|
## 9. 第 4 讲:Canny 边缘检测
|
||||||
@@ -636,6 +666,20 @@ cmake .. && make -j$(nproc)
|
|||||||
|
|
||||||
对比 `edges_low.jpg`、`edges_mid.jpg`、`edges_high.jpg`、`edges_after_blur.jpg`,理解阈值如何影响结果。
|
对比 `edges_low.jpg`、`edges_mid.jpg`、`edges_high.jpg`、`edges_after_blur.jpg`,理解阈值如何影响结果。
|
||||||
|
|
||||||
|
**运行结果预览**:
|
||||||
|
|
||||||
|
| 原始彩色图 | 灰度转换 |
|
||||||
|
|---|---|
|
||||||
|
|  |  |
|
||||||
|
|
||||||
|
| 低阈值 (50/150) | 中等阈值 (100/200) | 高阈值 (200/400) |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
|
| 高斯模糊后 | 先模糊再Canny |
|
||||||
|
|---|---|
|
||||||
|
|  |  |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 10. 第 5 讲:图像阈值化
|
## 10. 第 5 讲:图像阈值化
|
||||||
@@ -701,6 +745,16 @@ cmake .. && make -j$(nproc)
|
|||||||
./exp5
|
./exp5
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**运行结果预览**:
|
||||||
|
|
||||||
|
| 灰度渐变图 | THRESH_BINARY | THRESH_BINARY_INV |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
|
| THRESH_TRUNC | THRESH_TOZERO | THRESH_TOZERO_INV |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 11. 第 6 讲:形态学操作——腐蚀与膨胀
|
## 11. 第 6 讲:形态学操作——腐蚀与膨胀
|
||||||
@@ -783,6 +837,16 @@ cmake .. && make -j$(nproc)
|
|||||||
|
|
||||||
依次查看 `binary.jpg` → `eroded.jpg` → `dilated.jpg` → `opened.jpg` → `closed.jpg`。
|
依次查看 `binary.jpg` → `eroded.jpg` → `dilated.jpg` → `opened.jpg` → `closed.jpg`。
|
||||||
|
|
||||||
|
**运行结果预览**:
|
||||||
|
|
||||||
|
| 原始二值图 | 腐蚀后 | 膨胀后 |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
|
| 开运算 | 闭运算 | 3次腐蚀 |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 12. 第 7 讲:颜色提取——inRange(核心!)
|
## 12. 第 7 讲:颜色提取——inRange(核心!)
|
||||||
@@ -934,6 +998,20 @@ cmake .. && make -j$(nproc)
|
|||||||
|
|
||||||
**思考题**:为什么 `mask_red1.jpg` 和 `mask_red2.jpg` 分别只能捕获一部分红色?合并后才完整?你能在色相环上画出来吗?
|
**思考题**:为什么 `mask_red1.jpg` 和 `mask_red2.jpg` 分别只能捕获一部分红色?合并后才完整?你能在色相环上画出来吗?
|
||||||
|
|
||||||
|
**运行结果预览**:
|
||||||
|
|
||||||
|
| 原始彩色图 | HSV转换 |
|
||||||
|
|---|---|
|
||||||
|
|  |  |
|
||||||
|
|
||||||
|
| 红色范围1 (H 0~10) | 红色范围2 (H 160~180) | 合并后的红色mask |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
|
| 提取的红色区域 | 蓝色mask | 提取的蓝色区域 |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 13. 第 8 讲:综合流水线——串联一切
|
## 13. 第 8 讲:综合流水线——串联一切
|
||||||
@@ -1091,6 +1169,20 @@ cmake .. && make -j$(nproc)
|
|||||||
|
|
||||||
> **挑战题**:如果检测到的框数量不对(比如只有一个或零个),试着修改 `main.cpp` 中的筛选参数(面积阈值 100 和长宽比阈值 2),重新编译运行,看效果怎么变化。这就是"调参"——RoboMaster 视觉组的基本功。
|
> **挑战题**:如果检测到的框数量不对(比如只有一个或零个),试着修改 `main.cpp` 中的筛选参数(面积阈值 100 和长宽比阈值 2),重新编译运行,看效果怎么变化。这就是"调参"——RoboMaster 视觉组的基本功。
|
||||||
|
|
||||||
|
**运行结果预览**:
|
||||||
|
|
||||||
|
| 原始模拟场景 | HSV转换 | 高斯模糊后 |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
|
| inRange原始mask | 开运算去噪 | 闭运算填充 |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
|
| 提取的红色区域 | mask边缘检测 | 最终结果(绿框=检测到的灯条) |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 14. 课堂总结与下一步
|
## 14. 课堂总结与下一步
|
||||||
|
|||||||
92
教案.md
92
教案.md
@@ -370,6 +370,12 @@ cmake .. && make -j$(nproc)
|
|||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> 这条路径比较长,建议你把它收藏到资源管理器的快速访问栏,后面每个实验都要用。你只需要修改其中的实验文件夹名就能访问不同实验的输出。
|
> 这条路径比较长,建议你把它收藏到资源管理器的快速访问栏,后面每个实验都要用。你只需要修改其中的实验文件夹名就能访问不同实验的输出。
|
||||||
|
|
||||||
|
**运行结果预览**:
|
||||||
|
|
||||||
|
| 程序生成的测试图 | 读取后再保存的验证图 |
|
||||||
|
|---|---|
|
||||||
|
|  |  |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 4.2 实验 2:颜色空间转换
|
### 4.2 实验 2:颜色空间转换
|
||||||
@@ -444,6 +450,20 @@ cmake .. && make -j$(nproc)
|
|||||||
|
|
||||||
进入 `\\wsl$\Ubuntu\mnt\d\RM\25教学\视觉1\OpenCV-CPP\exp2_color_space\build`,你会看到 `original.jpg`、`gray.jpg`、`hsv.jpg`、`hsv_channel_H.jpg`、`hsv_channel_S.jpg`、`hsv_channel_V.jpg` 等图片。
|
进入 `\\wsl$\Ubuntu\mnt\d\RM\25教学\视觉1\OpenCV-CPP\exp2_color_space\build`,你会看到 `original.jpg`、`gray.jpg`、`hsv.jpg`、`hsv_channel_H.jpg`、`hsv_channel_S.jpg`、`hsv_channel_V.jpg` 等图片。
|
||||||
|
|
||||||
|
**运行结果预览**:
|
||||||
|
|
||||||
|
| 原始彩色图 | 灰度转换 | HSV转换 |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
|
| H通道(色相) | S通道(饱和度) | V通道(明度) |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
|
| Lab转换 | YCrCb转换 |
|
||||||
|
|---|---|
|
||||||
|
|  |  |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 4.3 实验 3:高斯模糊
|
### 4.3 实验 3:高斯模糊
|
||||||
@@ -503,6 +523,16 @@ cmake .. && make -j$(nproc)
|
|||||||
|
|
||||||
进入 `\\wsl$\Ubuntu\mnt\d\RM\25教学\视觉1\OpenCV-CPP\exp3_gaussian_blur\build`,对比 `original.jpg`、`blur_3x3.jpg`、`blur_9x9.jpg`、`blur_21x21.jpg` 四张图,观察散点噪声如何逐渐消失。
|
进入 `\\wsl$\Ubuntu\mnt\d\RM\25教学\视觉1\OpenCV-CPP\exp3_gaussian_blur\build`,对比 `original.jpg`、`blur_3x3.jpg`、`blur_9x9.jpg`、`blur_21x21.jpg` 四张图,观察散点噪声如何逐渐消失。
|
||||||
|
|
||||||
|
**运行结果预览**:
|
||||||
|
|
||||||
|
| 原始图片(含散点噪声) | 轻微模糊 (ksize=3×3) | 中度模糊 (ksize=9×9) |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
|
| 重度模糊 (ksize=21×21) | 各向异性模糊 (sigmaX=15, sigmaY=3) |
|
||||||
|
|---|---|
|
||||||
|
|  |  |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 4.4 实验 4:Canny 边缘检测
|
### 4.4 实验 4:Canny 边缘检测
|
||||||
@@ -568,6 +598,20 @@ cmake .. && make -j$(nproc)
|
|||||||
|
|
||||||
进入 `\\wsl$\Ubuntu\mnt\d\RM\25教学\视觉1\OpenCV-CPP\exp4_canny\build`,对比 `edges_low.jpg`、`edges_mid.jpg`、`edges_high.jpg`,以及 `edges_after_blur.jpg`,观察阈值和预处理对结果的影响。
|
进入 `\\wsl$\Ubuntu\mnt\d\RM\25教学\视觉1\OpenCV-CPP\exp4_canny\build`,对比 `edges_low.jpg`、`edges_mid.jpg`、`edges_high.jpg`,以及 `edges_after_blur.jpg`,观察阈值和预处理对结果的影响。
|
||||||
|
|
||||||
|
**运行结果预览**:
|
||||||
|
|
||||||
|
| 原始彩色图 | 灰度转换 |
|
||||||
|
|---|---|
|
||||||
|
|  |  |
|
||||||
|
|
||||||
|
| 低阈值 (50/150) | 中等阈值 (100/200) | 高阈值 (200/400) |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
|
| 高斯模糊后 | 先模糊再Canny |
|
||||||
|
|---|---|
|
||||||
|
|  |  |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 4.5 实验 5:图像阈值化
|
### 4.5 实验 5:图像阈值化
|
||||||
@@ -631,6 +675,16 @@ cmake .. && make -j$(nproc)
|
|||||||
./exp5
|
./exp5
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**运行结果预览**:
|
||||||
|
|
||||||
|
| 灰度渐变图 | THRESH_BINARY | THRESH_BINARY_INV |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
|
| THRESH_TRUNC | THRESH_TOZERO | THRESH_TOZERO_INV |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 4.6 实验 6:形态学操作——腐蚀与膨胀
|
### 4.6 实验 6:形态学操作——腐蚀与膨胀
|
||||||
@@ -710,6 +764,16 @@ cmake .. && make -j$(nproc)
|
|||||||
|
|
||||||
进入 `\\wsl$\Ubuntu\mnt\d\RM\25教学\视觉1\OpenCV-CPP\exp6_morphology\build`,依次对比 `binary.jpg`(原始)→ `eroded.jpg`(腐蚀)→ `dilated.jpg`(膨胀)→ `opened.jpg`(开运算)→ `closed.jpg`(闭运算),感受每种操作的效果。
|
进入 `\\wsl$\Ubuntu\mnt\d\RM\25教学\视觉1\OpenCV-CPP\exp6_morphology\build`,依次对比 `binary.jpg`(原始)→ `eroded.jpg`(腐蚀)→ `dilated.jpg`(膨胀)→ `opened.jpg`(开运算)→ `closed.jpg`(闭运算),感受每种操作的效果。
|
||||||
|
|
||||||
|
**运行结果预览**:
|
||||||
|
|
||||||
|
| 原始二值图 | 腐蚀后 | 膨胀后 |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
|
| 开运算 | 闭运算 | 3次腐蚀 |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 4.7 实验 7:颜色提取——inRange
|
### 4.7 实验 7:颜色提取——inRange
|
||||||
@@ -800,6 +864,20 @@ cmake .. && make -j$(nproc)
|
|||||||
- `red_extracted.jpg`:原图中只有红色的部分
|
- `red_extracted.jpg`:原图中只有红色的部分
|
||||||
- `mask_blue.jpg` / `blue_extracted.jpg`:蓝色提取
|
- `mask_blue.jpg` / `blue_extracted.jpg`:蓝色提取
|
||||||
|
|
||||||
|
**运行结果预览**:
|
||||||
|
|
||||||
|
| 原始彩色图 | HSV转换 |
|
||||||
|
|---|---|
|
||||||
|
|  |  |
|
||||||
|
|
||||||
|
| 红色范围1 (H 0~10) | 红色范围2 (H 160~180) | 合并后的红色mask |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
|
| 提取的红色区域 | 蓝色mask | 提取的蓝色区域 |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 4.8 实验 8:综合流水线
|
### 4.8 实验 8:综合流水线
|
||||||
@@ -890,6 +968,20 @@ cmake .. && make -j$(nproc)
|
|||||||
> [!TIP]
|
> [!TIP]
|
||||||
> 如果你看 `06c_result.jpg` 发现只有 0 个或 1 个检测框(预期应该是 2 个),别担心!这是因为代码中筛选条件比较严格。你可以在 `main.cpp` 中调整筛选参数(面积阈值和长宽比阈值),重新编译运行看看效果变化——这对后续的调参能力是很好的练习。
|
> 如果你看 `06c_result.jpg` 发现只有 0 个或 1 个检测框(预期应该是 2 个),别担心!这是因为代码中筛选条件比较严格。你可以在 `main.cpp` 中调整筛选参数(面积阈值和长宽比阈值),重新编译运行看看效果变化——这对后续的调参能力是很好的练习。
|
||||||
|
|
||||||
|
**运行结果预览**:
|
||||||
|
|
||||||
|
| 原始模拟场景 | HSV转换 | 高斯模糊后 |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
|
| inRange原始mask | 开运算去噪 | 闭运算填充 |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
|
| 提取的红色区域 | mask边缘检测 | 最终结果(绿框=检测到的灯条) |
|
||||||
|
|---|---|---|
|
||||||
|
|  |  |  |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 5. 结语与下一步预告
|
## 5. 结语与下一步预告
|
||||||
|
|||||||
Reference in New Issue
Block a user