Reformat all source and header files using Clang-Format [Google].

v1.6alpha
Micooz 11 years ago
parent d6ad832d50
commit 32b0560872

@ -12,7 +12,7 @@ namespace easypr {
namespace api {
static bool plate_judge(const char* image,const char *model) {
static bool plate_judge(const char* image, const char* model) {
cv::Mat src = cv::imread(image);
assert(!src.empty());
@ -62,10 +62,7 @@ static Color get_plate_color(const char* image) {
return getPlateType(img, true);
}
}
}
#endif //EASYPR_API_HPP
#endif // EASYPR_API_HPP

@ -1,5 +1,5 @@
#ifndef __CHARS_IDENTIFY_H__
#define __CHARS_IDENTIFY_H__
#ifndef EASYPR_CORE_CHARSIDENTIFY_H_
#define EASYPR_CORE_CHARSIDENTIFY_H_
#include <opencv2/opencv.hpp>
@ -7,18 +7,16 @@ namespace easypr {
class CharsIdentify {
public:
static CharsIdentify* instance();
static CharsIdentify* instance();
std::pair<std::string, std::string> identify(cv::Mat input);
std::pair<std::string, std::string> identify(cv::Mat input);
private:
CharsIdentify();
CharsIdentify();
static CharsIdentify* instance_;
//使用的ANN模型
cv::Ptr<cv::ml::ANN_MLP> ann_;
static CharsIdentify* instance_;
cv::Ptr<cv::ml::ANN_MLP> ann_;
};
}
#endif
#endif // EASYPR_CORE_CHARSIDENTIFY_H_

@ -9,8 +9,8 @@
// Desciption:
// Defines CCharsRecognise
//////////////////////////////////////////////////////////////////////////
#ifndef __CHARS_RECOGNISE_H__
#define __CHARS_RECOGNISE_H__
#ifndef EASYPR_CORE_CHARSRECOGNISE_H_
#define EASYPR_CORE_CHARSRECOGNISE_H_
#include "easypr/core/chars_segment.h"
#include "easypr/core/chars_identify.h"
@ -61,4 +61,4 @@ class CCharsRecognise {
} /* \namespace easypr */
#endif /* endif __CHARS_RECOGNISE_H__ */
#endif // EASYPR_CORE_CHARSRECOGNISE_H_

@ -9,8 +9,8 @@
// Desciption:
// Defines CCharsSegment
//////////////////////////////////////////////////////////////////////////
#ifndef __CHARS_SEGMENT_H__
#define __CHARS_SEGMENT_H__
#ifndef EASYPR_CORE_CHARSSEGMENT_H_
#define EASYPR_CORE_CHARSSEGMENT_H_
#include "easypr/core/core_func.h"
@ -93,4 +93,4 @@ class CCharsSegment {
} /* \namespace easypr */
#endif /* endif __CHARS_SEGMENT_H__ */
#endif // EASYPR_CORE_CHARSSEGMENT_H_

@ -1,5 +1,5 @@
#ifndef __CORE_FUNC_H__
#define __CORE_FUNC_H__
#ifndef EASYPR_CORE_COREFUNC_H_
#define EASYPR_CORE_COREFUNC_H_
#include <opencv2/opencv.hpp>
@ -10,47 +10,46 @@ Namespace where all the C++ EasyPR functionality resides
*/
namespace easypr {
enum Color { BLUE, YELLOW, WHITE, UNKNOWN };
enum Color { BLUE, YELLOW, WHITE, UNKNOWN };
enum LocateType { SOBEL, COLOR, OTHER };
enum LocateType { SOBEL, COLOR, OTHER };
//! 根据一幅图像与颜色模板获取对应的二值图
//! 输入RGB图像, 颜色模板(蓝色、黄色)
//! 输出灰度图只有0和255两个值255代表匹配0代表不匹配
Mat colorMatch(const Mat& src, Mat& match, const Color r,
const bool adaptive_minsv);
//! 根据一幅图像与颜色模板获取对应的二值图
//! 输入RGB图像, 颜色模板(蓝色、黄色)
//! 输出灰度图只有0和255两个值255代表匹配0代表不匹配
Mat colorMatch(const Mat& src, Mat& match, const Color r,
const bool adaptive_minsv);
//! 判断一个车牌的颜色
//! 输入车牌mat与颜色模板
//! 返回true或fasle
bool plateColorJudge(const Mat& src, const Color r, const bool adaptive_minsv,
float& percent);
//! 判断一个车牌的颜色
//! 输入车牌mat与颜色模板
//! 返回true或fasle
bool plateColorJudge(const Mat& src, const Color r, const bool adaptive_minsv,
float& percent);
bool bFindLeftRightBound(Mat& bound_threshold, int& posLeft, int& posRight);
bool bFindLeftRightBound1(Mat& bound_threshold, int& posLeft, int& posRight);
bool bFindLeftRightBound2(Mat& bound_threshold, int& posLeft, int& posRight);
bool bFindLeftRightBound(Mat& bound_threshold, int& posLeft, int& posRight);
bool bFindLeftRightBound1(Mat& bound_threshold, int& posLeft, int& posRight);
bool bFindLeftRightBound2(Mat& bound_threshold, int& posLeft, int& posRight);
//去除车牌上方的钮钉
//计算每行元素的阶跃数如果小于X认为是柳丁将此行全部填0涂黑
// X的推荐值为可根据实际调整
bool clearLiuDing(Mat& img);
void clearLiuDingOnly(Mat& img);
void clearLiuDing(Mat mask, int& top, int& bottom);
//去除车牌上方的钮钉
//计算每行元素的阶跃数如果小于X认为是柳丁将此行全部填0涂黑
// X的推荐值为可根据实际调整
bool clearLiuDing(Mat& img);
void clearLiuDingOnly(Mat& img);
void clearLiuDing(Mat mask, int& top, int& bottom);
//! 获得车牌颜色
Color getPlateType(const Mat& src, const bool adaptive_minsv);
//! 获得车牌颜色
Color getPlateType(const Mat& src, const bool adaptive_minsv);
//! 直方图均衡
Mat histeq(Mat in);
Mat features(Mat in, int sizeData);
Rect GetCenterRect(Mat& in);
Mat CutTheRect(Mat& in, Rect& rect);
int ThresholdOtsu(Mat mat);
//! 直方图均衡
Mat histeq(Mat in);
Mat features(Mat in, int sizeData);
Rect GetCenterRect(Mat& in);
Mat CutTheRect(Mat& in, Rect& rect);
int ThresholdOtsu(Mat mat);
//! 获取垂直和水平方向直方图
Mat ProjectedHistogram(Mat img, int t);
//! 获取垂直和水平方向直方图
Mat ProjectedHistogram(Mat img, int t);
} /*! \namespace easypr*/
#endif
/* endif __CORE_FUNC_H__ */
#endif // EASYPR_CORE_COREFUNC_H_

@ -1,31 +1,30 @@
#ifndef __FEATURE_H__
#define __FEATURE_H__
#ifndef EASYPR_CORE_FEATURE_H_
#define EASYPR_CORE_FEATURE_H_
#include <opencv2/opencv.hpp>
namespace easypr {
//! 获得车牌的特征数
cv::Mat getTheFeatures(cv::Mat in);
//! 获得车牌的特征数
cv::Mat getTheFeatures(cv::Mat in);
//! EasyPR的getFeatures回调函数
//! 用于从车牌的image生成svm的训练特征features
typedef void(*svmCallback)(const cv::Mat& image, cv::Mat& features);
//! EasyPR的getFeatures回调函数
//! 用于从车牌的image生成svm的训练特征features
typedef void (*svmCallback)(const cv::Mat& image, cv::Mat& features);
//! EasyPR的getFeatures回调函数
//! 本函数是获取垂直和水平的直方图图值
void getHistogramFeatures(const cv::Mat& image, cv::Mat& features);
//! EasyPR的getFeatures回调函数
//! 本函数是获取垂直和水平的直方图图值
void getHistogramFeatures(const cv::Mat& image, cv::Mat& features);
//! 本函数是获取SIFT特征子
void getSIFTFeatures(const cv::Mat& image, cv::Mat& features);
//! 本函数是获取SIFT特征子
void getSIFTFeatures(const cv::Mat& image, cv::Mat& features);
//! 本函数是获取HOG特征子
void getHOGFeatures(const cv::Mat& image, cv::Mat& features);
//! 本函数是获取HOG特征子
void getHOGFeatures(const cv::Mat& image, cv::Mat& features);
//! 本函数是获取HSV空间量化的直方图特征子
void getHSVHistFeatures(const cv::Mat& image, cv::Mat& features);
//! 本函数是获取HSV空间量化的直方图特征子
void getHSVHistFeatures(const cv::Mat& image, cv::Mat& features);
} /*! \namespace easypr*/
} /*! \namespace easypr*/
#endif
/* endif __FEATURE_H__ */
#endif // EASYPR_CORE_FEATURE_H_

@ -7,8 +7,8 @@
// Desciption:
// An abstract class for car plate.
//////////////////////////////////////////////////////////////////////////
#ifndef __PLATE_H__
#define __PLATE_H__
#ifndef EASYPR_CORE_PLATE_H_
#define EASYPR_CORE_PLATE_H_
#include "core_func.h"
@ -17,40 +17,40 @@ Namespace where all the C++ EasyPR functionality resides
*/
namespace easypr {
class CPlate {
public:
bool bColored;
class CPlate {
public:
bool bColored;
//! 构造函数
CPlate();
//! 构造函数
CPlate();
//! 设置与读取变量
inline void setPlateMat(Mat param) { m_plateMat = param; }
inline Mat getPlateMat() const { return m_plateMat; }
//! 设置与读取变量
inline void setPlateMat(Mat param) { m_plateMat = param; }
inline Mat getPlateMat() const { return m_plateMat; }
inline void setPlatePos(RotatedRect param) { m_platePos = param; }
inline RotatedRect getPlatePos() const { return m_platePos; }
inline void setPlatePos(RotatedRect param) { m_platePos = param; }
inline RotatedRect getPlatePos() const { return m_platePos; }
inline void setPlateStr(String param) { m_plateStr = param; }
inline String getPlateStr() const { return m_plateStr; }
inline void setPlateStr(String param) { m_plateStr = param; }
inline String getPlateStr() const { return m_plateStr; }
inline void setPlateLocateType(LocateType param) { m_locateType = param; }
inline LocateType getPlateLocateType() const { return m_locateType; }
inline void setPlateLocateType(LocateType param) { m_locateType = param; }
inline LocateType getPlateLocateType() const { return m_locateType; }
private:
//! 车牌的图块
Mat m_plateMat;
private:
//! 车牌的图块
Mat m_plateMat;
//! 车牌在原图的位置
RotatedRect m_platePos;
//! 车牌在原图的位置
RotatedRect m_platePos;
//! 车牌字符串
String m_plateStr;
//! 车牌字符串
String m_plateStr;
//! 车牌定位的方法
LocateType m_locateType;
};
//! 车牌定位的方法
LocateType m_locateType;
};
} /*! \namespace easypr*/
#endif /* endif __PLATE_H__ */
#endif // EASYPR_CORE_PLATE_H_

@ -10,8 +10,8 @@
// Desciption:
// Defines CPlateDetect
//////////////////////////////////////////////////////////////////////////
#ifndef __PLATE_DETECT_H__
#define __PLATE_DETECT_H__
#ifndef EASYPR_CORE_PLATEDETECT_H_
#define EASYPR_CORE_PLATEDETECT_H_
#include "easypr/core/plate_locate.h"
#include "easypr/core/plate_judge.h"
@ -99,4 +99,4 @@ class CPlateDetect {
} /*! \namespace easypr*/
#endif /* endif __PLATE_DETECT_H__ */
#endif // EASYPR_CORE_PLATEDETECT_H_

@ -1,5 +1,5 @@
#ifndef __PLATE_JUDGE_H__
#define __PLATE_JUDGE_H__
#ifndef EASYPR_CORE_PLATEJUDGE_H_
#define EASYPR_CORE_PLATEJUDGE_H_
#include "easypr/core/plate.h"
#include "easypr/core/feature.h"
@ -10,8 +10,8 @@ namespace easypr {
class PlateJudge {
public:
static PlateJudge* instance();
//! 对多幅车牌进行SVM判断
//! 对多幅车牌进行SVM判断
int plateJudge(const std::vector<CPlate>&, std::vector<CPlate>&);
//! ³µÅÆÅжÏ
@ -26,9 +26,7 @@ class PlateJudge {
static PlateJudge* instance_;
cv::Ptr<ml::SVM> svm_;
};
}
#endif
#endif // EASYPR_CORE_PLATEJUDGE_H_

@ -11,8 +11,8 @@
// Desciption:
// Defines CPlateLocate
//////////////////////////////////////////////////////////////////////////
#ifndef __PLATE_LOCATE_H__
#define __PLATE_LOCATE_H__
#ifndef EASYPR_CORE_PLATELOCATE_H_
#define EASYPR_CORE_PLATELOCATE_H_
#include "easypr/core/plate.h"
#include "easypr/core/core_func.h"
@ -38,8 +38,8 @@ class CPlateLocate {
std::vector<RotatedRect>& outRects);
//! 抗扭斜处理
int deskew(const Mat& src, const Mat& src_b, std::vector<RotatedRect>& inRects,
std::vector<CPlate>& outPlates);
int deskew(const Mat& src, const Mat& src_b,
std::vector<RotatedRect>& inRects, std::vector<CPlate>& outPlates);
//! 是否偏斜
//! 输入二值化图像,输出判断结果
@ -127,7 +127,7 @@ class CPlateLocate {
static const int TYPE = CV_8UC3;
//! verifySize所用常量
static const int DEFAULT_VERIFY_MIN = 1; // 3
static const int DEFAULT_VERIFY_MIN = 1; // 3
static const int DEFAULT_VERIFY_MAX = 24; // 20
//! 角度判断所用常量
@ -159,4 +159,4 @@ class CPlateLocate {
} /*! \namespace easypr*/
#endif /* endif __PLATE_LOCATE_H__ */
#endif // EASYPR_CORE_PLATELOCATE_H_

@ -9,8 +9,8 @@
// Desciption:
// Defines CPlateRecognize
//////////////////////////////////////////////////////////////////////////
#ifndef __PLATE_RECOGNIZE_H__
#define __PLATE_RECOGNIZE_H__
#ifndef EASYPR_CORE_PLATERECOGNIZE_H_
#define EASYPR_CORE_PLATERECOGNIZE_H_
#include "easypr/core/plate_detect.h"
#include "easypr/core/chars_recognise.h"
@ -31,11 +31,9 @@ class CPlateRecognize : public CPlateDetect, public CCharsRecognise {
inline void setLifemode(bool param) { CPlateDetect::setPDLifemode(param); }
//! 是否开启调试模式
inline void setDebug(bool param) {
CPlateDetect::setPDDebug(param);
}
inline void setDebug(bool param) { CPlateDetect::setPDDebug(param); }
};
} /* \namespace easypr */
#endif /* endif __PLATE_RECOGNITION_H__ */
#endif // EASYPR_CORE_PLATERECOGNIZE_H_

@ -7,8 +7,8 @@
// 在发布数据到general_test数据集里请先用这里的方法对图像进行处理
// EasyPR开源项目非常注重保护图片中驾驶人的隐私
#ifndef EASYPR_DEFACE_H
#define EASYPR_DEFACE_H
#ifndef EASYPR_CORE_DEFACE_H_
#define EASYPR_CORE_DEFACE_H_
#include <opencv2/opencv.hpp>
@ -20,10 +20,7 @@ int deface();
cv::Mat detectAndMaskFace(cv::Mat& img, cv::CascadeClassifier& cascade,
double scale);
}
}
#endif //EASYPR_DEFACE_H
#endif // EASYPR_CORE_DEFACE_H_

