【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

 

 

感谢观看!!!!

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

 

### Qt车牌识别技术结合的可能性 Qt作为一种强大的跨平台应用开发框架,其主要优势在于图形用户界面(GUI)设计和多线程处理能力。然而,在涉及图像处理的任务中,通常会与其他专门的库配合使用,例如OpenCV或Halcon。以下是基于现有引用内容和技术知识的一个综合解答。 #### 使用Qt与Halcon实现车牌识别 在引用[1]中提到,Halcon因其卓越的图像处理能力和模式识别功能被广泛应用于复杂的图像分析任务,如车牌识别。如果希望利用Qt作为上位机开发环境,则可以通过调用Halcon的功能模块来完成车牌识别的核心算法部分[^1]。 下面是一个简单的架构说明: - **前端界面**:由Qt负责构建,提供友好的用户体验。 - **后台逻辑**:通过集成Halcon或其他第三方库执行具体的图像处理操作。 具体到代码层面,假设已经安装好了HALCON SDK并配置好相应的动态链接库路径,那么可以在Qt项目里这样设置: ```cpp // mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "halconapiwrapper.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void on_pushButton_loadImage_clicked(); void on_pushButton_recognizePlate_clicked(); private: Ui::MainWindow *ui; HalconAPIWrapper halconApi; // 假设有一个封装了 HALCON API 的类 }; #endif // MAINWINDOW_H // mainwindow.cpp (仅展示部分方法) void MainWindow::on_pushButton_loadImage_clicked() { QString fileName = QFileDialog::getOpenFileName(this, tr("Open Image"), "", tr("Image Files (*.png *.jpg *.bmp)")); if (!fileName.isEmpty()) { QImage image(fileName); ui->label_imageDisplay->setPixmap(QPixmap::fromImage(image)); try { HObject ho_Image = halconApi.loadImage(fileName.toStdString()); // 将加载后的图像传递给 HALCON 处理... } catch (...) { QMessageBox::warning(this, "Error", "Failed to load the image."); } } } void MainWindow::on_pushButton_recognizePlate_clicked() { std::string resultText; try { resultText = halconApi.recognizeLicensePlate(); // 调用 HALCON 实现的具体函数 } catch (...) { QMessageBox::critical(this, "Recognition Error", "Unable to recognize license plate."); return; } QMessageBox::information(this, "Result", QString::fromStdString(resultText)); } ``` 上述示例展示了如何在一个基本的Qt窗口程序中嵌入Halcon的相关接口调用来读取图片文件,并尝试运行车牌识别过程[^4]。 #### 结合深度学习模型进行车型及车牌联合识别 除了传统的计算机视觉方法之外,现代车牌识别系统越来越多地依赖于深度学习技术。正如引用[3]所描述那样,YOLO系列目标检测网络非常适合此类应用场景——不仅速度快而且精度高[^3]。 在这种情况下,可以考虑将Python脚本引入到整个工作流当中。虽然Qt本身并不直接支持Python解释器,但是借助外部进程或者插件形式仍然可行。例如,编写一段独立运行的服务端程序接收来自客户端发送过来待测样本数据包后再反馈回去最终预测标签字符串即可满足需求。 --- ###
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

logani

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值