您的位置:首页 > 编程语言 > C语言/C++

交通标识牌模型训练c++代码实例及运行结果

2018-01-25 09:33 281 查看
运行环境:vs2013+opencv2.4.9+win10

数据来源于GTSRB。

模型训练的C++代码

#include<opencv2/opencv.hpp>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include<time.h>

using namespace cv;
using namespace std;

int main()
{
int imgWidht = 48;//重新定义图片大小48*48
int imgHeight = 48;

vector<string> imgTrainPath;//输入文件名变量
vector<int> imgTrainLabel;
int nLine = 0;
string buf;
ifstream imagePath("E:\\vs2013\\opencv_code\\GTSRBtrafficSign\\train\\trainImgPath.txt");//训练数据位置
unsigned long n;

while (imagePath)//读取训练样本,imageName.txt一行为路径,一行为标签,循环
{
if (getline(imagePath, buf))
{
nLine++;
if (nLine % 2 == 0)
{
imgTrainLabel.push_back(atoi(buf.c_str()));//atoi将字符串转换成整型,图片标签
}
else
{
imgTrainPath.push_back(buf);//图像路径
}
}
}
imagePath.close();

CvMat *imgDataMat, *imgLabelMat;
int nImgNum = nLine / 2; //因为是每隔一行才是图片路径,所以要除以2
imgDataMat = cvCreateMat(nImgNum, 900, CV_32FC1); //cmd命令行运行出的HOG dims (即descriptors.size())大小,不同图片数值不一样,请自行修改
cvSetZero(imgDataMat);
imgLabelMat = cvCreateMat(nImgNum, 1, CV_32FC1);
cvSetZero(imgLabelMat);

IplImage* srcImg;
IplImage* trainImg = cvCreateImage(cvSize(imgWidht, imgHeight), 8, 3);
cout << "HOG特征开始提取" << endl;
for (string::size_type i = 0; i != imgTrainPath.size(); i++)
{
srcImg = cvLoadImage(imgTrainPath[i].c_str
4000
(), 1);
if (srcImg == NULL)
{
cout << " 图片读取错误 " << imgTrainPath[i].c_str() << endl;
continue;
}
cvResize(srcImg, trainImg);
HOGDescriptor *hog = new HOGDescriptor(cvSize(imgWidht, imgHeight), cvSize(16, 16), cvSize(8, 8), cvSize(8, 8), 9);
vector<float>descriptors;//数组的结果
hog->compute(trainImg, descriptors, Size(1, 1), Size(0, 0)); //开始计算
cout << "HOG dims(descriptors.size()): " << descriptors.size() << endl;
n = 0;
for (vector<float>::iterator iter = descriptors.begin(); iter != descriptors.end(); iter++)
{
cvmSet(imgDataMat, i, n, *iter);//HOG存储
n++;
}
cvmSet(imgLabelMat, i, 0, imgTrainLabel[i]);
}
cout << "HOG特征结束提取" << endl;

CvSVM svm;//新建SVM
CvSVMParams param;
CvTermCriteria criteria;
criteria = cvTermCriteria(CV_TERMCRIT_EPS, 1000, FLT_EPSILON);
param = CvSVMParams(CvSVM::C_SVC, CvSVM::RBF, 10.0, 0.09, 1.0, 10.0, 0.5, 1.0, NULL, criteria);//参数
cout << "svm开始训练"<<endl;
clock_t start = clock();
svm.train(imgDataMat, imgLabelMat, NULL, NULL, param);//训练svm
clock_t finish = clock();
double consumeTime = (double)(finish - start);
cout << "svm训练结束,用时"<<consumeTime<<endl;
svm.save("E:\\vs2013\\opencv_code\\GTSRBtrafficSign\\train\\train.xml");//训练结果存储位置
cvReleaseMat(&imgDataMat);
cvReleaseMat(&imgLabelMat);

system("pause");
return 0;
}运行结果

文件过大,就截个图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: