HOG+SVM

来源:互联网 发布:淘宝联盟导购id 编辑:程序博客网 时间:2024/05/16 08:33
#include <opencv2/opencv.hpp>#include <iostream>#include <sstream>using namespace std;using namespace cv;using namespace cv::ml;int main(){//文件路径的前缀string PrePath = "C:/Users/GuSheng/Desktop/photo/pedestrians128x64/";//文件名字的前缀string PreFileName1 = "per0000";string PreFileName2 = "per000";ostringstream is;vector<string> filename;//保存文件的名字filename.clear();//文件的个数为20int total = 20;for (int i = 1; i <= total;++i){is.str("");//这句话是必须的is << i;if (i<=9){filename.push_back(PrePath + PreFileName1 + is.str() + ".ppm");}else{filename.push_back(PrePath + PreFileName2 + is.str() + ".ppm");}}//开始进行HOG检测//影像的大小为64*128 块的大小为16*16 块的步长为8 cell的大小为8*8 bin的大小为9//则一副影像的特征向量为 7*15*4*9=3780Mat DataMat = Mat::zeros(total, 3780, CV_32FC1);Mat labelMat = Mat::zeros(total, 1, CV_32SC1);for (size_t i = 0; i < filename.size();++i){vector<float> descriptor;descriptor.clear();Ptr<HOGDescriptor> hog = new HOGDescriptor(Size(64, 128), Size(16, 16), Size(8, 8), Size(8, 8), 9);Mat img = imread(filename[i], IMREAD_GRAYSCALE);if (img.empty()){continue;}hog->compute(img, descriptor, Size(1, 1));//填充样本数据for (size_t j = 0; j < descriptor.size();++j){DataMat.at<float>(i, j) = descriptor[j];}labelMat.at<int>(i, 0) = i+1;}//开始进行训练Ptr<SVM> svm = SVM::create();svm->setType(SVM::C_SVC);svm->setKernel(SVM::LINEAR);svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-06));//开始进行训练svm->train(DataMat, ROW_SAMPLE, labelMat);svm->save("SVM_people.xml");string testName = "C:/Users/GuSheng/Desktop/photo/pedestrians128x64/per00012.ppm";Mat testImg = imread(testName, IMREAD_GRAYSCALE);if (testImg.empty()){return -1;}Ptr<HOGDescriptor> hog = new HOGDescriptor(Size(64, 128), Size(16, 16), Size(8, 8), Size(8, 8), 9);vector<float> descriptor;hog->compute(testImg, descriptor);int ret = svm->predict(descriptor);cout << ret << endl;return 0;}

0 0
原创粉丝点击