请使用C++17 opencv4.6 基于训练好的SVM模型做图片行人检测
时间: 2023-05-29 11:04:48 浏览: 201
以下是基于训练好的SVM模型进行图片行人检测的示例代码:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
// 加载训练好的SVM模型
Ptr<ml::SVM> svm = ml::SVM::load("svm_model.xml");
// 读取测试图片
Mat img = imread("test.jpg");
// 图片预处理
Mat gray_img;
cvtColor(img, gray_img, COLOR_BGR2GRAY);
equalizeHist(gray_img, gray_img);
// 行人检测
HOGDescriptor hog;
hog.setSVMDetector(svm->getDecisionFunction(0));
std::vector<Rect> found;
hog.detectMultiScale(gray_img, found, 0, Size(8, 8), Size(32, 32), 1.05, 2);
// 绘制检测结果
for (const auto& rect : found)
{
rectangle(img, rect, Scalar(0, 255, 0), 2);
}
// 显示检测结果
imshow("Pedestrian Detection", img);
waitKey(0);
return 0;
}
```
说明:
1. 首先,我们需要使用 `ml::SVM::load` 函数加载训练好的SVM模型。这里假设模型保存在名为 `svm_model.xml` 的文件中。
2. 接着,我们读取测试图片,并对其进行预处理。这里使用了灰度化和直方图均衡化等操作。
3. 然后,我们使用 `HOGDescriptor` 类来进行行人检测。首先,我们需要使用 `setSVMDetector` 函数设置SVM分类器的决策函数。这里,我们直接从SVM模型中获取第一个决策函数,并将其传递给 `setSVMDetector` 函数。接着,我们使用 `detectMultiScale` 函数来进行多尺度检测,得到检测结果,保存在 `found` 变量中。
4. 最后,我们遍历 `found` 变量,并使用 `rectangle` 函数绘制检测结果。然后,我们将结果显示出来,并等待用户按下任意键退出。
需要注意的是,如果训练SVM模型时使用的是HOG特征,那么在进行行人检测时也需要使用HOGDescriptor类。如果使用的是其他特征,比如Haar特征或LBP特征,那么在进行行人检测时就需要使用对应的检测器。
阅读全文