Qt配置EasyPR(一次性解决问题)

配置环境

1、Qt  版本为6.5.3   下载地址为 https://www.qt.io/download/

2、opencv 版本为4.8.0  下载地址为https://github.com/opencv/opencv/releases/download/4.8.0/opencv-4.8.0-windows.exehttp://opencv.org/ 

3、EasyPR库  下载地址为https://github.com/liuruoze/EasyPR

Cmake中编译opencv

请参考这位博主的配置过程。

Qt 搭建OPENCV环境,含无需编译和自行编译_qt配置opencv_limyoonana的博客-CSDN博客

注意编译时查看Qt安装目录下是否有cmake-gui.exe

例如 E:\SoftWare\QT\Qt5.15.2\Tools\CMake_64\bin   下的cmake-gui.exe文件,如果存在一定用这个Cmake-gui.exe,编译你的Opencv,否则可能使用官网下载的opencv编译时会报错。 

Qt项目中Pro文件使用Qt编译好的opencv

INCLUDEPATH += D:\Include\Opencv\opencv-4.8.0\opencv-build\install\include
LIBS += D:\Include\Opencv\opencv-4.8.0\opencv-build\lib\libopencv_*.a

将下载好的EasyPR导入你的Qt工程(只需要导入部分文件)

将EasyPR-master下的include、model、resources、src、thirdparty目录拷贝到你的工程目录下,如下图所示

53ecdf3de4e74ed5a430d08e81060583.png

2ab4bd81ac26420fb978e08038dc7763.png

点击你的Qt工程,右键选择Add  Existing Directory 将刚刚拷贝的所有文件全部添加到Qt工程里面,例如:

e3a60582ccf946deb8ade02fa8d0d3da.png

修改导入的EasyPR目录

第一步 修改EasyPR头文件报错

将这种包含easypr/头文件全部修改为:include/easypr/(注意所有包含easypr头文件都要修改成include/easypr)

//修改前 头文件
#include "easypr/core/chars_identify.h"
#include "easypr/core/character.hpp"
#include "easypr/core/core_func.h"
#include "easypr/core/feature.h"
#include "easypr/core/params.h"
#include "easypr/config.h"

修改后:(可以点击编辑,查找/替换,高级查找,Project"项目名",下方search for输入 easypr/ 点击查找和替换,输入include/easypr/,全部替换 注意不要替换pro文件里的)

#include "include/easypr/core/chars_identify.h"
#include "include/easypr/core/character.hpp"
#include "include/easypr/core/core_func.h"
#include "include/easypr/core/feature.h"
#include "include/easypr/core/params.h"
#include "include/easypr/config.h"

51e982e59b16466f926893da54bfb85a.png

上述方式还没有全部解决头文件的问题,需要自己根据错误提示,一个一个将头文件修改成正确的路径,也就是将这种报错的头文件,easypr/前面加一个include/,就能全部解决头文件的问题。cca1ed7f2564451298d786b5101709b3.png

第二步 修改opencv高版本和低版本的差异

将报错信息中

CV_RGB2GRAY 修改为 COLOR_RGB2GRAY

CV_THRESH_OTSU 修改为 THRESH_OTSU

CV_THRESH_BINARY   修改为 THRESH_BINARY

CV_BGR2HSV 修改为   COLOR_BGR2HSV

cvSize 修改为 cv::Size

CV_THRESH_BINARY_INV  修改为 THRESH_BINARY_INV

CV_RETR_EXTERNAL 修改为 RETR_EXTERNAL

CV_CHAIN_APPROX_NONE 修改为 CHAIN_APPROX_NONE

CV_INTER_CUBIC 修改为 INTER_CUBIC

CV_INTER_AREA  修改为 INTER_AREA

CV_StsBadArg 修改为 cv::Error::StsBadArg

CV_WINDOW_AUTOSIZE 修改为 WINDOW_AUTOSIZE

cvTermCriteria 修改为 TermCriteria

CV_TERMCRIT_ITER 修改为 cv::TermCriteria::COUNT

CV_StsUnmatchedFormats 修改为 cv::Error::StsUnmatchedFormats

