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
感谢观看!!!!
以上就是全部内容,如果对您有帮助,欢迎点赞评论,或者发现有哪里写错的,欢迎指正!