配置环境
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目录拷贝到你的工程目录下,如下图所示
点击你的Qt工程,右键选择Add Existing Directory 将刚刚拷贝的所有文件全部添加到Qt工程里面,例如:
修改导入的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"
上述方式还没有全部解决头文件的问题,需要自己根据错误提示,一个一个将头文件修改成正确的路径,也就是将这种报错的头文件,easypr/前面加一个include/,就能全部解决头文件的问题。
第二步 修改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;
}
测试成功,整个EasyPR在QT上已经成功配置。 如果没有配置成功的,可以私信我帮你解决。(可有偿帮调,看各位心情随意给)