|
|
Features类:
|
|
|
这个类主要是特征回调函数。什么是回调函数?回调函数是当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。回调函数就相当于一个中断处理函数,由系统在符合你设定的条件时自动调用。
|
|
|
回调函数有以下几点作用:
|
|
|
1.回调函数就是客户自己做主的函数。比如,OnTime()定时器的回调函数,时间到了,需要做什么,交给客户自己处理,想添加什么功能都行。
|
|
|
2.回调函数很有可能是输出的一种方式。对于DLL来说,函数的输入参数【in】,输出参数【out】,回调函数的指针,作为其中的参数,可以起到输入的作用,也可以起到输出的作用。
|
|
|
3.回调函数还可以包括回调函数。
|
|
|
在整个系统中,Features类主要是特征的回调作用。当满足设定的条件时,调用该类的函数可以输出需要的特征。以下为该类中的主要函数:
|
|
|
getHisteFeatures函数是生成直方图均衡特征的回调函数。
|
|
|
getHistogramFeatures是获取垂直和水平的直方图图值。
|
|
|
getSIFTFeatures是获取SITF特征子的回调函数。
|
|
|
getHOGFeatures是获取HOG特征子的回调函数。
|
|
|
|
|
|
CoreFunc类:
|
|
|
这个类主要是共有的一些函数,并且这些函数的作用基本上都是对截取到的汽车牌照图进行处理的一些函数。比如,判断一个车牌的颜色、判断车牌的类型、显示图像等,都是对输入的图片进行处理的函数。
|
|
|
colorMatch函数是根据一副图像与颜色模板获取对应的二值图,输出灰度图(只有0和255两个值,255代表匹配,0代表不匹配)。
|
|
|
plateColorJudge函数是判断图片中的车牌是什么颜色,返回值为bool类型。如果为true,则最小值取决于H值,按比例衰减;如果为false,则不再自适应,使用固定的最小值minabs_sv。
|
|
|
getPlateType函数是判断图片中的车牌为什么类型的车牌。
|
|
|
projectHistogram函数是获取垂直或水平方向直方图。
|
|
|
features函数是获取样本特征水平、垂直直方图和低分辨率图像所组成的矢量。
|
|
|
showImage函数的作用是显示图像。
|
|
|
|
|
|
PlateLocate 类:
|
|
|
这个类主要是用于实现车牌定位的功能,还兼顾一些对车牌图片进行处理的功能。如生活模式与工业模式切换,定位车牌图像,车牌图像旋转微调等。
|
|
|
setLifemode(boolean islifemode)函数:用于切换生活模式与工业模式,只有一个布尔型的参数islifemode,setLifemode()函数没有返回值,根据参数islifemode的值来调整图片处理时的参数,如果为真,则设置各项参数为定位生活场景照片(如百度图片)的参数,否则恢复默认值。
|
|
|
plateLocate(Mat src)函数:用于定位车牌图像,仅有一个Mat类型的参数src,函数返回值是Vector<Mat>(Mat 类型的一个数组)。vector 是一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的。vector存入Mat的矩阵是按列存储,Mat的类型将隐式转化为vector的类型。函数对读取的图片进行一系列的处理,对多个车牌图片处理的结果仅会保留最后一个车牌图片的临时图片。图片处理流程:高斯模糊 -> 图像进行灰度化 -> 对图像进行Sobel 运算,得到图像的一阶水平方向导数 -> 对图像进行二值化 -> 使用闭操作,对图像进行闭操作以后,车牌区域被连接成一个矩形装的区域 -> 调用findContours()求出图中所有的轮廓 -> 对轮廓求最小外接矩形,然后验证,不满足条件的淘汰 -> 旋转,将某些倾斜的车牌调整正 -> 如果抓取的方块旋转超过m_angle角度,则不是车牌,放弃处理 -> 最后返回处理好的车牌图片。
|
|
|
verifySizes(RotatedRect mr)函数:用纵横比对minAreaRect获得的图片进行判断是不是最小外接矩形,函数是布尔类型的,返回true或者false。
|
|
|
showResultMat()函数:对图片进行旋转处理,并显示最终生成的车牌图像,用于判断是否成功进行了旋转,最后返回处理后的图片。
|
|
|
|
|
|
PlateJudge 类:
|
|
|
该类用于车牌判断,用SVM方法识别车牌。
|
|
|
loadSVM(String path)函数:用于加载模型文件xml,字符串参数传入文件路径。
|
|
|
PlateJudge()函数:调用loadSVM()函数进行加载模型文件xml的操作。
|
|
|
plateJudge(final Mat inMat)函数:用于对单幅图像进行SVM判断。调用getFeatures回调函数, 用于从车牌的image生成svm的训练特征features,然后和样本库对比,正样本返回0,负样本返回1。plateJudge(Vector<Mat> inVec, Vector<Mat> resultVec)函数:用于对多幅图像进行SVM判断。
|
|
|
|
|
|
PlateDetect类:
|
|
|
该类用于车牌检测识别,分两个步骤:
|
|
|
1、车牌定位 2、车牌判断,整合PlateLocate类和PlateJudge类两个类进行识别操作。
|
|
|
plateDetect(final Mat src, Vector<Mat> resultVec)函数:通过调用PlateLocate 类和PlateJudge 类的函数进行车牌检测识别,先车牌定位然后进行车牌判断,根据操作的结果返回不同的数值。
|
|
|
|
|
|
CharsIdentify类:
|
|
|
此类主要用于字符的鉴别,通过this.ann.clear();函数加载二值化后的ann配置文件,图像转文字的训练库文件,对图像进行定位于预测。CharsRecognise类:此类主要是通过字符的分割对字符进行识别。首先利用Vector<Mat> matVec = new Vector<Mat>();函数将车牌字符方块集合;String plateIdentify = "";输出车牌的识别结果;并通过调用charsSegment.setDebug(isDebug);return charsSegment.getDebug();PlateColor result = CoreFunc.getPlateType(input, true); return result.desc;charsSegment.setLiuDingSize(param);charsSegment.setColorThreshold(param); charsSegment.setBluePercent(param);return charsSegment.getBluePercent();charsSegment.setWhitePercent(param);return charsSegment.getWhitePercent();等函数来对车牌进行识别处理;其函数的作用分别是是否开启调式模式、获取调试模式状态、获得车牌颜色、设置柳丁大小变量、设置颜色阈值、设置蓝色百分比、得到蓝色百分比、设置白色百分比和得到白色百分比。通过一系列的函数对车牌进行进一步的识别与处理(处理过程中默认默认首个字符块是中文字符 第二个字符块是字母),转化为机器可识别的图像。
|
|
|
|
|
|
图片识别训练车牌识别训练:由src/main/java/com.yuxue.train路径下的SVMTrain.java实现。其中最重要的是train方法,实现了通过大量源图像文件和标记的比对建立起xml模型文件;doPridect方法借助模型文件和opencv库中的方法实现了对图片的识别判断。图片文字识别训练:由src/main/java/com.yuxue.train路径下的ANNTrain.java和CnANNTrain.java实现。其中ANNTrain.java用于数字的识别训练,CnANNTrain.java用于文字识别训练,两者内容所差无几。两者之中的train方法都是调用指定路径文件夹内的图片,通过opencv库内给定的函数进行识别和标记比对,建立模型;predict方法通过借助模型遍历测试样本下的所有文件,进行计算预测准确率。该功能主要用于为后续车牌判断(CharsIdentify)、字符分割(CharsSegment)和字符识别(CharsRecognise)提供模型数据,提高算法的准确性。
|
|
|
|
|
|
字符分割:由src/main/resources/easype-java路径下的CharsSegment实现。其中函数verifySizes是字符尺寸验证,用于去掉尺寸不符合的图块。函数preprocessChar是字符预处理,用于统一每个字符的大小。函数clearLiuDing用于计算每行元素的阶跃数,如果小于X认为是柳丁,将此行全部填0(涂黑), X可根据实际调整。函数GetChineseRect根据特殊车牌来构造猜测中文字符的位置和大小。函数GetSpecificRect用于找出指示城市的字符的Rect,之所以选择城市的字符位置,是因为该位置不管什么字母,占用的宽度跟高度的差不多,能大大提高位置的准确性。函数RebuildRect有两个功能,一是把特殊字符Rect左边的全部Rect去掉,后面再重建中文字符的位置;二是从特殊字符Rect开始,依次选择6个Rect,多余的舍去。函数SortRect用于将Rect按位置从左到右进行排序。
|
|
|
|