|
|
|
@ -9,20 +9,20 @@ namespace easypr{
|
|
|
|
|
#define VERTICAL 0
|
|
|
|
|
#define NDEBUG
|
|
|
|
|
|
|
|
|
|
//中国车牌
|
|
|
|
|
//中国车牌
|
|
|
|
|
const char strCharacters[] = {'0','1','2','3','4','5',\
|
|
|
|
|
'6','7','8','9','A','B', 'C', 'D', 'E','F', 'G', 'H', /* 没有I */\
|
|
|
|
|
'J', 'K', 'L', 'M', 'N', /* 没有O */ 'P', 'Q', 'R', 'S', 'T', \
|
|
|
|
|
'6','7','8','9','A','B', 'C', 'D', 'E','F', 'G', 'H', /* 没有I */\
|
|
|
|
|
'J', 'K', 'L', 'M', 'N', /* 没有O */ 'P', 'Q', 'R', 'S', 'T', \
|
|
|
|
|
'U','V', 'W', 'X', 'Y', 'Z'};
|
|
|
|
|
const int numCharacter = 34; /* 没有I和0,10个数字与24个英文字符之和 */
|
|
|
|
|
const int numCharacter = 34; /* 没有I和0,10个数字与24个英文字符之和 */
|
|
|
|
|
|
|
|
|
|
//以下都是我训练时用到的中文字符数据,并不全面,有些省份没有训练数据所以没有字符
|
|
|
|
|
const string strChinese[] = {"zh_cuan" /* 川 */, "zh_e" /* 鄂 */, "zh_gan" /* 赣*/, \
|
|
|
|
|
"zh_hei" /* 黑 */, "zh_hu" /* 沪 */, "zh_ji" /* 冀 */, \
|
|
|
|
|
"zh_jl" /* 吉 */, "zh_jin" /* 津 */, "zh_jing" /* 京 */, "zh_shan" /* 陕 */, \
|
|
|
|
|
"zh_liao" /* 辽 */, "zh_lu" /* 鲁 */, "zh_min" /* 闽 */, "zh_ning" /* 宁 */, \
|
|
|
|
|
"zh_su" /* 苏 */, "zh_sx" /* 晋 */, "zh_wan" /* 皖 */,\
|
|
|
|
|
"zh_yu" /* 豫 */, "zh_yue" /* 粤 */, "zh_zhe" /* 浙 */};
|
|
|
|
|
//以下都是我训练时用到的中文字符数据,并不全面,有些省份没有训练数据所以没有字符
|
|
|
|
|
const string strChinese[] = {"zh_cuan" /* 川 */, "zh_e" /* 鄂 */, "zh_gan" /* 赣*/, \
|
|
|
|
|
"zh_hei" /* 黑 */, "zh_hu" /* 沪 */, "zh_ji" /* 冀 */, \
|
|
|
|
|
"zh_jl" /* 吉 */, "zh_jin" /* 津 */, "zh_jing" /* 京 */, "zh_shan" /* 陕 */, \
|
|
|
|
|
"zh_liao" /* 辽 */, "zh_lu" /* 鲁 */, "zh_min" /* 闽 */, "zh_ning" /* 宁 */, \
|
|
|
|
|
"zh_su" /* 苏 */, "zh_sx" /* 晋 */, "zh_wan" /* 皖 */,\
|
|
|
|
|
"zh_yu" /* 豫 */, "zh_yue" /* 粤 */, "zh_zhe" /* 浙 */};
|
|
|
|
|
|
|
|
|
|
const int numChinese = 20;
|
|
|
|
|
const int numAll = 54; /* 34+20=54 */
|
|
|
|
@ -36,26 +36,26 @@ CCharsIdentify::CCharsIdentify()
|
|
|
|
|
|
|
|
|
|
if (m_map.empty())
|
|
|
|
|
{
|
|
|
|
|
m_map.insert(pair<string, string>("zh_cuan","川"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_e","鄂"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_gan","赣"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_hei","黑"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_hu","沪"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_ji","冀"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_jl","吉"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_jin","津"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_jing","京"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_shan","陕"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_liao","辽"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_lu","鲁"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_min","闽"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_ning","宁"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_su","苏"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_sx","晋"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_wan","皖"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_yu","豫"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_yue","粤"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_zhe","浙"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_cuan","川"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_e","鄂"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_gan","赣"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_hei","黑"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_hu","沪"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_ji","冀"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_jl","吉"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_jin","津"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_jing","京"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_shan","陕"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_liao","辽"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_lu","鲁"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_min","闽"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_ning","宁"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_su","苏"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_sx","晋"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_wan","皖"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_yu","豫"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_yue","粤"));
|
|
|
|
|
m_map.insert(pair<string, string>("zh_zhe","浙"));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -72,7 +72,7 @@ void CCharsIdentify::LoadModel(string s)
|
|
|
|
|
ann.load(s.c_str(), "ann");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//create the accumulation histograms,img is a binary image, t is 水平或垂直
|
|
|
|
|
//create the accumulation histograms,img is a binary image, t is 水平或垂直
|
|
|
|
|
Mat CCharsIdentify::ProjectedHistogram(Mat img, int t)
|
|
|
|
|
{
|
|
|
|
|
int sz=(t)?img.rows:img.cols;
|
|
|
|
@ -80,7 +80,7 @@ Mat CCharsIdentify::ProjectedHistogram(Mat img, int t)
|
|
|
|
|
|
|
|
|
|
for(int j=0; j<sz; j++){
|
|
|
|
|
Mat data=(t)?img.row(j):img.col(j);
|
|
|
|
|
mhist.at<float>(j)=countNonZero(data); //统计这一行或一列中,非零元素的个数,并保存到mhist中
|
|
|
|
|
mhist.at<float>(j)=countNonZero(data); //统计这一行或一列中,非零元素的个数,并保存到mhist中
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Normalize histogram
|
|
|
|
@ -88,12 +88,12 @@ Mat CCharsIdentify::ProjectedHistogram(Mat img, int t)
|
|
|
|
|
minMaxLoc(mhist, &min, &max);
|
|
|
|
|
|
|
|
|
|
if(max>0)
|
|
|
|
|
mhist.convertTo(mhist,-1 , 1.0f/max, 0);//用mhist直方图中的最大值,归一化直方图
|
|
|
|
|
mhist.convertTo(mhist,-1 , 1.0f/max, 0);//用mhist直方图中的最大值,归一化直方图
|
|
|
|
|
|
|
|
|
|
return mhist;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//! 获得字符的特征图
|
|
|
|
|
//! 获得字符的特征图
|
|
|
|
|
Mat CCharsIdentify::features(Mat in, int sizeData)
|
|
|
|
|
{
|
|
|
|
|
//Histogram features
|
|
|
|
@ -109,7 +109,7 @@ Mat CCharsIdentify::features(Mat in, int sizeData)
|
|
|
|
|
|
|
|
|
|
Mat out = Mat::zeros(1, numCols, CV_32F);
|
|
|
|
|
|
|
|
|
|
//Asign values to feature,ANN的样本特征为水平、垂直直方图和低分辨率图像所组成的矢量
|
|
|
|
|
//Asign values to feature,ANN的样本特征为水平、垂直直方图和低分辨率图像所组成的矢量
|
|
|
|
|
int j=0;
|
|
|
|
|
for(int i=0; i<vhist.cols; i++)
|
|
|
|
|
{
|
|
|
|
@ -133,7 +133,7 @@ Mat CCharsIdentify::features(Mat in, int sizeData)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//! 利用神经网络做识别
|
|
|
|
|
//! 利用神经网络做识别
|
|
|
|
|
int CCharsIdentify::classify(Mat f, bool isChinses){
|
|
|
|
|
int result = -1;
|
|
|
|
|
Mat output(1, numAll, CV_32FC1);
|
|
|
|
@ -173,7 +173,7 @@ int CCharsIdentify::classify(Mat f, bool isChinses){
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//输入当个字符Mat,生成字符的string
|
|
|
|
|
//输入当个字符Mat,生成字符的string
|
|
|
|
|
string CCharsIdentify::charsIdentify(Mat input, bool isChinese)
|
|
|
|
|
{
|
|
|
|
|
Mat f = features(input, m_predictSize);
|
|
|
|
|