@ -2,22 +2,20 @@
// 在捐赠数据到GDTS数据集里请先用这里的方法对图像进行预处理
// EasyPR开源项目非常注重保护原始图片的版权
// 所有的捐赠数据通过GDSL协议进行约定保证使用人仅用于非商业性目的
#ifndef EASYPR_GDTS_H
#define EASYPR_GDTS_H
#ifndef EASYPR_CORE_GDTS_H_
#define EASYPR_CORE_GDTS_H_
#include <opencv2/opencv.hpp>
namespace easypr {
namespace preprocess {
namespace preprocess {
// EasyPR的图像预处理函数进行模糊化与裁剪化处理
cv::Mat imageProcess(cv::Mat src);
int generate_gdts();
}
// EasyPR的图像预处理函数进行模糊化与裁剪化处理
cv::Mat imageProcess(cv::Mat src);
int generate_gdts();
}
}
#endif //EASYPR_GDTS_H
#endif // EASYPR_CORE_GDTS_H_

@ -1,17 +1,21 @@
// learn data_prepare :
// 生成learn data的cpplearn data指的是train dataverify data test data的总和这个名字是我起的。
// learn data应该是贴好标签的数据因此即便通过EasyPR自动化处理以后也要人为的修正一下.
// 生成learn data的cpplearn data指的是train dataverify data test
// data的总和这个名字是我起的。
// learn
// data应该是贴好标签的数据因此即便通过EasyPR自动化处理以后也要人为的修正一下.
// 你应该按照如下的步骤和顺序组织learn data
// 1.用EasyPR对not label data进行处理通过EasyPR辅助来对车牌图片进行标签放到不同文件夹下
// 1.用EasyPR对not label
// data进行处理通过EasyPR辅助来对车牌图片进行标签放到不同文件夹下
// 2.标签分两种,一种是有车牌的,一种是无车牌的;
// 2.EasyPR生成标签以后你还得需要肉眼确认下将被不正确标签的数据转移到它们该去的文件夹下
// 3.通过上面的步骤正确的车牌图片和非车牌图片已经被分别放到两个文件下假设是hasplate和noplate
// 4.将这两个文件夹放到EasyPR目录train/data/plate_detect_svm/learn下面
// 5.运行EasyPR选择“训练”目录下的“车牌检测not divide这个程序会自动把learn data分块训练测试
// 5.运行EasyPR选择“训练”目录下的“车牌检测not
// divide这个程序会自动把learn data分块训练测试
#ifndef EASYPR_MC_DATA_H
#define EASYPR_MC_DATA_H
#ifndef EASYPR_CORE_MCDATA_H_
#define EASYPR_CORE_MCDATA_H_
#include <string>
@ -24,9 +28,7 @@ void create_learn_data(const char* raw_data_folder, const char* out_data_folder,
void tag_data(const char* source_folder, const char* has_plate_folder,
const char* no_plate_folder, const char* svm_model);
}
}
#endif //EASYPR_MC_DATA_H
#endif // EASYPR_CORE_MCDATA_H_

