EasyPR编译指南
1、下載源碼
https://github.com/liuruoze/EasyPR
Download?ZIP或者git(https://github.com/liuruoze/EasyPR.git)將代碼解壓到硬盤目錄下。?例如F:\車牌識別\EasyPR(車牌識別)\EasyPR
2、雙擊解決方案文件EasyPR.sln,用VS?IDE(這里使用VS2019)打開,提示
點擊確定。
3、選擇libeasypr項目,編譯出現如下錯誤
這是因為沒有配置OpenCV環境所致。
4、配置OpenCV環境,這里選用最新版本OpenCV4.2版本
包含目錄:
F:\OpenCV\OpenCV v4.2.0\build\include
引用目錄:
F:\OpenCV\OpenCV v4.2.0\build\x64\vc15\lib
再次編譯,出現如下錯誤
5、雙擊第1條錯誤信息
進入到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); #endif6、再次編譯,出現如下錯誤:
提示找不到第3方組件庫,由于libeasypr工程文件libeasypr.vcxproj和thirdparty不在同一級目錄下,再次修改包含目錄添加包含目錄,添加thirdparty目錄相對于libeasypr.vcxproj文件的相對路徑,修改后的包含目錄如下:
..\ F:\OpenCV\OpenCV v4.2.0\build\include7、再次編譯,出現如下錯誤:
這是由于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、再次編譯,出現如下錯誤:
請在源文件或頭文件里面,前面添加引用
#include "opencv2/core/types_c.h"?
9、再次編譯,出現如下錯誤:
?請在helper.hpp源碼前面添加
using namespace cv::Error;
10、再次編譯,出現如下錯誤:
?雙擊錯誤行,選中DataType,按F12或者右鍵菜單“轉到定義”,自動打開traits.hpp文件,發現
DataType的屬性因為宏定義的原因并沒有開放出來,打開libeasypr屬性,添加OPENCV_TRAITS_ENABLE_DEPRECATED預處理器宏定義
11、再次編譯,出現如下錯誤:
無法實現抽象化示例類?從錯誤輸出我們可以看出,是函數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):
12、繼續編譯,出現如下錯誤:
雙擊錯誤行,將NULL改為nullptr,將所有出錯的NULL改為nullptr
13、再次編譯,出現如下信息:
至此,終于可以歇口氣了!!!
總結
以上是生活随笔為你收集整理的EasyPR编译指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 点云数据处理_点云数据处理学习
- 下一篇: 【转载】OpenStack Swift学