You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
5.2 KiB
185 lines
5.2 KiB
10 years ago
|
#ifndef EASYPR_ACCURACY_HPP
|
||
|
#define EASYPR_ACCURACY_HPP
|
||
10 years ago
|
|
||
10 years ago
|
namespace easypr {
|
||
10 years ago
|
|
||
10 years ago
|
namespace demo {
|
||
10 years ago
|
|
||
10 years ago
|
int accuracyTest(const char* test_path) {
|
||
10 years ago
|
auto files = Utils::getFiles(test_path);
|
||
|
|
||
|
CPlateRecognize pr;
|
||
|
|
||
10 years ago
|
pr.LoadSVM("resources/model/svm.xml");
|
||
|
pr.LoadANN("resources/model/ann.xml");
|
||
10 years ago
|
pr.setLifemode(true);
|
||
10 years ago
|
pr.setDebug(false);
|
||
10 years ago
|
|
||
10 years ago
|
// 设置要处理的一张图片中最多有多少车牌
|
||
10 years ago
|
pr.setMaxPlates(4);
|
||
|
|
||
10 years ago
|
size_t files_num = files.size();
|
||
10 years ago
|
|
||
10 years ago
|
if (0 == files_num) {
|
||
|
cout << "No File Found in " << test_path << "!" << endl;
|
||
10 years ago
|
return 0;
|
||
|
}
|
||
|
|
||
|
cout << "Begin to test the easypr accuracy!" << endl;
|
||
|
|
||
10 years ago
|
// 总的测试图片数量
|
||
10 years ago
|
int count_all = 0;
|
||
10 years ago
|
// 错误的图片数量
|
||
10 years ago
|
int count_err = 0;
|
||
10 years ago
|
// 未识别的图片数量
|
||
10 years ago
|
int count_norecogin = 0;
|
||
|
|
||
10 years ago
|
// 总的字符差距
|
||
10 years ago
|
float diff_all = 0;
|
||
10 years ago
|
// 平均字符差距
|
||
10 years ago
|
float diff_avg = 0;
|
||
10 years ago
|
// 完全匹配的识别次数
|
||
10 years ago
|
float match_count = 0;
|
||
10 years ago
|
// 完全匹配的识别次数所占识别图片中的比例
|
||
10 years ago
|
float match_rate = 0;
|
||
|
|
||
10 years ago
|
// 开始和结束时间
|
||
10 years ago
|
time_t begin, end;
|
||
|
time(&begin);
|
||
|
|
||
10 years ago
|
for (int i = 0; i < files_num; i++) {
|
||
|
string filepath = files[i];
|
||
10 years ago
|
cout << "------------------" << endl;
|
||
|
|
||
10 years ago
|
// 获取真实的车牌
|
||
10 years ago
|
string plateLicense = Utils::getFileName(filepath);
|
||
10 years ago
|
cout << "原牌:" << plateLicense << endl;
|
||
10 years ago
|
|
||
10 years ago
|
// EasyPR开始判断车牌
|
||
10 years ago
|
Mat src = imread(filepath);
|
||
|
|
||
10 years ago
|
vector <string> plateVec;
|
||
|
int result = pr.plateRecognize(src, plateVec);
|
||
10 years ago
|
if (result == 0) {
|
||
10 years ago
|
size_t num = plateVec.size();
|
||
10 years ago
|
|
||
|
if (num == 0) {
|
||
10 years ago
|
cout << "无车牌" << endl;
|
||
|
if (plateLicense != "无车牌") count_norecogin++;
|
||
10 years ago
|
} else if (num > 1) {
|
||
10 years ago
|
// 多车牌使用diff最小的那个记录
|
||
10 years ago
|
int mindiff = 10000;
|
||
|
for (int j = 0; j < num; j++) {
|
||
|
cout << plateVec[j] << " (" << j + 1 << ")" << endl;
|
||
|
string colorplate = plateVec[j];
|
||
|
|
||
10 years ago
|
// 计算"蓝牌:苏E7KU22"中冒号后面的车牌大小"
|
||
10 years ago
|
vector <string> spilt_plate = Utils::splitString(colorplate, ':');
|
||
10 years ago
|
|
||
10 years ago
|
size_t size = spilt_plate.size();
|
||
10 years ago
|
if (size == 2 && spilt_plate[1] != "") {
|
||
|
int diff =
|
||
10 years ago
|
Utils::levenshtein_distance(plateLicense,
|
||
|
spilt_plate[size - 1]);
|
||
10 years ago
|
if (diff < mindiff) mindiff = diff;
|
||
|
}
|
||
|
}
|
||
|
|
||
10 years ago
|
cout << "差距:" << mindiff << "个字符" << endl;
|
||
10 years ago
|
if (mindiff == 0) {
|
||
10 years ago
|
// 完全匹配
|
||
10 years ago
|
match_count++;
|
||
|
}
|
||
|
diff_all = diff_all + mindiff;
|
||
|
} else {
|
||
10 years ago
|
// 单车牌只计算一次diff
|
||
10 years ago
|
for (int j = 0; j < num; j++) {
|
||
|
cout << plateVec[j] << endl;
|
||
|
string colorplate = plateVec[j];
|
||
|
|
||
10 years ago
|
// 计算"蓝牌:苏E7KU22"中冒号后面的车牌大小"
|
||
10 years ago
|
vector <string> spilt_plate = Utils::splitString(colorplate, ':');
|
||
10 years ago
|
|
||
10 years ago
|
size_t size = spilt_plate.size();
|
||
10 years ago
|
if (size == 2 && spilt_plate[1] != "") {
|
||
|
int diff =
|
||
10 years ago
|
Utils::levenshtein_distance(plateLicense,
|
||
|
spilt_plate[size - 1]);
|
||
10 years ago
|
cout << "差距:" << diff << "个字符" << endl;
|
||
10 years ago
|
|
||
|
if (diff == 0) {
|
||
10 years ago
|
// 完全匹配
|
||
10 years ago
|
match_count++;
|
||
|
}
|
||
|
diff_all = diff_all + diff;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
10 years ago
|
cout << "错误码:" << result << endl;
|
||
10 years ago
|
count_err++;
|
||
|
}
|
||
|
count_all++;
|
||
|
}
|
||
|
time(&end);
|
||
|
|
||
|
cout << "------------------" << endl;
|
||
|
cout << "Easypr accuracy test end!" << endl;
|
||
|
cout << "------------------" << endl;
|
||
|
cout << endl;
|
||
10 years ago
|
cout << "统计参数:" << endl;
|
||
|
cout << "总图片数:" << count_all << "张, ";
|
||
|
cout << "未识出图片:" << count_norecogin << "张, ";
|
||
10 years ago
|
|
||
|
float count_recogin = count_all - (count_err + count_norecogin);
|
||
|
float count_rate = count_recogin / count_all;
|
||
10 years ago
|
|
||
10 years ago
|
cout << "定位率:" << count_rate * 100 << "% " << endl;
|
||
10 years ago
|
|
||
|
diff_avg = diff_all / count_recogin;
|
||
|
match_rate = match_count / count_recogin * 100;
|
||
|
|
||
10 years ago
|
cout << "平均字符差距:" << diff_avg << "个, ";
|
||
|
cout << "完全匹配数:" << match_count << "张, ";
|
||
|
cout << "完全匹配率:" << match_rate << "% " << endl;
|
||
10 years ago
|
|
||
|
double seconds = difftime(end, begin);
|
||
|
double avgsec = seconds / double(count_all);
|
||
|
|
||
10 years ago
|
cout << "总时间:" << seconds << "秒, ";
|
||
|
cout << "平均执行时间:" << avgsec << "秒 " << endl;
|
||
10 years ago
|
|
||
|
cout << endl;
|
||
|
|
||
|
cout << "------------------" << endl;
|
||
|
|
||
10 years ago
|
ofstream myfile("accuracy.txt", ios::app | ios::out);
|
||
10 years ago
|
if (myfile.is_open()) {
|
||
|
time_t t = time(0); // get time now
|
||
|
struct tm* now = localtime(&t);
|
||
|
char buf[80];
|
||
|
|
||
|
strftime(buf, sizeof(buf), "%Y-%m-%d %X", now);
|
||
|
myfile << string(buf) << endl;
|
||
|
|
||
10 years ago
|
myfile << "总图片数:" << count_all << "张, ";
|
||
|
myfile << "未识出图片:" << count_norecogin << "张, ";
|
||
|
myfile << "定位率:" << count_rate * 100 << "% " << endl;
|
||
|
myfile << "平均字符差距:" << diff_avg << "个, ";
|
||
|
myfile << "完全匹配数:" << match_count << "张, ";
|
||
|
myfile << "完全匹配率:" << match_rate << "% " << endl;
|
||
|
myfile << "总时间:" << seconds << "秒, ";
|
||
10 years ago
|
myfile << "平均执行时间:" << avgsec << "秒" << endl;
|
||
10 years ago
|
myfile.close();
|
||
|
} else {
|
||
|
cout << "Unable to open file";
|
||
|
}
|
||
|
return 0;
|
||
10 years ago
|
}
|
||
10 years ago
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
#endif //EASYPR_ACCURACY_HPP
|