1、下载源码
https://github.com/liuruoze/EasyPR
![](https://img-blog.csdnimg.cn/20200801120022359.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIxNTY4NzI=,size_16,color_FFFFFF,t_70)
Download ZIP或者git(https://github.com/liuruoze/EasyPR.git)将代码解压到硬盘目录下。 例如F:\车牌识别\EasyPR(车牌识别)\EasyPR
![](https://img-blog.csdnimg.cn/20200802162717924.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIxNTY4NzI=,size_16,color_FFFFFF,t_70)
2、双击解决方案文件EasyPR.sln,用VS IDE(这里使用VS2019)打开,提示
![](https://img-blog.csdnimg.cn/20200802162823620.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIxNTY4NzI=,size_16,color_FFFFFF,t_70)
点击确定。
3、选择libeasypr项目,编译出现如下错误
![](https://img-blog.csdnimg.cn/20200802163635813.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIxNTY4NzI=,size_16,color_FFFFFF,t_70)
这是因为没有配置OpenCV环境所致。
4、配置OpenCV环境,这里选用最新版本OpenCV4.2版本
![](https://img-blog.csdnimg.cn/20200802163528837.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIxNTY4NzI=,size_16,color_FFFFFF,t_70)
包含目录:
F:\OpenCV\OpenCV v4.2.0\build\include
引用目录:
F:\OpenCV\OpenCV v4.2.0\build\x64\vc15\lib
再次编译,出现如下错误
![](https://img-blog.csdnimg.cn/20200802163810768.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIxNTY4NzI=,size_16,color_FFFFFF,t_70)
5、双击第1条错误信息
![](https://img-blog.csdnimg.cn/20200802164045954.png)
进入到chars_identify.cpp,选择宏定义LOAD_ANN_MODEL(cv::ml::ANN_MLP是在此宏定义里面定义的) 按F12或右键菜单“转到定义”,这个时候会自动打开config.h文件,看到如下代码:
#ifdef CV_VERSION_THREE_TWO
#define LOAD_SVM_MODEL(model, path) \
model = ml::SVM::load(path);
#define LOAD_ANN_MODEL(model, path) \
model = ml::ANN_MLP::load(path);
#else
#define LOAD_SVM_MODEL(model, path) \
model = ml::SVM::load<ml::SVM>(path);
#define LOAD_ANN_MODEL(model, path) \
model = ml::ANN_MLP::load<ml::ANN_MLP>(path);
#endif
修改代码如下:
将
#ifdef CV_VERSION_THREE_TWO
改为如下
#if ((CV_MAJOR_VERSION > 3) || (CV_MAJOR_VERSION==3 && CV_MINOR_VERSION>=2))
// 作者当初设计这套组件的时候,OpenCV最高版本才3.2
即:
#if ((CV_MAJOR_VERSION > 3) || (CV_MAJOR_VERSION==3 && CV_MINOR_VERSION>=2))
#define LOAD_SVM_MODEL(model, path) \
model = ml::SVM::load(path);
#define LOAD_ANN_MODEL(model, path) \
model = ml::ANN_MLP::load(path);
#else
#define LOAD_SVM_MODEL(model, path) \
model = ml::SVM::load<ml::SVM>(path);
#define LOAD_ANN_MODEL(model, path) \
model = ml::ANN_MLP::load<ml::ANN_MLP>(path);
#endif
6、再次编译,出现如下错误:
![](https://img-blog.csdnimg.cn/20200802170151504.png)
提示找不到第3方组件库,由于libeasypr工程文件libeasypr.vcxproj和thirdparty不在同一级目录下,再次修改包含目录添加包含目录,添加thirdparty目录相对于libeasypr.vcxproj文件的相对路径,修改后的包含目录如下:
..\
F:\OpenCV\OpenCV v4.2.0\build\include
7、再次编译,出现如下错误:
![](https://img-blog.csdnimg.cn/20200802170847489.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIxNTY4NzI=,size_16,color_FFFFFF,t_70)
这是由于OpenCV升级后,规范化常量命名所致,修改规则如下:
CV_WINDOW_AUTOSIZE -> WINDOW_AUTOSIZE
CV_RGB2GRAY -> COLOR_RGB2GRAY
CV_THRESH_OTSU -> THRESH_OTSU
CV_THRESH_BINARY -> THRESH_BINARY
cvSize -> Size
除了颜色转换,是将CV_改为COLOR_,其它错误基本上是将CV_前缀删除即可。
请注意:CV_TERMCRIT_ITER不用修改。
8、再次编译,出现如下错误:
![](https://img-blog.csdnimg.cn/2020080217241338.png)
请在源文件或头文件里面,前面添加引用
#include "opencv2/core/types_c.h"
9、再次编译,出现如下错误:
请在helper.hpp源码前面添加
using namespace cv::Error;
10、再次编译,出现如下错误:
双击错误行,选中DataType,按F12或者右键菜单“转到定义”,自动打开traits.hpp文件,发现
![](https://img-blog.csdnimg.cn/20200802173912933.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIxNTY4NzI=,size_16,color_FFFFFF,t_70)
DataType的属性因为宏定义的原因并没有开放出来,打开libeasypr属性,添加OPENCV_TRAITS_ENABLE_DEPRECATED预处理器宏定义
11、再次编译,出现如下错误:
![](https://img-blog.csdnimg.cn/20200802174359137.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIxNTY4NzI=,size_16,color_FFFFFF,t_70)
无法实现抽象化示例类?从错误输出我们可以看出,是函数trainAuto和getUncompressedSupportVectors这2个存虚函数没有实现引起的(早期的OpenCV版本并没有这2个纯虚函数)。
CV_WRAP virtual bool trainAuto(InputArray samples,
int layout,
InputArray responses,
int kFold = 10,
Ptr<ParamGrid> Cgrid = SVM::getDefaultGridPtr(SVM::C),
Ptr<ParamGrid> gammaGrid = SVM::getDefaultGridPtr(SVM::GAMMA),
Ptr<ParamGrid> pGrid = SVM::getDefaultGridPtr(SVM::P),
Ptr<ParamGrid> nuGrid = SVM::getDefaultGridPtr(SVM::NU),
Ptr<ParamGrid> coeffGrid = SVM::getDefaultGridPtr(SVM::COEF),
Ptr<ParamGrid> degreeGrid = SVM::getDefaultGridPtr(SVM::DEGREE),
bool balanced=false) = 0;
CV_WRAP virtual Mat getUncompressedSupportVectors() const = 0;
既然知道是纯虚函数没有实例化,那么就简单多了。打开corrected_svm.cpp文件,将这2个纯虚函数简单实例化就行了。
CV_WRAP virtual bool trainAuto(InputArray samples,
int layout,
InputArray responses,
int kFold = 10,
Ptr<ParamGrid> Cgrid = SVM::getDefaultGridPtr(SVM::C),
Ptr<ParamGrid> gammaGrid = SVM::getDefaultGridPtr(SVM::GAMMA),
Ptr<ParamGrid> pGrid = SVM::getDefaultGridPtr(SVM::P),
Ptr<ParamGrid> nuGrid = SVM::getDefaultGridPtr(SVM::NU),
Ptr<ParamGrid> coeffGrid = SVM::getDefaultGridPtr(SVM::COEF),
Ptr<ParamGrid> degreeGrid = SVM::getDefaultGridPtr(SVM::DEGREE),
bool balanced = false)
{
return false;
}
CV_WRAP virtual Mat getUncompressedSupportVectors() const
{
return getSupportVectors();
}
添加位置如下(类SVMImpl):
![](https://img-blog.csdnimg.cn/20200813201825119.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIxNTY4NzI=,size_16,color_FFFFFF,t_70)
12、继续编译,出现如下错误:
![](https://img-blog.csdnimg.cn/20200802180416136.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIxNTY4NzI=,size_16,color_FFFFFF,t_70)
双击错误行,将NULL改为nullptr,将所有出错的NULL改为nullptr
13、再次编译,出现如下信息:
![](https://img-blog.csdnimg.cn/20200802180737289.png)
至此,终于可以歇口气了!!!