【OpenCV+Qt】使用车牌识别系统EasyPR识别车牌号

EasyPR是一个中文的开源车牌识别系统,其车牌识别划分为了两个过程:即车牌检测(Plate Detection)和字符识别(Chars Recognition)两个过程:

车牌检测(Plate Detection):对一个包含车牌的图像进行分析,最终截取出只包含车牌的一个图块;

字符识别(Chars Recognition):从上一个车牌检测步骤中获取到的车牌图像,进行光学字符识别(OCR)这个过程

效果:

 如果还没有搭环境,可参考

Ubuntu+Qt下配置车牌识别系统EasyPR1.6环境_logani的博客-CSDN博客

1.在线程中循环捕获视频帧,发送到窗口进行显示

2.CPlateRecognize进行初始化

 

识别车牌和颜色,最多可同时识别4个

3.从帧图片中获取车牌信息CPlate存入容器中

如果为0,就是获取到

4.获取容器第一个车牌转成Mat进行显示

第一次转换是将二值化、灰度化后的单通道转成三通道,
第二次转换才是将Mat的BGR转换成RGB

5.获取车牌的文字信息,转换成QString到linneEdit进行显示

 源码

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    pvideothread=new videothread("carinput.mp4");
    connect(pvideothread,SIGNAL(sendFrame(Mat)),this,SLOT(receiveFrame(Mat)),Qt::BlockingQueuedConnection);//接收每一帧Mat
    //初始化
    pr.setDetectType(PR_DETECT_CMSER|PR_DETECT_COLOR);//识别车牌和颜色
    pr.setMaxPlates(4);
    pr.setResultShow(false);

}

Widget::~Widget()
{
    delete ui;
}

void Widget::receiveFrame(Mat frame)
{
    this->frame=frame.clone();//克隆一个做显示和检测车牌
    cvtColor(this->frame, this->frame, CV_BGR2RGB);
    this->img1 = QImage(this->frame.data,this->frame.cols,this->frame.rows,QImage::Format_RGB888);
    this->img1 = this->img1.scaled(ui->label_2->width(),ui->label_2->height());

    update();
}

void Widget::on_pushButton_clicked()//播放
{
    pvideothread->start();

}

void Widget::on_pushButton_2_clicked()
{
    Mat carNum;
    int res=pr.plateRecognize(this->frame,plateVec);
    if(res==0)
    {
        plate=plateVec.at(0);//获取CPlate
        plateMat=plate.getPlateMat();//转换成Mat
        //第一次转换是将二值化、灰度化后的单通道转成三通道
        cvtColor(plateMat, carNum, CV_BGR2RGB);
        //第二次转换才是将Mat的BGR转换成RGB
        cvtColor(carNum, carNum, CV_BGR2RGB);
        QImage img(carNum.data,carNum.cols,carNum.rows,QImage::Format_RGB888);

        ui->label->setPixmap(QPixmap::fromImage(img));
        ui->label->setScaledContents(true);//铺满控件

        String str=plateVec[0].getPlateStr();
        ui->lineEdit->clear();
        ui->lineEdit->setText(QString(str.c_str()));
    }
    plateVec.clear();//清空容器

}
void Widget::paintEvent(QPaintEvent *e)
{
    ui->label_2->setPixmap(QPixmap::fromImage(this->img1));
}

 头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <easypr.h>
#include "videothread.h"
using namespace easypr;
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();
    void paintEvent(QPaintEvent *e);
public slots:
    void receiveFrame(Mat frame);
private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::Widget *ui;
    Mat frame;
    CPlateRecognize pr;
    vector<CPlate> plateVec;
    CPlate plate;
    Mat plateMat;
    videothread *pvideothread;
    QImage img1;
};

#endif // WIDGET_H

感谢观看!!!!

以上就是全部内容,如果对您有帮助,欢迎点赞评论,或者发现有哪里写错的,欢迎指正!

猜你喜欢

转载自blog.csdn.net/logani/article/details/128390979