开发环境:win10 + Qt5.12.1 + vs2015_x64

下载

EasyPR源码下载链接:https://github.com/liuruoze/EasyPR
笔者下载的v1.6版本 (这个库最后维护是2018年好像)
因为没有训练绿牌,所以无法识别,需要自己训练,它提供了训练函数
如何添加绿牌https://blog.csdn.net/h593245631/article/details/107185418

直接把源码加到.pri文件中

在这里插入图片描述

在这里插入图片描述

安装/直接解压 opencv-3.2.0-vc14.exe

下载:https://nchc.dl.sourceforge.net/project/opencvlibrary/opencv-win/3.2.0/opencv-3.2.0-vc14.exe
在这里插入图片描述

使用

在这里插入图片描述

void EasyPRThread::run()
{
    setResult(0);
    switch (threadType()) {
    case 0://init
        init();
        break;
    case 1:
    {
        QImage image;
        QString tag;
        extractFacialFeatures(getFilePath(),image,tag);
        setImage(image);
        setTag(tag);
    }
        break;
    case 2:
    {
        easypr::SvmTrain svm("tmp/train/svm", "tmp/train/svm.xml");
        svm.train();
    }
        break;
    case 3:
    {
        easypr::AnnTrain ann("tmp/train/ann", "tmp/train/ann.xml");
        ann.train();
    }
        break;
    case 4:
    {
        int sameCount = 0;
        int errorCount = 0;
        for(int i=0; i<_filePaths.size(); ++i){
            QImage image;
            QString tag;
            extractFacialFeatures(_filePaths.at(i),image,tag);
            setImage(image);
            setTag(tag);
            QFileInfo fileInfo(_filePaths.at(i));
            if(fileInfo.completeBaseName() == tag){
                ++sameCount;
            }else{
                ++errorCount;
            }
        }
        QString str = QString("%1:%2  %3:%4   %5:%6  %7:%8")
                .arg(QStringLiteral("共"))
                .arg(_filePaths.size())
                .arg(QStringLiteral("正确"))
                .arg(sameCount)
                .arg(QStringLiteral("错误"))
                .arg(errorCount)
                .arg(QStringLiteral("识别率"))
                .arg(sameCount*1.0/_filePaths.size());
        SCDebug<<str;
        emit sigTextEdit(str);

    }
        break;
    default:
        break;
    }
}
bool EasyPRThread::extractFacialFeatures(const QString &filePath,QImage &image,QString &tag)
{
    image.load(filePath);
    int result = 0;
    //    cv::Mat src = imread(filePath.toLocal8Bit().toStdString());
    //    // 切割车牌图片
    //    vector<CPlate> resultVec;
    //    CPlateDetect pd;
    //    pd.setPDLifemode(true);

    //    result = pd.plateDetect(src, resultVec);
    //    size_t num = resultVec.size();
    //    SCDebug<<"result:"<<result<<num;
    //    for (size_t j = 0; j < num; j++) {
    //        CPlate resultMat = resultVec[j];
    //        std::string license = resultMat.getPlateStr();
    //        QString lice1 = QString::fromLocal8Bit(license.c_str());
    //        SCDebug<<"j:"<<lice1;
    //        imshow("plate_detect", resultMat.getPlateMat());
    //        waitKey(0);
    //    }

    CPlateRecognize pr;

    //CMER代表文字定位方法,SOBEL和COLOR分别代表边缘和颜色定位方法。可以通过"|"符号结合
    //    pr.setDetectType(PR_DETECT_SOBEL);
    //    pr.setDetectType(PR_DETECT_CMSER);
    //    pr.setDetectType(PR_DETECT_COLOR);
    //    pr.setDetectType(PR_DETECT_CMSER | PR_DETECT_COLOR);
    pr.setDetectType(PR_DETECT_COLOR | PR_DETECT_SOBEL | PR_DETECT_CMSER);

    //开启生活模式,这个属性在定位方法为SOBEL时可以发挥作用,能增大搜索范围,提高鲁棒性。
    pr.setLifemode(true);
    //    //设置EasyPR最多查找多少个车牌。当一副图中有大于n个车牌时,EasyPR最终只会输出可能性最高的n个。
    pr.setMaxPlates(1);
    std::vector<CPlate>plateVec;
    cv::Mat src = imread(filePath.toLocal8Bit().toStdString());
    pr.setResultShow(false);
    result = pr.plateRecognize(src,plateVec);
    SCDebug<<"result:"<<result<<plateVec.size();
    //    pr.getResultShow();
    QPainter painter(&image);
    for(int i=0; i<plateVec.size(); ++i){
        CPlate plate = plateVec.at(i);
        //plateMat代表车牌图像,rrect代表车牌的可旋转矩形位置,license代表车牌字符串,例如“蓝牌:苏EUK722”。
        //        Mat plateMat = plate.getPlateMat();
        RotatedRect rrect = plate.getPlatePos();
        painter.setPen(QPen(Qt::magenta, 2, Qt::DashDotLine));
        painter.drawRect(rrect.boundingRect().x,rrect.boundingRect().y,rrect.boundingRect().width,rrect.boundingRect().height);
        std::string license = plate.getPlateStr();

        QString lice1 = QString::fromLocal8Bit(license.data());
        lice1 = getLicensePlateType(lice1,tag);
        qDebug()<<i<<"revStr:"<<lice1;
        emit sigTextEdit(lice1);
    }
    return true;
}

最终效果

测试它源码中自带的 general_test 文件夹中的车牌图片识别率只有:0.47(47%)

在这里插入图片描述
在这里插入图片描述

Qt 车牌识别 (HyperLPR)

https://blog.csdn.net/u012020854/article/details/111202952

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