条件:opencv-4.5,QT

一、准备数据集

下载车牌相关字符样本用于训练和测试,本文使用14个汉字样本和34个数字跟字母样本,每个字符样本数为40,样本尺寸为28*28。

二、计算样本HOG特征

方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。具体内容详见以下链接:

HOG

OpenCV中的HOGDescriptor类可用于计算HOG特征。在计算HOG特征前需确定HOGDescriptor实例初始化参数,如下图,为HOGDescriptor类hog实例初始化设置参数。HOG特征描述子参数之间必须满足一定的关系,确保能够遍历整个特征提取窗口。

(1)blockSize的宽度和高度要分别能被cellSize的宽度和高度整除。

( 2 ) winSize 减 去 blockSize 的 宽 度 和 高 度 后 , 要 能 被blockStride对应的宽度和高度整除。

由于本例所使用样本为28*28,为满足以上要求,各项参数设置如下:

HOGDescriptor hog(Size(28,28),Size(4,4),Size(8,8),Size(4,4),9,1,-1);

调用HOGDescriptor类的compute方法计算HOG特征,得到特征描述子descriptors(列向量)

hog.compute(image,descriptors);//image为读取的单个样本,灰度图片

将descriptors写入push_back到temp(Mat) ,再将temp转为行向量,然后temp压入trainData,最后形成(行列数为样本数*特征数的矩阵),这里trainData大小为1920*144。

temp.push_back(descriptors);
trainData.push_back(temp.reshape(0,1));

然后需要生成标签向量,opencv SVM 接收类型为int的向量作为responses,

vector<int> trainLabel;
trainLabel.insert(trainLabel.begin()+ int(40*i),40,int(i));//i为对应的标签数据

三、设置SVM参数

由于是做分类任务,因此类型选择C_SVC,然后选择高斯核(RBF)作为kernel,因而需要设置参数Gamma

    cv::Ptr<cv::ml::SVM> SVMmodel = cv::ml::SVM::create();SVMmodel->setType(SVM::C_SVC);SVMmodel->setKernel(SVM::RBF);SVMmodel->setC(48);SVMmodel->setGamma(0.5);

设好参数后开始训练模型

    SVMmodel->train(traindata,cv::ml::ROW_SAMPLE,trainlabel);SVMmodel->save("SVM_Recognization.xml");//保存模型

在模型训练后,本文通过测试集测试其识别的准确率为92%。在实际车牌识别中也可以准确识别(车牌提取,分割处理后)

效果如下:

QString MainWindow::svmTrain(cv::Mat &src)
{using namespace std;using namespace cv;using namespace cv::ml;string province[14] = {"云","皖","苏","辽","闽","黑","京","川","沪","浙","湘","粤","陕","鲁"};string numcha[34] = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H",
"J","K","L","M","N","P","Q","R","S","T","U","V","W","X","Y","Z"};Mat traindata,testData,testSample;std::vector<int> trainlabel;src.copyTo(testData);HogGenerate(traindata,trainlabel,testData,testSample);cv::Ptr<cv::ml::SVM> SVMmodel = cv::ml::SVM::create();SVMmodel->setType(SVM::C_SVC);SVMmodel->setKernel(SVM::RBF);SVMmodel->setC(48);SVMmodel->setGamma(0.5);cout << "svm !!! " << endl;SVMmodel->train(traindata,cv::ml::ROW_SAMPLE,trainlabel);SVMmodel->save("SVM_Recognization.xml");//保存模型文件到项目的目录下Mat result;cout << "testSample Row:" << testSample.rows << " cols: " << testSample.cols << endl;SVMmodel->predict(testSample,result);int preIndex = int(result.at<float>(0));if(preIndex<=13){return QString::fromStdString(province[preIndex]);}else{return QString::fromStdString(numcha[preIndex-14]);}
}
void MainWindow::HogGenerate(cv::Mat &trainData, std::vector<int> &trainLabel,cv::Mat &testData,cv::Mat &testSample)
{using namespace cv;using namespace std;vector<string> PlateChar;string province[14] = {"云","皖","苏","辽","闽","黑","京","川","沪","浙","湘","粤","陕","鲁"};string numcha[34] = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H",
"J","K","L","M","N","P","Q","R","S","T","U","V","W","X","Y","Z"};size_t samples = 48;string Chapath = "/home/ghoson-x/Desktop/qt/CarImage/data/train_28_28/";string Chipath = "/home/ghoson-x/Desktop/qt/CarImage/data2/train_28_28/";vector<float> descriptors;HOGDescriptor hog(Size(28,28),Size(4,4),Size(8,8),Size(4,4),9,1,-1);string imagePath,imageName;for(size_t i=0;i<samples;++i){if(i<=13){imageName = province[i];imagePath = Chipath;}else{imageName = numcha[i-14];imagePath = Chapath;}imagePath.append(imageName).append("/").append(imageName).append("_");for(int j=1;j<=40;++j){string * ImagePath = new string;ImagePath->append(imagePath);ImagePath->append((QString::number(j)).toStdString()).append(".jpg");Mat tmp = imread(ImagePath->data(),IMREAD_GRAYSCALE);delete ImagePath;if(tmp.empty()){break;}Mat temp;hog.compute(tmp,descriptors);temp.push_back(descriptors);trainData.push_back(temp.reshape(0,1));temp.release();tmp.release();}trainLabel.insert(trainLabel.begin()+ int(40*i),40,int(i));}Mat test;hog.compute(testData,descriptors);test.push_back(descriptors);testSample.push_back(test.reshape(0,1));
}