将config.h里面的

  #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);

修改为:

 #define LOAD_SVM_MODEL(model, path) \
  model = cv::ml::SVM::load(path);
  #define LOAD_ANN_MODEL(model, path) \
   model = cv::ml::ANN_MLP::load(path);  // 使用具体的类名称调用load函数

helper.cpp文件中的

if (src.rows != 1 && src.cols != 1) {
        CV_Error(CV_StsBadArg, "cv::argsort only sorts 1D matrices.");
    }
int flags = CV_SORT_EVERY_ROW+(ascending ? CV_SORT_ASCENDING : CV_SORT_DESCENDING);

 修改为 

 if (src.rows != 1 && src.cols != 1) {
        CV_Error(cv::Error::StsBadArg, "cv::argsort only sorts 1D matrices.");
    }
int flags = SORT_EVERY_ROW+(ascending ? SORT_ASCENDING : SORT_DESCENDING);

corrected_svm.cpp文件中的 

Ptr<SVM> SVM::create()
{
    return makePtr<SVMImpl>();
}

修改为

Ptr<SVM> SVM::create()
{
    return Ptr<SVM>();
}

第三步 修改config.h文件中内容 

将下面代码里面的路径修改为自己QT工程添加的model模块路径 

修改前代码:

static const char* kDefaultSvmPath = "model/svm_hist.xml";
static const char* kLBPSvmPath = "model/svm_lbp.xml";
static const char* kHistSvmPath = "model/svm_hist.xml";

static const char* kDefaultAnnPath = "model/ann.xml";
static const char* kChineseAnnPath = "model/ann_chinese.xml";
static const char* kGrayAnnPath = "model/annCh.xml";

//This is important to for key transform to chinese
static const char* kChineseMappingPath = "model/province_mapping";

修改后:注意 需要修改为自己的 下面只是博主自己的而已。

  static const char* kDefaultSvmPath = "D:/MyStudy/MyLPR/model/svm_hist.xml";
  static const char* kLBPSvmPath = "D:/MyStudy/MyLPR/model/svm_lbp.xml";
  static const char* kHistSvmPath = "D:/MyStudy/MyLPR/model/svm_hist.xml";

  static const char* kDefaultAnnPath = "D:/MyStudy/MyLPR/model/ann.xml";
  static const char* kChineseAnnPath = "D:/MyStudy/MyLPR/model/ann_chinese.xml";
  static const char* kGrayAnnPath = "D:/MyStudy/MyLPR/model/annCh.xml";

  //This is important to for key transform to chinese
  static const char* kChineseMappingPath = "D:/MyStudy/MyLPR/model/province_mapping";

修改完成,准备测试

在ui上添加一个按钮,转到槽,输入以下代码做测试

void MainWindow::on_pushButton_clicked()
{
    CPlateRecognize pr;
    pr.setDetectType(PR_DETECT_CMSER|PR_DETECT_COLOR);
    vector<CPlate> plateVec;
    Mat src = imread("D:/MyStudy/Image/4.jpg");
    pr.setResultShow(false);
    int result = pr.plateRecognize(src,plateVec);
    pr.getDetectShow();
    CPlate plate  = plateVec.at(0);
    Mat plateImage = plate.getPlateMat();
    Rect boundingRect(0, 0, plateImage.cols, plateImage.rows);
    rectangle(plateImage, boundingRect, Scalar(0, 0, 255), 2);
    //imwrite("D:/MyStudy/Image/12.bmp",plateImage);
    imshow("24",plateImage);
    // 在这里可以对获取到的车牌图像进行进一步处理或保存
    string license = plate.getPlateStr();
    QString lice1 = QString::fromLocal8Bit(license.c_str());
    qDebug()<<lice1;
}

17167aa484cd4a3ab393a39fcc4265f8.png

测试成功,整个EasyPR在QT上已经成功配置。 如果没有配置成功的,可以私信我帮你解决。(可有偿帮调,看各位心情随意给)

猜你喜欢

转载自blog.csdn.net/weixin_58170033/article/details/134113207