From 6d37b3aa5c60e0d55f8f0ff8bb39d45b28b4c583 Mon Sep 17 00:00:00 2001 From: TuxMonkey <8196772+tuxmonkey@user.noreply.gitee.com> Date: Tue, 28 Jul 2026 01:34:37 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20insert=2051=20output=20images=20from=20?= =?UTF-8?q?asset/=20into=20README.md=20and=20=E6=95=99=E6=A1=88.md=20with?= =?UTF-8?q?=20captions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 教案.md | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 184 insertions(+) diff --git a/README.md b/README.md index 6488873..1cf87b3 100644 --- a/README.md +++ b/README.md @@ -398,6 +398,12 @@ explorer.exe . > **提示**:把 `\\wsl$\Ubuntu\home\你的用户名\vision-training-2026-opencvcpp` 收藏到快速访问栏,后面每个实验都能快速查看输出图片。 +**运行结果预览**: + +| 程序生成的测试图 | 读取后再保存的验证图 | +|---|---| +| ![程序生成的原图(蓝/绿/红圆形 + 黄色矩形 + 文字)](asset/exp1_read_write_test_image.jpg) | ![读取后再保存的验证图](asset/exp1_read_write_output.jpg) | + ### 6.6 试试用自己的图片 把任何一张 `.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转换 | +|---|---|---| +| ![原始彩色图](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 讲:高斯模糊 @@ -557,6 +577,16 @@ cmake .. && make -j$(nproc) 查看 `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 边缘检测 @@ -636,6 +666,20 @@ cmake .. && make -j$(nproc) 对比 `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 讲:图像阈值化 @@ -701,6 +745,16 @@ cmake .. && make -j$(nproc) ./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 讲:形态学操作——腐蚀与膨胀 @@ -783,6 +837,16 @@ cmake .. && make -j$(nproc) 依次查看 `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(核心!) @@ -934,6 +998,20 @@ cmake .. && make -j$(nproc) **思考题**:为什么 `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 讲:综合流水线——串联一切 @@ -1091,6 +1169,20 @@ cmake .. && make -j$(nproc) > **挑战题**:如果检测到的框数量不对(比如只有一个或零个),试着修改 `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. 课堂总结与下一步 diff --git a/教案.md b/教案.md index eda94db..b611e66 100644 --- a/教案.md +++ b/教案.md @@ -370,6 +370,12 @@ cmake .. && make -j$(nproc) > [!NOTE] > 这条路径比较长,建议你把它收藏到资源管理器的快速访问栏,后面每个实验都要用。你只需要修改其中的实验文件夹名就能访问不同实验的输出。 +**运行结果预览**: + +| 程序生成的测试图 | 读取后再保存的验证图 | +|---|---| +| ![程序生成的原图(蓝/绿/红圆形 + 黄色矩形 + 文字)](asset/exp1_read_write_test_image.jpg) | ![读取后再保存的验证图](asset/exp1_read_write_output.jpg) | + --- ### 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` 等图片。 +**运行结果预览**: + +| 原始彩色图 | 灰度转换 | 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:高斯模糊 @@ -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` 四张图,观察散点噪声如何逐渐消失。 +**运行结果预览**: + +| 原始图片(含散点噪声) | 轻微模糊 (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 边缘检测 @@ -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`,观察阈值和预处理对结果的影响。 +**运行结果预览**: + +| 原始彩色图 | 灰度转换 | +|---|---| +| ![原始彩色图](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:图像阈值化 @@ -631,6 +675,16 @@ cmake .. && make -j$(nproc) ./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:形态学操作——腐蚀与膨胀 @@ -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`(闭运算),感受每种操作的效果。 +**运行结果预览**: + +| 原始二值图 | 腐蚀后 | 膨胀后 | +|---|---|---| +| ![原始二值图(白色矩形+内部黑洞+背景噪点)](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 @@ -800,6 +864,20 @@ cmake .. && make -j$(nproc) - `red_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:综合流水线 @@ -890,6 +968,20 @@ cmake .. && make -j$(nproc) > [!TIP] > 如果你看 `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. 结语与下一步预告