@ -5,22 +5,21 @@
namespace easypr {
class AnnTrain: public ITrain {
class AnnTrain : public ITrain {
public:
explicit AnnTrain(const char* chars_folder, const char* xml);
explicit AnnTrain(const char* chars_folder, const char* xml);
virtual void train();
virtual void train();
virtual void test();
virtual void test();
private:
virtual cv::Ptr<cv::ml::TrainData> tdata();
virtual cv::Ptr<cv::ml::TrainData> tdata();
cv::Ptr<cv::ml::ANN_MLP> ann_;
const char* ann_xml_;
const char* chars_folder_;
cv::Ptr<cv::ml::ANN_MLP> ann_;
const char* ann_xml_;
const char* chars_folder_;
};
}
#endif // EASYPR_TRAIN_ANNTRAIN_H_
#endif // EASYPR_TRAIN_ANNTRAIN_H_

@ -9,29 +9,28 @@ namespace easypr {
class SvmTrain : public ITrain {
public:
typedef struct {
std::string file;
SvmLabel label;
} TrainItem;
typedef struct {
std::string file;
SvmLabel label;
} TrainItem;
SvmTrain(const char* plates_folder, const char* xml);
SvmTrain(const char* plates_folder, const char* xml);
virtual void train();
virtual void train();
virtual void test();
virtual void test();
private:
void prepare();
void prepare();
virtual cv::Ptr<cv::ml::TrainData> tdata();
virtual cv::Ptr<cv::ml::TrainData> tdata();
cv::Ptr<cv::ml::SVM> svm_;
const char* plates_folder_;
const char* svm_xml_;
std::vector<TrainItem> train_file_list_;
std::vector<TrainItem> test_file_list_;
cv::Ptr<cv::ml::SVM> svm_;
const char* plates_folder_;
const char* svm_xml_;
std::vector<TrainItem> train_file_list_;
std::vector<TrainItem> test_file_list_;
};
}
#endif // EASYPR_TRAIN_SVMTRAIN_H_
#endif // EASYPR_TRAIN_SVMTRAIN_H_

@ -7,17 +7,17 @@ namespace easypr {
class ITrain {
public:
ITrain();
ITrain();
virtual ~ITrain();
virtual ~ITrain();
virtual void train() = 0;
virtual void train() = 0;
virtual void test() = 0;
virtual void test() = 0;
private:
virtual cv::Ptr<cv::ml::TrainData> tdata() = 0;
virtual cv::Ptr<cv::ml::TrainData> tdata() = 0;
};
}
#endif // EASYPR_TRAIN_TRAIN_H_
#endif // EASYPR_TRAIN_TRAIN_H_

@ -30,9 +30,7 @@ class Row {
public:
Row();
enum Field {
kShort, kLong, kDefault, kDescription
};
enum Field { kShort, kLong, kDefault, kDescription };
typedef std::initializer_list<Field> Order;
@ -232,7 +230,7 @@ class ParseItem {
/*
* dynamic type cast, support base data types including std::string
*/
template<typename T>
template <typename T>
T as() {
T r;
std::stringstream buf;
@ -334,7 +332,7 @@ class Parser {
ParseItem* get(const std::string& key);
inline void set_usage_subroutines(
const Generator::SubroutineCollection* subroutines) {
const Generator::SubroutineCollection* subroutines) {
subroutines_ = subroutines;
}
@ -353,8 +351,6 @@ class Parser {
ParameterList args_;
ParseResult* pr_;
};
}
#endif // UTIL_PROGRAM_OPTIONS_H
#endif // UTIL_PROGRAM_OPTIONS_H

@ -1,5 +1,5 @@
#ifndef EASYPR_UTIL_H_
#define EASYPR_UTIL_H_
#ifndef EASYPR_UTIL_UTIL_H_
#define EASYPR_UTIL_UTIL_H_
#include <iostream>
#include <string>
@ -116,4 +116,4 @@ typedef Utils utils;
} // namespace easypr
#endif // EASYPR_UTIL_H_
#endif // EASYPR_UTIL_UTIL_H_

@ -5,28 +5,27 @@
namespace easypr {
CharsIdentify* CharsIdentify::instance_ = nullptr;
CharsIdentify* CharsIdentify::instance_ = nullptr;
CharsIdentify* CharsIdentify::instance(){
if (!instance_){
instance_ = new CharsIdentify;
}
return instance_;
CharsIdentify* CharsIdentify::instance() {
if (!instance_) {
instance_ = new CharsIdentify;
}
return instance_;
}
CharsIdentify::CharsIdentify() {
ann_ = ml::ANN_MLP::load<ml::ANN_MLP>(kDefaultAnnPath);
}
CharsIdentify::CharsIdentify() {
ann_ = ml::ANN_MLP::load<ml::ANN_MLP>(kDefaultAnnPath);
}
std::pair<std::string, std::string> CharsIdentify::identify(cv::Mat input){
cv::Mat feature = features(input, kPredictSize);
auto index = static_cast<int>(ann_->predict(feature));
if (index < 34){
return std::make_pair(kChars[index], kChars[index]);
} else {
const char* key = kChars[index];
return std::make_pair(key, kCharsMap.at(key));
}
std::pair<std::string, std::string> CharsIdentify::identify(cv::Mat input) {
cv::Mat feature = features(input, kPredictSize);
auto index = static_cast<int>(ann_->predict(feature));
if (index < 34) {
return std::make_pair(kChars[index], kChars[index]);
} else {
const char* key = kChars[index];
return std::make_pair(key, kCharsMap.at(key));
}
}
}

@ -3,27 +3,21 @@
namespace easypr {
CCharsRecognise::CCharsRecognise() {
m_charsSegment = new CCharsSegment();
}
CCharsRecognise::CCharsRecognise() { m_charsSegment = new CCharsSegment(); }
CCharsRecognise::~CCharsRecognise() {
SAFE_RELEASE(m_charsSegment);
}
CCharsRecognise::~CCharsRecognise() { SAFE_RELEASE(m_charsSegment); }
std::string CCharsRecognise::charsRecognise(Mat plate) {
//³µÅÆ×Ö·û·½¿é¼¯ºÏ
std::vector<Mat> matChars;
std::string license;
std::string CCharsRecognise::charsRecognise(Mat plate) {
std::vector<Mat> matChars;
std::string license;
int result = m_charsSegment->charsSegment(plate, matChars);
if (result == 0) {
for(auto block : matChars){
auto character = CharsIdentify::instance()->identify(block);
license.append(character.second);
}
int result = m_charsSegment->charsSegment(plate, matChars);
if (result == 0) {
for (auto block : matChars) {
auto character = CharsIdentify::instance()->identify(block);
license.append(character.second);
}
return license;
}
return license;
}
}

@ -71,10 +71,8 @@ Mat CCharsSegment::preprocessChar(Mat in) {
return out;
}
//! 字符分割与排序
int CCharsSegment::charsSegment(Mat input, vector<Mat>& resultVec) {
if (!input.data) return 0x01;
int w = input.cols;
@ -167,7 +165,8 @@ int CCharsSegment::charsSegment(Mat input, vector<Mat>& resultVec) {
// 对符合尺寸的图块按照从左到右进行排序;
// 直接使用stl的sort方法更有效率
vector<Rect> sortedRect(vecRect);
std::sort(sortedRect.begin(), sortedRect.end(),[](const Rect& r1, const Rect& r2) { return r1.x < r2.x; });
std::sort(sortedRect.begin(), sortedRect.end(),
[](const Rect& r1, const Rect& r2) { return r1.x < r2.x; });
size_t specIndex = 0;
@ -196,30 +195,26 @@ int CCharsSegment::charsSegment(Mat input, vector<Mat>& resultVec) {
for (size_t i = 0; i < newSortedRect.size(); i++) {
Rect mr = newSortedRect[i];
//Mat auxRoi(img_threshold, mr);
// Mat auxRoi(img_threshold, mr);
// 使用灰度图来截取图块,然后依次对每个图块进行大津阈值来二值化
Mat auxRoi(input_grey, mr);
Mat newRoi;
if (BLUE == plateType) {
/* img_threshold = auxRoi.clone();
int w = input_grey.cols;
int h = input_grey.rows;
Mat tmp = input_grey(Rect_<double>(w * 0.1, h * 0.1, w * 0.8, h * 0.8));
int threadHoldV = ThresholdOtsu(tmp);*/
/* img_threshold = auxRoi.clone();
int w = input_grey.cols;
int h = input_grey.rows;
Mat tmp = input_grey(Rect_<double>(w * 0.1, h * 0.1, w * 0.8, h * 0.8));
int threadHoldV = ThresholdOtsu(tmp);*/
threshold(auxRoi, newRoi, 5, 255, CV_THRESH_BINARY + CV_THRESH_OTSU);
}
else if (YELLOW == plateType) {
} else if (YELLOW == plateType) {
threshold(auxRoi, newRoi, 5, 255, CV_THRESH_BINARY_INV + CV_THRESH_OTSU);
}
else if (WHITE == plateType) {
} else if (WHITE == plateType) {
threshold(auxRoi, newRoi, 5, 255, CV_THRESH_OTSU + CV_THRESH_BINARY_INV);
}
else {
} else {
threshold(auxRoi, newRoi, 5, 255, CV_THRESH_OTSU + CV_THRESH_BINARY);
}

File diff suppressed because it is too large Load Diff

@ -10,64 +10,64 @@ Namespace where all the C++ EasyPR functionality resides
*/
namespace easypr {
//! 获取垂直和水平的直方图图值
Mat getTheFeatures(Mat in) {
const int VERTICAL = 0;
const int HORIZONTAL = 1;
//! 获取垂直和水平的直方图图值
Mat getTheFeatures(Mat in) {
const int VERTICAL = 0;
const int HORIZONTAL = 1;
// Histogram features
Mat vhist = ProjectedHistogram(in, VERTICAL);
Mat hhist = ProjectedHistogram(in, HORIZONTAL);
// Histogram features
Mat vhist = ProjectedHistogram(in, VERTICAL);
Mat hhist = ProjectedHistogram(in, HORIZONTAL);
// Last 10 is the number of moments components
int numCols = vhist.cols + hhist.cols;
// Last 10 is the number of moments components
int numCols = vhist.cols + hhist.cols;
Mat out = Mat::zeros(1, numCols, CV_32F);
Mat out = Mat::zeros(1, numCols, CV_32F);
// Asign values to feature,样本特征为水平、垂直直方图
int j = 0;
for (int i = 0; i < vhist.cols; i++) {
out.at<float>(j) = vhist.at<float>(i);
j++;
}
for (int i = 0; i < hhist.cols; i++) {
out.at<float>(j) = hhist.at<float>(i);
j++;
}
return out;
// Asign values to feature,样本特征为水平、垂直直方图
int j = 0;
for (int i = 0; i < vhist.cols; i++) {
out.at<float>(j) = vhist.at<float>(i);
j++;
}
for (int i = 0; i < hhist.cols; i++) {
out.at<float>(j) = hhist.at<float>(i);
j++;
}
//! EasyPR的getFeatures回调函数
//! 本函数是获取垂直和水平的直方图图值
void getHistogramFeatures(const Mat& image, Mat& features) {
Mat grayImage;
cvtColor(image, grayImage, CV_RGB2GRAY);
return out;
}
// grayImage = histeq(grayImage);
//! EasyPR的getFeatures回调函数
//! 本函数是获取垂直和水平的直方图图值
void getHistogramFeatures(const Mat& image, Mat& features) {
Mat grayImage;
cvtColor(image, grayImage, CV_RGB2GRAY);
Mat img_threshold;
threshold(grayImage, img_threshold, 0, 255,
CV_THRESH_OTSU + CV_THRESH_BINARY);
features = getTheFeatures(img_threshold);
}
// grayImage = histeq(grayImage);
//! EasyPR的getFeatures回调函数
//! 本函数是获取SITF特征子
void getSIFTFeatures(const Mat& image, Mat& features) {
//待完善
}
Mat img_threshold;
threshold(grayImage, img_threshold, 0, 255,
CV_THRESH_OTSU + CV_THRESH_BINARY);
features = getTheFeatures(img_threshold);
}
//! EasyPR的getFeatures回调函数
//! 本函数是获取HOG特征子
void getHOGFeatures(const Mat& image, Mat& features) {
//待完善
}
//! EasyPR的getFeatures回调函数
//! 本函数是获取SITF特征子
void getSIFTFeatures(const Mat& image, Mat& features) {
//待完善
}
//! EasyPR的getFeatures回调函数
//! 本函数是获取HSV空间量化的直方图特征子
void getHSVHistFeatures(const Mat& image, Mat& features) {
// TODO
}
//! EasyPR的getFeatures回调函数
//! 本函数是获取HOG特征子
void getHOGFeatures(const Mat& image, Mat& features) {
//待完善
}
//! EasyPR的getFeatures回调函数
//! 本函数是获取HSV空间量化的直方图特征子
void getHSVHistFeatures(const Mat& image, Mat& features) {
// TODO
}
} /* \namespace easypr */

@ -5,8 +5,6 @@ Namespace where all the C++ EasyPR functionality resides
*/
namespace easypr {
CPlate::CPlate() {
bColored = true;
}
CPlate::CPlate() { bColored = true; }
} /*! \namespace easypr*/

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save