基于opencv的SVM车牌号码识别模型训练(C++)QT相关推荐

  1. python的快车智能车牌号码识别系统的开发

    It is not always possible to prove some crimes. To achieve this, modern tools may be needed which mu ...

  2. java毕设项目车牌号码识别系统开源了,很好玩,建议尝试

    1.介绍 这是一个基于spring boot + maven + opencv 实现的Demo教程项目贯穿样本处理.模型训练.图像处理.对象检测.对象识别等技术点,以学习交流为目的,代码注释超多,文档 ...

  3. 基于python+OpenCV的车牌号码识别

    基于python+OpenCV的车牌号码识别 车牌识别行业已具备一定的市场规模,在电子警察.公路卡口.停车场.商业管理.汽修服务等领域已取得了部分应用.一个典型的车辆牌照识别系统一般包括以下4个部分: ...

  4. python基础教程:python+OpenCV实现车牌号码识别

    这篇文章主要介绍了python+OpenCV实现车牌号码识别,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 基于python+OpenCV的车牌号码识别,供大家参考,具 ...

  5. 基于OpenCV的 SVM算法实现数字识别(四)---代码实现

    三.基于SVM算法实现手写数字识别 作为一个工科生,而非数学专业的学生,我们研究一个算法,是要将它用于实际领域的.下面给出基于OpenCV3.0的SVM算法手写数字识别程序源码(参考http://bl ...

  6. matlab的车牌照识别,基于MatLab车牌号码识别算法研究与

    <基于MatLab车牌号码识别算法研究与>由会员分享,可在线阅读,更多相关<基于MatLab车牌号码识别算法研究与(15页珍藏版)>请在人人文库网上搜索. 1.基于,MatLa ...

  7. 基于LDA+SVM实现人脸识别模型

    基于LDA+SVM实现人脸识别模型 描述 人脸识别(图像识别)是机器学习领域十经典的应用,在本质上,人脸识别属于监督学习中的分类问题.前面章节中我们已经学习了支持向量机(SVM),该算法在图像分类领域 ...

  8. 《熟练掌握OpenCV----实用计算机视觉工程案例》第5章 车牌号码识别

    人工智能系列经典图书翻译 原   名:<Mastering OpenCV with Practical Computer Vision Projects> 作   者:Shervin Em ...

  9. python读取视频流做人脸识别_基于OpenCV和Keras实现人脸识别系列——二、使用OpenCV通过摄像头捕获实时视频并探测人脸、准备人脸数据...

    基于OpenCV和Keras实现人脸识别系列手记: 项目完整代码参见Github仓库. 本篇是上面这一系列手记的第二篇. 在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,而 ...

最新文章

  1. Meta AI推出“杂食者”:一个模型搞定图像、视频和3D数据三大分类任务,性能还不输独立模型...
  2. [IE编程] 如何获得IE版本号
  3. react-native项目打包速度优化
  4. ubuntu 12下的apache+php+mysql_老司机传授Ubuntu下Apache+PHP+MySQL环境搭建攻略
  5. python设置随机数种子为12_Python标准库12 数学与随机数 (math包,random包)(转载)...
  6. SQL SERVER2000中Transact-SQL语言详解
  7. web driver selenium 操作滚动条
  8. linux下tomcat部署java web项目_在linux下用tomcat部署java web项目的过程与注意事项
  9. python把print写入文件_python print输出到文件
  10. 什么软件可以测试麦克风音质,怎么测试麦克风
  11. 趣味ACM题 圣骑士的斩杀
  12. python实现爬虫_Python开发简单爬虫
  13. oracle11g安装教程_带有Oracle Digital Assistant和Fn Project的会话式UI
  14. 表单注册表单注册表单注册
  15. 鬼谷八荒逆天改命修改教程(3月亲测有效)
  16. opencv-python将彩色图片变回灰色图片
  17. 基于微信奶共享会议室预约小程序系统设计与实现 开题报告
  18. Ubuntu 20.04 X86成功编译运行wayland、wayland-protocols、weston,亲测有效,踩了很多坑,完美解决。
  19. 百合数c语言360问答,百合花的资料
  20. Masa Blazor in Blazor Day

热门文章

  1. 通达云OA2015版及钉钉、微信办公集成产品正式发布
  2. 王者荣耀关注显示服务器忙,王者荣耀不满足参加该活动的条件 访问繁忙解决方法...
  3. html5微信录音文件,微信H5录音实现
  4. VB不能加载MSCOMCTL.OCX所需文件
  5. Proteus8.9 VSM Studio SDCC编译器仿真STC15W4K32S4系列013_iic_03_AT24C08
  6. QIIME2进阶五_QIIME2扩增子基因序列多样性分析
  7. linux u盘空间越小 写入越慢,解决U盘容量变小问题
  8. 设置谷歌浏览器安全级别
  9. BBC:关于睡眠你应该知道的十件事
  10. 羚数智能入选 IDC关于中国制造执行系统(MES)的市场2021年度份额报告