#include <iostream> #include <fstream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/objdetect/objdetect.hpp> #include <opencv2/ml/ml.hpp> using namespace std; using namespace cv; //继承自CvSVM的类,因为生成setSVMDetector()中用到的检测子参数时,需要用到训练好的SVM的decision_func参数, //但通过查看CvSVM源码可知decision_func参数是protected类型变量,无法直接访问到,只能继承之后通过函数访问 class MySVM : public CvSVM { public: //获得SVM的决策函数中的alpha数组 double * get_alpha_vector() { return this->decision_func->alpha; } //获得SVM的决策函数中的rho参数,即偏移量 float get_rho() { return this->decision_func->rho; } }; int main() { //检测窗口(64,128),块尺寸(16,16),块步长(8,8),cell尺寸(8,8),直方图bin个数9 HOGDescriptor hog(Size(64,128),Size(16,16),Size(8,8),Size(8,8),9);//HOG检测器,用来计算HOG描述子的 int DescriptorDim;//HOG描述子的维数,由图片大小、检测窗口大小、块大小、细胞单元中直方图bin个数决定 MySVM svm;//SVM分类器 svm.load("SVM_HOG_2400PosINRIA_12000Neg_HardExample.xml");//从XML文件读取训练好的SVM模型 /************************************************************************************************* 线性SVM训练完成后得到的XML文件里面,有一个数组,叫做support vector,还有一个数组,叫做alpha,有一个浮点数,叫做rho; 将alpha矩阵同support vector相乘,注意,alpha*supportVector,将得到一个列向量。之后,再该列向量的最后添加一个元素rho。 如此,变得到了一个分类器,利用该分类器,直接替换opencv中行人检测默认的那个分类器(cv::HOGDescriptor::setSVMDetector()), 就可以利用你的训练样本训练出来的分类器进行行人检测了。 ***************************************************************************************************/ DescriptorDim = svm.get_var_count();//特征向量的维数,即HOG描述子的维数 int supportVectorNum = svm.get_support_vector_count();//支持向量的个数 cout<<"支持向量个数:"<<supportVectorNum<<endl; Mat alphaMat = Mat::zeros(1, supportVectorNum, CV_32FC1);//alpha向量,长度等于支持向量个数 Mat supportVectorMat = Mat::zeros(supportVectorNum, DescriptorDim, CV_32FC1);//支持向量矩阵 Mat resultMat = Mat::zeros(1, DescriptorDim, CV_32FC1);//alpha向量乘以支持向量矩阵的结果 //将支持向量的数据复制到supportVectorMat矩阵中 for(int i=0; i<supportVectorNum; i++) { const float * pSVData = svm.get_support_vector(i);//返回第i个支持向量的数据指针 for(int j=0; j<DescriptorDim; j++) { supportVectorMat.at<float>(i,j) = pSVData[j]; } } //将alpha向量的数据复制到alphaMat中 double * pAlphaData = svm.get_alpha_vector();//返回SVM的决策函数中的alpha向量 for(int i=0; i<supportVectorNum; i++) { alphaMat.at<float>(0,i) = pAlphaData[i]; } //计算-(alphaMat * supportVectorMat),结果放到resultMat中 //gemm(alphaMat, supportVectorMat, -1, 0, 1, resultMat);//不知道为什么加负号? resultMat = -1 * alphaMat * supportVectorMat; //得到最终的setSVMDetector(const vector<float>& detector)参数中可用的检测子 vector<float> myDetector; //将resultMat中的数据复制到数组myDetector中 for(int i=0; i<DescriptorDim; i++) { myDetector.push_back(resultMat.at<float>(0,i)); } //最后添加偏移量rho,得到检测子 myDetector.push_back(svm.get_rho()); cout<<"检测子维数:"<<myDetector.size()<<endl; //设置HOGDescriptor的检测子 HOGDescriptor myHOG; myHOG.setSVMDetector(myDetector); //myHOG.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); //保存检测子参数到文件 ofstream fout("HOGDetectorForOpenCV.txt"); for(int i=0; i<myDetector.size(); i++) { fout<<myDetector[i]<<endl; } /**************读入图片进行HOG行人检测******************/ Mat src = imread("Test.jpg"); vector<Rect> found, found_filtered;//矩形框数组 cout<<"进行多尺度HOG人体检测"<<endl; myHOG.detectMultiScale(src, found, 0, Size(8,8), Size(32,32), 1.05, 2);//对图片进行多尺度行人检测 cout<<"找到的矩形框个数:"<<found.size()<<endl; //找出所有没有嵌套的矩形框r,并放入found_filtered中,如果有嵌套的话,则取外面最大的那个矩形框放入found_filtered中 for(int i=0; i < found.size(); i++) { Rect r = found[i]; int j=0; for(; j < found.size(); j++) if(j != i && (r & found[j]) == r) break; if( j == found.size()) found_filtered.push_back(r); } //画矩形框,因为hog检测出的矩形框比实际人体框要稍微大些,所以这里需要做一些调整 for(int i=0; i<found_filtered.size(); i++) { Rect r = found_filtered[i]; r.x += cvRound(r.width*0.1); r.width = cvRound(r.width*0.8); r.y += cvRound(r.height*0.07); r.height = cvRound(r.height*0.8); rectangle(src, r.tl(), r.br(), Scalar(0,255,0), 3); } //imwrite("ImgProcessed.jpg",src); namedWindow("src",0); imshow("src",src); waitKey(0);//注意:imshow之后必须加waitKey,否则无法显示图像 ///******************读入单个64*128的测试图并对其HOG描述子进行分类*********************/ ////读取测试图片(64*128大小),并计算其HOG描述子 //Mat testImg = imread("noperson000026.jpg"); //vector<float> descriptor; //hog.compute(testImg,descriptor,Size(8,8));//计算HOG描述子,检测窗口移动步长(8,8) //Mat testFeatureMat = Mat::zeros(1,3780,CV_32FC1);//测试样本的特征向量矩阵 ////将计算好的HOG描述子复制到testFeatureMat矩阵中 //for(int i=0; i<descriptor.size(); i++) // testFeatureMat.at<float>(0,i) = descriptor[i]; ////用训练好的SVM分类器对测试图片的特征向量进行分类 //int result = svm.predict(testFeatureMat);//返回类标 //cout<<"分类结果:"<<result<<endl; system("pause"); }
如果有训练好的行人检测XML文件,则利用opencv2使用以上代码进行测试。
运行环境opencv2+vs2017.
相关推荐
OpenCV(开源计算机视觉库)是...总的来说,通过结合Latent SVM算法和OpenCV的强大功能,我们可以实现高效的行人检测系统。在实际应用中,可能还需要根据具体需求进行调整和优化,比如集成深度学习模型以提高检测效果。
基于OpenCV 通过HOG+SVM训练INRIAPerson行人数据库进行行人检测源码+使用文档+全部资料(优秀项目)基于OpenCV 通过HOG+SVM训练INRIAPerson行人数据库进行行人检测源码+使用文档+全部资料(优秀项目) 【备注】 1、...
训练集用于训练SVM模型,而测试集则用来评估模型的性能。 3. **创建SVM模型**:使用OpenCV的`cv::ml::SVM::create()`方法初始化SVM对象,并设置相应的参数,如SVM类型(C_SVC表示多类分类)、核函数(如RBF核)和...
《基于HOG-SVM的行人检测——OpenCV实现详解》 在计算机视觉领域,行人检测是一项重要的技术,广泛应用于智能交通、视频监控、安全防护等多个领域。本篇将深入探讨如何利用OpenCV库,结合HOG(Histogram of ...
在计算机视觉领域,行人检测是...项目中的"行人检测svm hog"文件可能包含了实现这个系统的代码和样例数据,可以作为学习和实践的参考资料。在实际应用中,还需要不断优化和调整参数,以适应不同的场景和提高检测性能。
OpenCV中的HOG特征(Histogram of Oriented Gradients,方向梯度直方图)与SVM(Support Vector Machine,支持向量机)结合是计算机视觉领域中常用的行人检测方法。本教程将详细介绍如何利用这两种技术从训练数据集...
4. **训练SVM**:使用`cv2.ml.SVM_train()`方法,用训练集的特征和对应的类别标签训练SVM模型。在训练过程中,SVM会找到最佳的超平面以最大程度地分离两类数据。 5. **保存模型**:训练完成后,我们可以通过`cv2.ml...
2. `SVM.cpp/h`: 包含SVM训练和预测的代码实现。 3. `data/`: 训练和测试数据集,包括行人图像和非行人图像。 4. `main.cpp`: 主程序,调用HOG和SVM模块,完成行人检测。 5. `config.h`: 配置参数,如HOG的尺寸、SVM...
程序内可以选择Opencv自带的行人检测算法,也可以自己训练HOG特征进行检测。如果自己训练的话,需要在D盘建立一个文件(具体文件名程序中有)里面存在训练的正负样本,和测试样本。具体D盘的这个文件夹在本人自愿中...
而"hog_test"可能是测试代码或数据集,用于验证和实践HOG行人检测的实现。 总之,行人检测HOG OpenCV实现是一个结合了图像处理、特征提取和机器学习的过程。通过理解HOG特征的原理以及OpenCV提供的工具,开发者可以...
它可能包含了HOG特征的提取、SVM模型的训练和测试图像的行人检测过程。在实践中,可能会使用OpenCV库来帮助完成图像处理和特征提取,以及Scikit-learn库来进行SVM模型的构建和训练。 总结来说,这个DEMO展示了如何...
在OpenCV库中,我们可以利用`cv::HOGDescriptor`类来提取HOG特征,并使用`cv::ml::SVM`类训练SVM模型。以下是一个基本流程: 1. **数据预处理**:收集和准备训练和测试图像,确保它们已经进行了适当的缩放和归一化...
HOG特征是一种广泛用于计算机视觉,尤其是行人检测中的图像描述符。它通过计算和统计图像局部区域的梯度方向直方图来捕捉物体的形状和边缘信息。HOG特征的计算步骤通常包括: 1. **图像预处理**:灰度化、直方图...
4. **训练SVM**:使用特征矩阵和标签向量训练SVM模型。 5. **交叉验证**:为了防止过拟合,可能采用交叉验证来调整模型参数。 6. **模型评估**:使用测试集评估模型的检测性能,常用指标包括精度、召回率、F1分数等...
4. **训练SVM模型**:使用`cv::ml::SVM`类来训练SVM模型,可以选取合适的核函数(如线性、多项式或径向基函数),并调整正负样本权重、C和γ等参数。 5. **评估模型**:使用测试集评估模型性能,计算准确率、召回率...
该压缩包文件包含了一个使用Visual Studio 2008(VS2008)和OpenCV库实现行人检测的代码程序。OpenCV(Open Source Computer Vision Library)是一个强大的开源计算机视觉和机器学习软件库,广泛应用于图像处理和...
本项目基于MATLAB环境,结合OpenCV库实现了行人检测功能,采用了经典的HOG(Histogram of Oriented Gradients,方向梯度直方图)特征提取方法与SVM(Support Vector Machine,支持向量机)分类器进行行人检测。...
在压缩包文件“hogtrainsvm”中,很可能包含了作者训练SVM的代码、HOG特征提取的代码、测试图像、训练集和测试集的数据,以及可能的训练和测试结果。这些资源对于理解整个训练过程和评估模型性能至关重要。如果要...
常见的行人检测方法有Haar特征级联分类器、HOG(Histogram of Oriented Gradients)特征结合SVM(Support Vector Machine)、以及近年来流行的深度学习模型如YOLO(You Only Look Once)、Faster R-CNN和SSD(Single...