速通 OpenCV&Modern Cpp
Step1 自行安装visual studio 2022
Step2 自行安装opencv windows exe version
https://opencv.org/releases/
4.8.1版本
https://blog.csdn.net/ycx_ccc/article/details/123258001
【【OpenCV】一劳永逸 ! Visual Studio配置OpenCV详解】 https://www.bilibili.com/video/BV1S541127kp/?share_source=copy_web&vd_source=e9d67ecc6775d595879efd0a7d60d332
Step3
官方文档:https://docs.opencv.org/4.x/
中文手册(GitHub):https://github.com/zhm-real/opencv-course
图像读写 + 基本操作
必会 API:
imread() / imwrite()
resize() / cvtColor() / split() / merge()
imshow() / waitKey() / destroyAllWindows()
Rect、Point、Scalar、Mat::at()
图像处理基础(滤波、边缘)
必会 API:
blur() / GaussianBlur() / medianBlur()
Canny() / threshold() / adaptiveThreshold()
bitwise_not()
形态学 + 轮廓 + 绘图
必会 API:
morphologyEx() / erode() / dilate()
findContours() / drawContours()
rectangle() / circle() / putText()
OpenCV应用
| 类别 | 能做的事情(举例) |
|---|---|
| 🖼 图像处理 | 读取/保存图像、灰度转换、滤波去噪、边缘检测、形态学操作等 |
| 📷 视频处理 | 读取摄像头、逐帧处理、保存视频、对象跟踪 |
| 🔍 特征提取 | 角点检测(如 Harris)、SIFT、ORB、SURF、FAST 等 |
| 🧱 目标检测 | 人脸检测、行人检测、车辆识别、物体定位等 |
| 🤖 机器学习 | 支持 SVM、KNN、决策树、Boosting 等分类器 |
| 🧠 深度学习 | 加载 ONNX 模型、YOLO、SSD、DNN 模块支持推理 |
| 👁 图像识别 | 字符识别(OCR)、物体识别、图像匹配 |
| 👣 图像分割 | 轮廓提取、GrabCut、阈值分割、Watershed |
| 🧭 几何变换 | 图像旋转、缩放、透视变换、仿射变换 |
| 🎯 相机标定 | 去畸变、相机内外参标定、立体视觉 |
| 🕹 3D 重建 | 立体匹配、深度图生成、结构光处理等 |
| 🛜 与硬件交互 | 读取摄像头、嵌入式视觉、图像采集卡接口等 |
现实场景
| 应用场景 | 描述 |
|---|---|
| 🚗 自动驾驶 | 车道线检测、交通标志识别、目标跟踪 |
| 📱 拍照美颜 | 磨皮、滤镜、背景虚化 |
| 👮 安防监控 | 入侵检测、人脸识别、动作识别 |
| 📷 图像增强 | 去噪、锐化、图像对比度增强 |
| 📄 OCR 文档识别 | 将扫描图转成文字(配合 Tesseract) |
| 🧠 AI + 视觉融合 | 使用 OpenCV 做前处理,送入 CNN/Transformer 模型识别 |
🧠 和深度学习结合能做什么?
cv::dnn 模块支持加载 TensorFlow、Caffe、ONNX 等格式模型
1.用 OpenCV 做图像预处理
2.加载训练好的深度学习模型(如 YOLOv5)
3.实现实时目标检测、人脸识别、姿态估计等功能
DNN 模块的更深层次能力:OpenCV 不只是加载模型!
| 能力 | 描述 |
|---|---|
| 🔍 多模型融合 | 同时加载多个 ONNX 模型(比如人脸检测 + 年龄性别识别 + 表情识别) |
| 🧠 DNN 加速 | 使用 OpenVINO、CUDA backend(net.setPreferableBackend())实现推理加速 |
| 🧬 ONNX 模型后处理 | 手动实现 Softmax、ArgMax、NMS、sigmoid 等逻辑 |
| 📚 多输入模型 | 支持 Transformer、Stable Diffusion(如 clip+unet)等结构(通过 blob 和 layer 分别输入) |
| 🔄 自定义层扩展 | 编译 OpenCV 支持插件 / 自定义操作(如 deformable conv) |
OpenCV + DNN 的进阶项目合集(按难度梯度排序)
【进阶1】YOLO + SORT 实时目标检测与跟踪系统
用 OpenCV 读取视频 + DNN 推理目标 + 多目标ID追踪
模型:YOLOv5 ONNX + SORT tracker (C++)
目标:输出每一帧目标位置 + ID(实现多目标追踪)
【进阶2】人脸检测 + 表情识别 + 年龄性别识别一体化系统
模型:
- RetinaFace / SCRFD (人脸检测)
- ONNX 表情识别模型
- ONNX 年龄性别模型(如 InsightFace 提供的)
多模型串联推理 + 面部区域裁剪 + 分类
可用于“摄像头实时人脸分析面板”
【进阶3】AI 实时美颜摄像头
图像分割模型(背景虚化)、脸部美颜(磨皮、增强)、五官增强(眼睛放大、脸型调整)
模型:BiSeNet(人脸分割)、ONNX 模型自定义转换
图像编辑 + UI 整合 + 实时处理
【进阶4】OCR 文字识别系统(端到端)
任务链条:
文本检测(DBNet / CTPN / EAST)
文本方向校正(仿射变换)
文本识别(CRNN / Rosetta / ViT-based)
全部 ONNX 模型,自己训练+转换
应用于文档扫描仪、车牌识别、表单分析
【高阶】3D 视觉系统(立体深度 / 3D目标检测)
模型:
MiDaS 深度估计(ONNX)
OpenCV + SGBM/双目深度
实时深度图生成 + 点云转换 + 三维可视化(可结合 Open3D)
姿态识别低延时项目
摄像头 → 实时识别人体姿态 → 判断是否标准 → 输出自然语言提示
要求:低延迟、强实时性、响应快
Modern C++ 包括
C++11(引入 auto、智能指针、lambda)
C++14(补强 C++11,比如泛型 lambda)
C++17(结构化绑定、if constexpr、std::optional)
C++20(概念、协程、范围for、
C++11(现代化的奠基石)
目标:提升代码简洁性、安全性和并发支持
| 特性 | 用法与解释 |
|---|---|
auto |
自动类型推导,避免冗长声明 |
nullptr |
替代 NULL,类型安全 |
range-based for |
类似 Python 的 for x in |
lambda 表达式 |
内联匿名函数,函数式编程利器 |
std::shared_ptr, std::unique_ptr |
安全管理资源生命周期(RAII) |
std::move |
实现移动语义,提升性能 |
右值引用(&&) |
支持移动构造和移动赋值 |
std::thread, mutex, condition_variable |
多线程标准库支持 |
enum class |
类型安全枚举,避免全局污染 |
constexpr |
编译期常量函数(简化宏) |
初始化列表 {} |
统一初始化风格,支持类成员初始化 |
| 示例(右值引用 + std::move): |
std::string foo() {
std::string s = "hello";
return std::move(s); // 避免拷贝,直接转移资源
}
C++14(精致优化 + 泛型支持)
目标:对 C++11 的细节优化,写法更灵活
| 特性 | 用法与解释 |
|---|---|
泛型 lambda(auto 参数) |
Lambda 可以接收任意类型 |
decltype(auto) |
返回类型同时保留引用/值性质 |
std::make_unique<T>() |
更安全地创建 unique_ptr |
二进制字面值(0b1010) |
可读性更高的二进制写法 |
return 类型自动推导 |
让函数写法更清爽(不能用于头文件定义模板函数) |
auto add = [](auto a, auto b) { return a + b; };
add(1, 2); // int
add(1.5, 2.5); // double
C++17(更强表达力 + 编译期功能)
目标:更好结构化代码、编译期计算增强
| 特性 | 用法与解释 |
|---|---|
结构化绑定(auto [x, y]) |
解构 pair、tuple |
if constexpr |
编译期条件分支,配合模板使用 |
std::optional |
可空类型,替代指针或 bool+输出参数 |
inline 变量 |
支持头文件中定义全局变量 |
std::variant, std::visit |
类似 Rust 的枚举,可存多种类型 |
[[nodiscard]] |
强制检查返回值 |
文件系统库 <filesystem> |
支持文件、路径操作 |
std::string_view |
类似指针 + 长度,避免字符串拷贝 |
| 折叠表达式(template parameter pack) | (... + args) 简洁表达多参数运算 |
std::optional<int> parseInt(const std::string& s) {
try {
return std::stoi(s);
} catch (...) {
return std::nullopt;
}
}
C++20(现代 C++ 的巅峰演进)
目标:表达更清晰、类型更安全、编译期更强
| 特性 | 用法与解释 |
|---|---|
协程(co_await, co_yield) |
用于异步/生成器(比如 C++ 版 async/await) |
Ranges 库 (<ranges>) |
提供管道式链式表达、懒计算 |
consteval / constinit |
更细致控制编译期行为 |
std::span |
类似 string_view,用于数组/容器的轻量视图 |
| 模块(modules) | 替代传统头文件机制(仍在推广中) |
| 三向比较(<=>) | “宇宙飞船操作符”,统一比较逻辑 |
| 类内初始化结构体模板 | 写法更简洁 |
概念(Concepts)【🌟 C++20的重磅】
Concept 是用于约束模板参数的编译期谓词(布尔表达式),让模板更清晰、错误更早暴露。
#include <concepts>
template<typename T>
concept Addable = requires(T a, T b) {
a + b;
};
template<Addable T>
T add(T a, T b) {
return a + b;
}
示例(ranges)
#include <ranges>
#include <vector>
#include <iostream>
int main() {
std::vector<int> v = {1, 2, 3, 4, 5};
for (int x : v | std::ranges::views::filter([](int x){ return x % 2 == 0; }))
std::cout << x << " ";
}
「Modern C++ 实战式学习路线」
语法核心 → 工程能力 → 项目拆解
第一步:精炼掌握语法核心(1~2周)
目标:搞懂工程里最常用的 Modern C++ 特性,并能在小例子中动手。
| 特性 | 理解目标 |
|---|---|
auto |
函数返回值、迭代器简写 |
range-for |
替代传统 for,提升可读性 |
lambda |
用于排序、过滤、回调等 |
shared_ptr, unique_ptr |
RAII 管理资源,搞懂什么时候该用哪个 |
const, &, &&, move |
引用折叠 & 移动语义 |
template |
泛型函数 & 类,理解 match 的过程 |
constexpr, if constexpr |
编译期计算,用在模板逻辑中 |
std::function |
函数封装、callback 接口设计 |
利用你已有的《C++ Primer》第五版,精读以下章节:
第6章:函数(默认参数、重载、inline)
第7章:类(构造函数、成员函数、this指针)
第9章 + 10章:容器、算法、迭代器
补充:lambda、智能指针、std::move → 可看慕课网/CSDN视频/B站搜索“Modern C++入门”
小练习建议:
写一个简化版的 Point3D 类,支持构造、输出、比较大小、移动语义。
写一个小模块:输入一个 .xyz 点云文件,返回 10 个最大 Z 的点。
第二步:掌握 C++ 工程能力(2~3周)
目标:你不只是会语法,而是能搞清楚大型 C++ 项目是怎么组织和运行的。
| 能力 | 推荐工具/知识 |
|---|---|
| CMake 构建 | 学写基本 CMakeLists.txt(设置编译选项、链接 OpenCV / Eigen) |
| 项目组织 | .hpp / .cpp 拆分、include guard / #pragma once、命名空间 |
| 调试技巧 | 用 VSCode / CLion 调试大型项目(设置断点、变量查看) |
| 第三方库 | Eigen, Sophus, Pangolin, OpenCV 的 C++ 接口用法 |
搞清楚 .cpp / .hpp 的调用关系,找到 main 函数,从 main 往下 trace 一次完整流程
动手修改一处逻辑,比如把输出的 cout 改成写日志
第三步:带目标地阅读项目源码(长期)
目标:不是泛读,而是带“问题”带“目的”阅读项目。
| 项目 | 阅读目标 | 推荐起点 |
|---|---|---|
| ORB-SLAM3 | 弄清楚帧是怎么被处理的 | System.cc → Tracking.cc |
| VINS-Mono | 看懂 IMU 预积分如何实现 | imu_process.cpp, Estimator.cpp |
| Gaussian Splatting | C++ 插件怎么绑定 PyTorch | gaussian_renderer.cu, pybind 模块 |
| Instant-NGP | 看懂 bounding box 初始化 | include/common.h, train.py 配合读 |
我要疯了,gpt输出的幻觉到底怎么验证啊……
为什么 ORB-SLAM 落地效果一般?
ORB-SLAM(包括 ORB-SLAM2/3)确实是学术上非常经典的视觉 SLAM 系统,但在实际项目部署中有几个明显短板:
❌ 1. 对运动状态过于敏感(非稳健)
稍微有一些快速运动或抖动,容易丢跟踪(tracking lost)
原因之一是使用 ORB 特征 + 静态关键帧筛选,特征鲁棒性有限
❌ 2. 单目精度有限(即便是ORB-SLAM3的视觉惯性模式)
单纯用图像,容易出现 scale drift
虽然 ORB-SLAM3 支持 VIO,但 IMU 融合部分偏“拼接”
❌ 3. 实时性不足 & CPU 吃紧
全用 CPU 跑,对嵌入式设备友好度不高
大多数系统 FPS 跑不到 10,部署到移动平台时体验不好
❌ 4. 工程结构臃肿
虽然模块分明,但和硬件同步(IMU/相机)接口不统一
扩展成 ROS 节点时需要大量桥接代码
为什么 VINS-Mono 被更多项目选为落地方案?
VINS-Mono 是由香港科技大学 Aerial Robotics Lab 出品,专为实用 VIO 场景设计,轻量级且高性能。
- 更强的运动鲁棒性
IMU 预积分 + 紧耦合优化
能很好地处理快速抖动、移动设备、无人机等动态环境 - 精度更高
Bundle Adjustment 优化中融合了 IMU & 图像残差
更准的状态估计,误差累积慢,适合中长期运行 - 可移植性好(ROS)
自带 ROS 节点,易于集成
可接入多种相机(mono/stereo)和传感器 - 实际项目验证多
大量开源自动驾驶、机器人项目直接集成了 VINS
社区活跃,有 VINS-Fusion, Fast-VINS, ESVIO 等衍生版本
结论 & 建议
如果你是要做科研+理解结构,ORB-SLAM3 非常好,经典、模块分明。
如果你是要真正落地部署在机器人/手机/AR头显上,✅ 推荐优先使用 VINS-Mono / VINS-Fusion。
想学得更深
| 动作 | 收益 |
|---|---|
阅读 imu_process.cpp + estimator.cpp |
学会 IMU 预积分 & 滑窗优化 |
分析 feature_tracker.cpp |
学习光流追踪 vs. 特征提取效率对比 |
| 替换图像前端为 SuperPoint/SuperGlue | 融合深度视觉与传统 VIO |
| 改写 VINS 为 ROS2 节点 + Python 控制接口 | 工程能力大提升 |

浙公网安备 33010602011771号