Changed CPlateJudge to Singleton.

v1.6alpha
Micooz 11 years ago
parent f5f45759e3
commit 8627e66a3a

@ -95,9 +95,6 @@ class CPlateDetect {
//! łľĹĆś¨Îť
CPlateLocate* m_plateLocate;
//! ³µÅÆÅжÏ
CPlateJudge* m_plateJudge;
};
} /*! \namespace easypr*/

@ -1,15 +1,3 @@
//////////////////////////////////////////////////////////////////////////
// Name: plate_judge Header
// Version: 1.1
// Date: 2014-09-28
// MDate: 2015-01-28
// Author: liuruoze
// Copyright: liuruoze
// Reference: Mastering OpenCV with Practical Computer Vision Projects
// Reference: CSDN Bloger taotao1233
// Desciption:
// Defines CPlateLocate
//////////////////////////////////////////////////////////////////////////
#ifndef __PLATE_JUDGE_H__
#define __PLATE_JUDGE_H__
@ -17,16 +5,13 @@
#include "easypr/core/feature.h"
#include "easypr/core/core_func.h"
/*! \namespace easypr
Namespace where all the C++ EasyPR functionality resides
*/
namespace easypr {
class CPlateJudge {
class PlateJudge {
public:
CPlateJudge();
//! 对多幅车牌进行SVM判断
static PlateJudge* instance();
//! 对多幅车牌进行SVM判断
int plateJudge(const std::vector<CPlate>&, std::vector<CPlate>&);
//! 车牌判断
@ -38,28 +23,15 @@ class CPlateJudge {
//! 直方图均衡
Mat histeq(Mat);
//! 装载SVM模型
void LoadModel();
//! 装载SVM模型
void LoadModel(std::string s);
//! 设置与读取模型路径
inline void setModelPath(std::string path) { m_path = path; }
inline std::string getModelPath() const { return m_path; }
private:
//! 使用的SVM模型
cv::Ptr<ml::SVM> svm;
PlateJudge();
static PlateJudge* instance_;
//! EasyPR的getFeatures回调函数
//! 用于从车牌的image生成svm的训练特征features
svmCallback m_getFeatures;
cv::Ptr<ml::SVM> svm_;
//! 模型存储路径
std::string m_path;
};
} /*! \namespace easypr*/
}
#endif /* endif __PLATE_JUDGE_H__ */
#endif

@ -5,15 +5,12 @@ namespace easypr {
CPlateDetect::CPlateDetect() {
m_plateLocate = new CPlateLocate();
m_plateJudge = new CPlateJudge();
// 默认EasyPR在一幅图中定位最多3个车
m_maxPlates = 3;
}
CPlateDetect::~CPlateDetect() {
SAFE_RELEASE(m_plateLocate);
SAFE_RELEASE(m_plateJudge);
}
int CPlateDetect::plateDetect(Mat src, std::vector<CPlate>& resultVec,
@ -31,7 +28,7 @@ int CPlateDetect::plateDetect(Mat src, std::vector<CPlate>& resultVec,
const int color_find_max = m_maxPlates;
m_plateLocate->plateColorLocate(src, color_Plates, index);
m_plateJudge->plateJudge(color_Plates, color_result_Plates);
PlateJudge::instance()->plateJudge(color_Plates, color_result_Plates);
for (size_t i = 0; i < color_result_Plates.size(); i++) {
CPlate plate = color_result_Plates[i];
@ -43,7 +40,7 @@ int CPlateDetect::plateDetect(Mat src, std::vector<CPlate>& resultVec,
//颜色和边界闭操作同时采用
{
m_plateLocate->plateSobelLocate(src, sobel_Plates, index);
m_plateJudge->plateJudge(sobel_Plates, sobel_result_Plates);
PlateJudge::instance()->plateJudge(sobel_Plates, sobel_result_Plates);
for (size_t i = 0; i < sobel_result_Plates.size(); i++) {
CPlate plate = sobel_result_Plates[i];

@ -2,102 +2,96 @@
/*! \namespace easypr
Namespace where all the C++ EasyPR functionality resides
*/
*/
namespace easypr {
CPlateJudge::CPlateJudge() {
// cout << "CPlateJudge" << endl;
m_path = "resources/model/svm.xml";
m_getFeatures = getHistogramFeatures;
LoadModel();
}
void CPlateJudge::LoadModel() {
svm.clear();
svm.load(m_path.c_str(), "svm");
}
void CPlateJudge::LoadModel(string s) {
svm.clear();
svm.load(s.c_str(), "svm");
}
//! 直方图均衡
Mat CPlateJudge::histeq(Mat in) {
Mat out(in.size(), in.type());
if (in.channels() == 3) {
Mat hsv;
vector<Mat> hsvSplit;
cvtColor(in, hsv, CV_BGR2HSV);
split(hsv, hsvSplit);
equalizeHist(hsvSplit[2], hsvSplit[2]);
merge(hsvSplit, hsv);
cvtColor(hsv, out, CV_HSV2BGR);
} else if (in.channels() == 1) {
equalizeHist(in, out);
PlateJudge* PlateJudge::instance_ = nullptr;
PlateJudge* PlateJudge::instance(){
if (!instance_){
instance_ = new PlateJudge;
}
return instance_;
}
return out;
}
//! 对单幅图像进行SVM判断
int CPlateJudge::plateJudge(const Mat& inMat, int& result) {
if (m_getFeatures == NULL) return -1;
PlateJudge::PlateJudge() {
svm_ = ml::SVM::load<ml::SVM>("resources/model/svm.xml");
}
//! 直方图均衡
Mat PlateJudge::histeq(Mat in) {
Mat out(in.size(), in.type());
if (in.channels() == 3) {
Mat hsv;
std::vector<Mat> hsvSplit;
cvtColor(in, hsv, CV_BGR2HSV);
split(hsv, hsvSplit);
equalizeHist(hsvSplit[2], hsvSplit[2]);
merge(hsvSplit, hsv);
cvtColor(hsv, out, CV_HSV2BGR);
}
else if (in.channels() == 1) {
equalizeHist(in, out);
}
return out;
}
Mat features;
m_getFeatures(inMat, features);
//! 对单幅图像进行SVM判断
int PlateJudge::plateJudge(const Mat& inMat, int& result) {
Mat features;
getHistogramFeatures(inMat, features);
//通过直方图均衡化后的彩色图进行预测
Mat p = features.reshape(1, 1);
p.convertTo(p, CV_32FC1);
//通过直方图均衡化后的彩色图进行预测
Mat p = features.reshape(1, 1);
p.convertTo(p, CV_32FC1);
float response = svm.predict(p);
result = (int)response;
float response = svm_->predict(p);
result = (int)response;
return 0;
}
return 0;
}
//! 对多幅图像进行SVM判断
int CPlateJudge::plateJudge(const vector<Mat>& inVec, vector<Mat>& resultVec) {
int num = inVec.size();
for (int j = 0; j < num; j++) {
Mat inMat = inVec[j];
//! 对多幅图像进行SVM判断
int PlateJudge::plateJudge(const std::vector<Mat>& inVec, std::vector<Mat>& resultVec) {
int num = inVec.size();
for (int j = 0; j < num; j++) {
Mat inMat = inVec[j];
int response = -1;
plateJudge(inMat, response);
int response = -1;
plateJudge(inMat, response);
if (response == 1) resultVec.push_back(inMat);
if (response == 1) resultVec.push_back(inMat);
}
return 0;
}
return 0;
}
//! 对多幅车牌进行SVM判断
int CPlateJudge::plateJudge(const vector<CPlate>& inVec,
vector<CPlate>& resultVec) {
int num = inVec.size();
for (int j = 0; j < num; j++) {
CPlate inPlate = inVec[j];
Mat inMat = inPlate.getPlateMat();
int response = -1;
plateJudge(inMat, response);
if (response == 1)
resultVec.push_back(inPlate);
else {
int w = inMat.cols;
int h = inMat.rows;
//再取中间部分判断一次
Mat tmpmat = inMat(Rect_<double>(w * 0.05, h * 0.1, w * 0.9, h * 0.8));
Mat tmpDes = inMat.clone();
resize(tmpmat, tmpDes, Size(inMat.size()));
plateJudge(tmpDes, response);
if (response == 1) resultVec.push_back(inPlate);
//! 对多幅车牌进行SVM判断
int PlateJudge::plateJudge(const std::vector<CPlate>& inVec,
std::vector<CPlate>& resultVec) {
int num = inVec.size();
for (int j = 0; j < num; j++) {
CPlate inPlate = inVec[j];
Mat inMat = inPlate.getPlateMat();
int response = -1;
plateJudge(inMat, response);
if (response == 1)
resultVec.push_back(inPlate);
else {
int w = inMat.cols;
int h = inMat.rows;
//再取中间部分判断一次
Mat tmpmat = inMat(Rect_<double>(w * 0.05, h * 0.1, w * 0.9, h * 0.8));
Mat tmpDes = inMat.clone();
resize(tmpmat, tmpDes, Size(inMat.size()));
plateJudge(tmpDes, response);
if (response == 1) resultVec.push_back(inPlate);
}
}
return 0;
}
return 0;
}
} /*! \namespace easypr*/

@ -137,9 +137,6 @@ void tag_data(const char* source_folder, const char* has_plate_folder,
}
CPlateLocate locator;
CPlateJudge judger;
judger.LoadModel(svm_model);
for (auto f : files) {
auto filename = Utils::getFileName(f);
@ -156,7 +153,7 @@ void tag_data(const char* source_folder, const char* has_plate_folder,
for (auto plate : maybe_plates) {
char save_to[255] = {0};
int result = 0;
judger.plateJudge(plate, result);
PlateJudge::instance()->plateJudge(plate, result);
if (result == 1) {
// it's a plate
sprintf(save_to, "%s/%s_%d.jpg",

Loading…
Cancel
Save