docs: insert 51 output images from asset/ into README.md and 教案.md with captions

This commit is contained in:
TuxMonkey
2026-07-28 01:34:37 +08:00
parent 4b9f475e9c
commit 6d37b3aa5c
2 changed files with 184 additions and 0 deletions

View File

@@ -398,6 +398,12 @@ explorer.exe .
> **提示**:把 `\\wsl$\Ubuntu\home\你的用户名\vision-training-2026-opencvcpp` 收藏到快速访问栏,后面每个实验都能快速查看输出图片。 > **提示**:把 `\\wsl$\Ubuntu\home\你的用户名\vision-training-2026-opencvcpp` 收藏到快速访问栏,后面每个实验都能快速查看输出图片。
**运行结果预览**:
| 程序生成的测试图 | 读取后再保存的验证图 |
|---|---|
| ![程序生成的原图(蓝/绿/红圆形 + 黄色矩形 + 文字)](asset/exp1_read_write_test_image.jpg) | ![读取后再保存的验证图](asset/exp1_read_write_output.jpg) |
### 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转换 |
|---|---|---|
| ![原始彩色图](asset/exp2_color_space_original.jpg) | ![灰度转换结果](asset/exp2_color_space_gray.jpg) | ![HSV转换结果](asset/exp2_color_space_hsv.jpg) |
| H通道(色相) | S通道(饱和度) | V通道(明度) |
|---|---|---|
| ![H通道(色相)](asset/exp2_color_space_hsv_channel_H.jpg) | ![S通道(饱和度)](asset/exp2_color_space_hsv_channel_S.jpg) | ![V通道(明度)](asset/exp2_color_space_hsv_channel_V.jpg) |
| Lab转换 | YCrCb转换 |
|---|---|
| ![Lab转换](asset/exp2_color_space_lab.jpg) | ![YCrCb转换](asset/exp2_color_space_ycrcb.jpg) |
--- ---
## 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) |
|---|---|---|
| ![原始图片(含散点噪声)](asset/exp3_gaussian_blur_original.jpg) | ![轻微模糊 ksize=3×3](asset/exp3_gaussian_blur_blur_3x3.jpg) | ![中度模糊 ksize=9×9](asset/exp3_gaussian_blur_blur_9x9.jpg) |
| 重度模糊 (ksize=21×21) | 各向异性模糊 (sigmaX=15, sigmaY=3) |
|---|---|
| ![重度模糊 ksize=21×21](asset/exp3_gaussian_blur_blur_21x21.jpg) | ![各向异性模糊 sigmaX=15 sigmaY=3](asset/exp3_gaussian_blur_blur_anisotropic.jpg) |
--- ---
## 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`,理解阈值如何影响结果。
**运行结果预览**:
| 原始彩色图 | 灰度转换 |
|---|---|
| ![原始彩色图](asset/exp4_canny_original.jpg) | ![灰度转换](asset/exp4_canny_gray.jpg) |
| 低阈值 (50/150) | 中等阈值 (100/200) | 高阈值 (200/400) |
|---|---|---|
| ![低阈值 50/150](asset/exp4_canny_edges_low.jpg) | ![中等阈值 100/200](asset/exp4_canny_edges_mid.jpg) | ![高阈值 200/400](asset/exp4_canny_edges_high.jpg) |
| 高斯模糊后 | 先模糊再Canny |
|---|---|
| ![高斯模糊后](asset/exp4_canny_blurred.jpg) | ![先模糊再Canny](asset/exp4_canny_edges_after_blur.jpg) |
--- ---
## 10. 第 5 讲:图像阈值化 ## 10. 第 5 讲:图像阈值化
@@ -701,6 +745,16 @@ cmake .. && make -j$(nproc)
./exp5 ./exp5
``` ```
**运行结果预览**:
| 灰度渐变图 | THRESH_BINARY | THRESH_BINARY_INV |
|---|---|---|
| ![灰度渐变图](asset/exp5_threshold_gradient.jpg) | ![THRESH_BINARY](asset/exp5_threshold_thresh_binary.jpg) | ![THRESH_BINARY_INV](asset/exp5_threshold_thresh_binary_inv.jpg) |
| THRESH_TRUNC | THRESH_TOZERO | THRESH_TOZERO_INV |
|---|---|---|
| ![THRESH_TRUNC](asset/exp5_threshold_thresh_trunc.jpg) | ![THRESH_TOZERO](asset/exp5_threshold_thresh_tozero.jpg) | ![THRESH_TOZERO_INV](asset/exp5_threshold_thresh_tozero_inv.jpg) |
--- ---
## 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`。
**运行结果预览**:
| 原始二值图 | 腐蚀后 | 膨胀后 |
|---|---|---|
| ![原始二值图(白色矩形+内部黑洞+背景噪点)](asset/exp6_morphology_binary.jpg) | ![腐蚀后](asset/exp6_morphology_eroded.jpg) | ![膨胀后](asset/exp6_morphology_dilated.jpg) |
| 开运算 | 闭运算 | 3次腐蚀 |
|---|---|---|
| ![开运算](asset/exp6_morphology_opened.jpg) | ![闭运算](asset/exp6_morphology_closed.jpg) | ![3次腐蚀](asset/exp6_morphology_eroded_x3.jpg) |
--- ---
## 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转换 |
|---|---|
| ![原始彩色图(6色+4种深浅红色)](asset/exp7_inrange_original.jpg) | ![HSV转换](asset/exp7_inrange_hsv.jpg) |
| 红色范围1 (H 0~10) | 红色范围2 (H 160~180) | 合并后的红色mask |
|---|---|---|
| ![红色范围1 H 0~10](asset/exp7_inrange_mask_red1.jpg) | ![红色范围2 H 160~180](asset/exp7_inrange_mask_red2.jpg) | ![合并后的红色mask](asset/exp7_inrange_mask_red_combined.jpg) |
| 提取的红色区域 | 蓝色mask | 提取的蓝色区域 |
|---|---|---|
| ![提取的红色区域](asset/exp7_inrange_red_extracted.jpg) | ![蓝色mask](asset/exp7_inrange_mask_blue.jpg) | ![提取的蓝色区域](asset/exp7_inrange_blue_extracted.jpg) |
--- ---
## 13. 第 8 讲:综合流水线——串联一切 ## 13. 第 8 讲:综合流水线——串联一切
@@ -1091,6 +1169,20 @@ cmake .. && make -j$(nproc)
> **挑战题**:如果检测到的框数量不对(比如只有一个或零个),试着修改 `main.cpp` 中的筛选参数(面积阈值 100 和长宽比阈值 2),重新编译运行,看效果怎么变化。这就是"调参"——RoboMaster 视觉组的基本功。 > **挑战题**:如果检测到的框数量不对(比如只有一个或零个),试着修改 `main.cpp` 中的筛选参数(面积阈值 100 和长宽比阈值 2),重新编译运行,看效果怎么变化。这就是"调参"——RoboMaster 视觉组的基本功。
**运行结果预览**:
| 原始模拟场景 | HSV转换 | 高斯模糊后 |
|---|---|---|
| ![原始模拟场景](asset/exp8_pipeline_01_original_scene.jpg) | ![HSV转换](asset/exp8_pipeline_02_hsv.jpg) | ![高斯模糊后](asset/exp8_pipeline_03_hsv_blurred.jpg) |
| inRange原始mask | 开运算去噪 | 闭运算填充 |
|---|---|---|
| ![inRange原始mask](asset/exp8_pipeline_04_red_mask_raw.jpg) | ![开运算去噪](asset/exp8_pipeline_05a_mask_opened.jpg) | ![闭运算填充](asset/exp8_pipeline_05b_mask_cleaned.jpg) |
| 提取的红色区域 | mask边缘检测 | 最终结果(绿框=检测到的灯条) |
|---|---|---|
| ![提取的红色区域](asset/exp8_pipeline_06a_red_extracted.jpg) | ![mask边缘检测](asset/exp8_pipeline_06b_mask_edges.jpg) | ![最终结果(绿色框=检测到的灯条)](asset/exp8_pipeline_06c_result.jpg) |
--- ---
## 14. 课堂总结与下一步 ## 14. 课堂总结与下一步

