|
|
%!s(int64=5) %!d(string=hai) anos | |
|---|---|---|
| .. | ||
| .idea | %!s(int64=5) %!d(string=hai) anos | |
| lpr | %!s(int64=5) %!d(string=hai) anos | |
| CMakeLists.txt | %!s(int64=5) %!d(string=hai) anos | |
| readme.md | %!s(int64=5) %!d(string=hai) anos | |
| 基于深度学习的中文车牌识别.pdf | %!s(int64=5) %!d(string=hai) anos | |
1、test.cpp是串联程序,串联起了plateDetection、fineMapping、plateSegmentation、generalRecognizer、segmentationFreeRecognizer; 2、首先进PlateDetection.cpp中的plateDetectionRough函数,进行HAAR Cascade车牌粗定位,并对检测出的车牌区域进行扩展,便于之后的精确定位。 3、进入FineMapping.cpp中的FineMappingVertical函数,首先进行多次的自适应二值化,通过连通域分析,找到满足字符长宽比的的轮廓,将矩形轮廓上下两个点画出,然后使用随机抽样一致(RANSAC)拟合上下边界直线,并根据直线与图像左右边界的交点(四个点),重投影图像,将横向校正水平。 4、进入FastDeskew.cpp中的fastdeskew函数,统计各个方向场的角度来寻找图像中纹理最为密集的两个方向,然后选取极大值作为校正方向,将车牌竖向校正垂直。 5、进入FineMapping.cpp中的FineMappingHorizon函数,使用CNN Regression回归车牌左右边界。 6、选择字符识别的方法,SEGMENTATION_BASED_METHOD:使用cnn滑动窗切割字符,使用cnn识别字符;SEGMENTATION_FREE_METHOD:直接使用crnn网络识别不定长字符序列。 送入网络中的图像大小为140*36,输出为1*84*20*1,84=83个字符+1个black。
修改: 1、对于cascade检测出来的框,对于有重叠的框,利用连通区域提取矩形轮廓,从而取得重叠框的并集。 2,、对于extend检测框的时候,将上下边界框的扩展减小一半。 3、去掉原代码中FineMappingVertical,fastdeskew这两步水平和垂直矫正,通过观察中间输出结果发现一些情况下经过矫正后的车牌发生严重畸变造成识别错误,去掉这两步后识别错误率反而降低了。 4、在识别结果中加入车牌正则校验。 5、跑测试demo发现汉字存在误识别,数字部分几乎没有错误,通过判断前后两次识别结果中数字部分的Levenshtein距离和检测框在x方向的移动距离判定是否为同一个车牌,统计同一车牌识别结果中出现次数最多的作为该车牌最终识别结果。