一、OpenCV 里的 SVM 在解决什么问题?
给定:
-
一堆 特征向量(HOG、LBP、SURF、手工特征)
-
每个向量有一个 类别标签
OpenCV 的 SVM要做的是:
学一个判别函数:这个特征,更像 A 还是 B?




二、数学本质
1️⃣ 线性 SVM(OpenCV 用得最多)
判别函数:

2️⃣ 为什么 SVM 特别适合 HOG?
-
高维
-
稀疏
-
梯度方向统计
-
近似线性可分
线性 SVM 正好是 HOG 的"最优拍档"
三、OpenCV SVM
在 OpenCV 中:
cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::create();
它是:
-
C++ 实现
-
CPU 为主
-
适合:
-
几千到几十万样本
-
几百~几千维特征
-
❌ 不适合大规模深度特征
四、OpenCV 支持的 SVM 类型
| 类型 | 用途 |
|---|---|
C_SVC |
分类(最常用) |
NU_SVC |
分类(nu 参数) |
EPS_SVR |
回归 |
NU_SVR |
回归 |
ONE_CLASS |
异常检测 |
五、OpenCV-SVM 的典型使用流程
cpp
1️⃣ 准备训练数据
cv::Mat samples; // N × D
cv::Mat labels; // N × 1
2️⃣ 创建 & 配置 SVM
auto svm = cv::ml::SVM::create();
svm->setType(cv::ml::SVM::C_SVC);
svm->setKernel(cv::ml::SVM::LINEAR);
svm->setC(1.0);
3️⃣ 训练
svm->train(samples, cv::ml::ROW_SAMPLE, labels);
4️⃣ 预测
float response = svm->predict(sample);
为什么 OpenCV-SVM "现在不火了"?
不是 SVM 不行,而是:
-
CNN 把特征 + 分类一起学了
-
SVM 不端到端
-
对复杂形变能力有限
但在这些场景它依然非常强:
✔ 小样本
✔ 强解释性
✔ 工业项目
✔ 算力受限