View File

@@ -370,6 +370,12 @@ cmake .. && make -j$(nproc)
> [!NOTE] > [!NOTE]
> 这条路径比较长,建议你把它收藏到资源管理器的快速访问栏,后面每个实验都要用。你只需要修改其中的实验文件夹名就能访问不同实验的输出。 > 这条路径比较长,建议你把它收藏到资源管理器的快速访问栏,后面每个实验都要用。你只需要修改其中的实验文件夹名就能访问不同实验的输出。
**运行结果预览**:
| 程序生成的测试图 | 读取后再保存的验证图 |
|---|---|
| ![程序生成的原图(蓝/绿/红圆形 + 黄色矩形 + 文字)](asset/exp1_read_write_test_image.jpg) | ![读取后再保存的验证图](asset/exp1_read_write_output.jpg) |
--- ---
### 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转换 |
|---|---|---|
| ![原始彩色图](asset/exp2_color_space_original.jpg) | ![灰度转换结果](asset/exp2_color_space_gray.jpg) | ![HSV转换结果](asset/exp2_color_space_hsv.jpg) |
| H通道(色相) | S通道(饱和度) | V通道(明度) |
|---|---|---|
| ![H通道(色相)](asset/exp2_color_space_hsv_channel_H.jpg) | ![S通道(饱和度)](asset/exp2_color_space_hsv_channel_S.jpg) | ![V通道(明度)](asset/exp2_color_space_hsv_channel_V.jpg) |
| Lab转换 | YCrCb转换 |
|---|---|
| ![Lab转换](asset/exp2_color_space_lab.jpg) | ![YCrCb转换](asset/exp2_color_space_ycrcb.jpg) |
--- ---
### 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) |
|---|---|---|
| ![原始图片(含散点噪声)](asset/exp3_gaussian_blur_original.jpg) | ![轻微模糊 ksize=3×3](asset/exp3_gaussian_blur_blur_3x3.jpg) | ![中度模糊 ksize=9×9](asset/exp3_gaussian_blur_blur_9x9.jpg) |
| 重度模糊 (ksize=21×21) | 各向异性模糊 (sigmaX=15, sigmaY=3) |
|---|---|
| ![重度模糊 ksize=21×21](asset/exp3_gaussian_blur_blur_21x21.jpg) | ![各向异性模糊 sigmaX=15 sigmaY=3](asset/exp3_gaussian_blur_blur_anisotropic.jpg) |
--- ---
### 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`,观察阈值和预处理对结果的影响。
**运行结果预览**:
| 原始彩色图 | 灰度转换 |
|---|---|
| ![原始彩色图](asset/exp4_canny_original.jpg) | ![灰度转换](asset/exp4_canny_gray.jpg) |
| 低阈值 (50/150) | 中等阈值 (100/200) | 高阈值 (200/400) |
|---|---|---|
| ![低阈值 50/150](asset/exp4_canny_edges_low.jpg) | ![中等阈值 100/200](asset/exp4_canny_edges_mid.jpg) | ![高阈值 200/400](asset/exp4_canny_edges_high.jpg) |
| 高斯模糊后 | 先模糊再Canny |
|---|---|
| ![高斯模糊后](asset/exp4_canny_blurred.jpg) | ![先模糊再Canny](asset/exp4_canny_edges_after_blur.jpg) |
--- ---
### 4.5 实验 5:图像阈值化 ### 4.5 实验 5:图像阈值化
@@ -631,6 +675,16 @@ cmake .. && make -j$(nproc)
./exp5 ./exp5
``` ```
**运行结果预览**:
| 灰度渐变图 | THRESH_BINARY | THRESH_BINARY_INV |
|---|---|---|
| ![灰度渐变图](asset/exp5_threshold_gradient.jpg) | ![THRESH_BINARY](asset/exp5_threshold_thresh_binary.jpg) | ![THRESH_BINARY_INV](asset/exp5_threshold_thresh_binary_inv.jpg) |
| THRESH_TRUNC | THRESH_TOZERO | THRESH_TOZERO_INV |
|---|---|---|
| ![THRESH_TRUNC](asset/exp5_threshold_thresh_trunc.jpg) | ![THRESH_TOZERO](asset/exp5_threshold_thresh_tozero.jpg) | ![THRESH_TOZERO_INV](asset/exp5_threshold_thresh_tozero_inv.jpg) |
--- ---
### 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`(闭运算),感受每种操作的效果。
**运行结果预览**:
| 原始二值图 | 腐蚀后 | 膨胀后 |
|---|---|---|
| ![原始二值图(白色矩形+内部黑洞+背景噪点)](asset/exp6_morphology_binary.jpg) | ![腐蚀后](asset/exp6_morphology_eroded.jpg) | ![膨胀后](asset/exp6_morphology_dilated.jpg) |
| 开运算 | 闭运算 | 3次腐蚀 |
|---|---|---|
| ![开运算](asset/exp6_morphology_opened.jpg) | ![闭运算](asset/exp6_morphology_closed.jpg) | ![3次腐蚀](asset/exp6_morphology_eroded_x3.jpg) |
--- ---
### 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转换 |
|---|---|
| ![原始彩色图(6色+4种深浅红色)](asset/exp7_inrange_original.jpg) | ![HSV转换](asset/exp7_inrange_hsv.jpg) |
| 红色范围1 (H 0~10) | 红色范围2 (H 160~180) | 合并后的红色mask |
|---|---|---|
| ![红色范围1 H 0~10](asset/exp7_inrange_mask_red1.jpg) | ![红色范围2 H 160~180](asset/exp7_inrange_mask_red2.jpg) | ![合并后的红色mask](asset/exp7_inrange_mask_red_combined.jpg) |
| 提取的红色区域 | 蓝色mask | 提取的蓝色区域 |
|---|---|---|
| ![提取的红色区域](asset/exp7_inrange_red_extracted.jpg) | ![蓝色mask](asset/exp7_inrange_mask_blue.jpg) | ![提取的蓝色区域](asset/exp7_inrange_blue_extracted.jpg) |
--- ---
### 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转换 | 高斯模糊后 |
|---|---|---|
| ![原始模拟场景](asset/exp8_pipeline_01_original_scene.jpg) | ![HSV转换](asset/exp8_pipeline_02_hsv.jpg) | ![高斯模糊后](asset/exp8_pipeline_03_hsv_blurred.jpg) |
| inRange原始mask | 开运算去噪 | 闭运算填充 |
|---|---|---|
| ![inRange原始mask](asset/exp8_pipeline_04_red_mask_raw.jpg) | ![开运算去噪](asset/exp8_pipeline_05a_mask_opened.jpg) | ![闭运算填充](asset/exp8_pipeline_05b_mask_cleaned.jpg) |
| 提取的红色区域 | mask边缘检测 | 最终结果(绿框=检测到的灯条) |
|---|---|---|
| ![提取的红色区域](asset/exp8_pipeline_06a_red_extracted.jpg) | ![mask边缘检测](asset/exp8_pipeline_06b_mask_edges.jpg) | ![最终结果(绿色框=检测到的灯条)](asset/exp8_pipeline_06c_result.jpg) |
--- ---
## 5. 结语与下一步预告 ## 5. 结语与下一步预告