HOG特征检测+svm C++
时间: 2023-08-30 17:05:17 浏览: 77
HOG特征检测是一种基于梯度方向直方图的目标检测算法,可以用于人脸检测、行人检测等场景。下面是HOG特征检测+svm的C++实现步骤:
1. 加载正负样本数据集并提取HOG特征
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
using namespace cv;
int main() {
// 加载正负样本数据集
vector<Mat> pos_samples, neg_samples;
string pos_path = "pos_samples/";
string neg_path = "neg_samples/";
for (int i = 0; i < 100; i++) {
string img_name = pos_path + to_string(i) + ".jpg";
Mat img = imread(img_name, IMREAD_GRAYSCALE);
pos_samples.push_back(img);
}
for (int i = 0; i < 100; i++) {
string img_name = neg_path + to_string(i) + ".jpg";
Mat img = imread(img_name, IMREAD_GRAYSCALE);
neg_samples.push_back(img);
}
// 提取HOG特征
HOGDescriptor hog(Size(64, 128), Size(16, 16), Size(8, 8), Size(8, 8), 9);
vector<float> descriptors;
vector<vector<float>> pos_descriptors, neg_descriptors;
for (int i = 0; i < pos_samples.size(); i++) {
hog.compute(pos_samples[i], descriptors);
pos_descriptors.push_back(descriptors);
}
for (int i = 0; i < neg_samples.size(); i++) {
hog.compute(neg_samples[i], descriptors);
neg_descriptors.push_back(descriptors);
}
return 0;
}
```
2. 将HOG特征转换为svm的训练数据
```c++
// 将HOG特征转换为svm的训练数据
Mat train_data;
Mat train_label;
for (int i = 0; i < pos_descriptors.size(); i++) {
Mat row = Mat(pos_descriptors[i]).reshape(1, 1);
train_data.push_back(row);
train_label.push_back(1);
}
for (int i = 0; i < neg_descriptors.size(); i++) {
Mat row = Mat(neg_descriptors[i]).reshape(1, 1);
train_data.push_back(row);
train_label.push_back(-1);
}
```
3. 训练svm模型并保存
```c++
// 训练svm模型并保存
Ptr<ml::SVM> svm = ml::SVM::create();
svm->setType(ml::SVM::C_SVC);
svm->setKernel(ml::SVM::LINEAR);
svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6));
svm->train(train_data, ml::ROW_SAMPLE, train_label);
svm->save("svm_model.xml");
```
4. 加载svm模型并进行目标检测
```c++
// 加载svm模型并进行目标检测
Ptr<ml::SVM> svm = ml::StatModel::load<ml::SVM>("svm_model.xml");
HOGDescriptor hog(Size(64, 128), Size(16, 16), Size(8, 8), Size(8, 8), 9);
Mat img = imread("test.jpg", IMREAD_GRAYSCALE);
vector<Rect> found;
vector<float> descriptors;
hog.compute(img, descriptors);
Mat row = Mat(descriptors).reshape(1, 1);
float result = svm->predict(row);
if (result == 1) {
found.push_back(Rect(0, 0, 64, 128));
}
hog.detectMultiScale(img, found, 0, Size(8, 8), Size(0, 0), 1.05, 2);
for (int i = 0; i < found.size(); i++) {
rectangle(img, found[i], Scalar(0, 0, 255), 2);
}
imshow("result", img);
waitKey(0);
```
以上就是HOG特征检测+svm的C++实现步骤。需要注意的是,opencv中的svm模型只支持二分类,因此在本例中将正样本标签设为1,负样本标签设为-1。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)