最近参加一个比赛,需要车牌识别,目的是测试一个文件夹里的所有文件,将结果和测试文件名写入到excel文件。
我使用了HyperLPR开源车牌识别框架 github地址
HyperLPR利用深度学习实现中文车牌识别,设计流程如下:
step1. 使用opencv 的 HAAR Cascade 检测车牌大致位置
step2. Extend 检测到的大致位置的矩形区域
step3. 使用类似于MSER的方式的 多级二值化 + RANSAC 拟合车牌的上下边界
step4. 使用CNN Regression回归车牌左右边界
step5. 使用基于纹理场的算法进行车牌校正倾斜
step6. 使用CNN滑动窗切割字符
step7. 使用CNN识别字符
提供了win系统下python,C++,PHP代码,Linux系统下C++代码,还有Android系统下代码,准确度对于一般的使用够用了,其中python3的程序可以识别多种中文车牌包括白牌,新能源车牌,使馆车牌,教练车牌,武警车牌等。可惜我python刚学,对于各种库的使用还不熟悉,所以我用的是Windows系统下的C++代码,依赖OpenCV3.3
VS2015
我电脑上是visual studio2015社区版,可以到官网免费下载,选择Visual Studio Community 2015:地址
安装要好一会儿
OpenCV3.3
然后下载OpenCV3.3,地址:https://sourceforge/projects/opencvlibrary/
配置
接下来配置,可以参考这篇文章:https://blog.csdn/llb_bll/article/details/77071001?locationNum=10&fps=1
运行HyperLPR
将下载好的HyperLPR-master.zip解压,打开Prj-Win目录下的Prj-Win.sln工程。
注意,一定要配置好环境,VS2015中打开 视图->其他窗口->属性管理器,双击Debug|×64,在包含目录下,加入所需要的头文件目录,我的是E:\HyperLPR-master\Prj-Win\lpr\include
还要注意:!这一切的前提是先把OpenCV配置好。
然后运行test_pipeline.cpp,结果就可以出来了。
修改
要批量处理一个文件夹下的所有图片,我要先生成此文件下所有图片名称的txt文件:
打开CMD窗口,cd转到图片文件路径下,然后输入dir\b>txt文件名.txt,回车即可
接下来我对test_pipeline.cpp做了一些修改,while循环通过判断txt文件中每行是否读完,来执行每个图片的操作,for循环用于找出最大置信度所对应的识别结果,最后将结果写入到.csv文件中,csv文件可以用excel打开,主要代码如下:
string ImgName;
string ImgName1;
//测试集文件下的txt文件路径
ifstream fin("img_test\\功能评测图像库\\省市简称变化子库\\“川”牌\\云.txt");
//打开要输出的.csv文件
ofstream oFile;
oFile.open("川.csv", ios::out | ios::trunc);
//先写入表格标题
oFile << "车牌号" << "," << "测试文件名" << endl;
//判断是否读完txt
while (getline(fin, ImgName)) {
cout << "Handle" << ImgName << endl;
ImgName1 = "img_test\\功能评测图像库\\省市简称变化子库\\“川”牌" + ImgName;
//image = imread(ImgName);
cv::Mat image = cv::imread(ImgName1);
if (!image.empty()) {
//使用端到端模型模型进行识别,识别结果将会保存在res里面
std::vector<pr::PlateInfo> res = prc.RunPiplineAsImage(image);
float maxconf = 0.5; //初始最大置信度
string finaln;
for (auto st : res) {
//判断最大置信度下的识别结果
if (st.confidence > maxconf) {
//std::cout << st.getPlateName() << " " << st.confidence << std::endl;
maxconf = st.confidence;
finaln = st.getPlateName();
}
}
//将结果写入到.csv文件中
oFile << finaln << "," << ImgName1 << endl;
cout << "Done" << endl;
}
}
oFile.close();
cvWaitKey(0);
有了以上的改进后,就可以顺利的批量识别文件夹下的所有车牌图片,并将结果写入excel文件了。
更多推荐
中文车牌识别开源项目C++版使用笔记
发布评论