1、生成xml训练文件
#include<iostream>
#include<opencv2/opencv.hpp>
#include<vector>
using namespace std;
using namespace cv;
using namespace cv::ml;
#define HOG_VECTOR 900
#define TRAIN_IMG_NUM 800
int main()
{
//创建HOG描述子
HOGDescriptor hog(Size(48, 48), Size(16, 16), Size(8, 8), Size(8, 8), 9,-1);
//提取样本特征
vector<float> descrip;//每个检测窗口的特征向量
vector<float> totaldescrip(HOG_VECTOR*TRAIN_IMG_NUM);//总样本的特征向量
vector<float>::iterator pos;
pos = totaldescrip.begin();
int ImageNum = 0;
//读取文件地址
String img_file = "C:\\Users\\tudejiang\\Desktop\\超声图像VOC格式标准数据集201911\\VOC2007\\JPEGImages\\*.jpg";
//存储读取文件地址图片名
vector<String> image_files;
//存储图片函数
glob(img_file, image_files);
for (int i = 0; i < image_files.size(); i++)
{
cout << image_files[i] << endl;
Mat src = imread(image_files[i]);
cvtColor(src,src,COLOR_BGR2GRAY);
hog.compute(src,descrip);//计算每张图像的HOG特征向量
vector<float>::iterator iter;
for (iter = descrip.begin(); iter != descrip.end(); iter++, pos++)
{
*pos = *iter;
}
}
//制作训练样本
float* buf2 = &totaldescrip[0];
Mat data_mat(TRAIN_IMG_NUM, HOG_VECTOR, CV_32FC1, buf2);
//制作训练标签
Mat label_mat=Mat::ones(TRAIN_IMG_NUM,1,CV_32SC1);
for (int k = 400; k < 800; k++)
{
label_mat.at<unsigned int>(k, 0) = 2;
}
//利用SVM进行训练生成XML文件
Ptr<ml::SVM> svm = ml::SVM::create();
svm->setTermCriteria(TermCriteria(TermCriteria::EPS, 1000, FLT_EPSILON));
svm->setType(SVM::C_SVC);
svm->setKernel(SVM::RBF);
svm->setDegree(10.0);//高斯核的参数设置
svm->setGamma(8.0);
svm->setCoef0(1.0);
svm->setC(10.0);
svm->setNu(0.5);
svm->setP(0.1);
Ptr<TrainData> traind = TrainData::create(data_mat, ROW_SAMPLE, label_mat);
svm->train(traind);
svm->save("svm_image.xml");
return 0;
}
2、给出图片预测
#include<iostream>
#include<opencv2/opencv.hpp>
#include<vector>
using namespace std;
using namespace cv;
using namespace cv::ml;
#define HOG_VECTOR 900
#define TRAIN_IMG_NUM 800
int main()
{
//创建HOG描述子
HOGDescriptor hog(Size(48, 48), Size(16, 16), Size(8, 8), Size(8, 8), 9,-1);
//提取样本特征
vector<float> descrip1;//每个检测窗口的特征向量
Mat src1 = imread("renlianjiance.jpg");
hog.compute(src1,descrip1);
float* buf1 = &descrip1[0];
Mat hog_data_mat(1,900,CV_32FC1,buf1);
//利用SVM进行训练生成XML文件
Ptr<ml::SVM> svm = ml::SVM::create();
svm->load("svm_image.xml");
float index = 0;
index = svm->predict(hog_data_mat);
cout << index << endl;
return 0;
}