【车牌识别】part1先设计个“好看”的界面

用c++写界面,用MFC库和Qt库的比较多。Qt相比MFC而言,更加的简易,更加容易上手,所以博主选择了用Qt写界面(其实是我MFC太生疏了,逃。。。)

首先得装上个Qt,就Qt5.8好了,我选择了MSVC版本的,因为我要在VS上调用Qt。另外下载qs-vs-tools工具,装好之后,稍加配置,就可以愉快地写代码了。VS配合Qt使用,美滋滋。。。

下面是我设计的界面,觉得怎么样呢?是不是一股浓重的乡村重金属风格的画风迎面而来。。。哈哈,不管了,先将就弄成这样,以后再更改。


界面

下面贴出代码,代码很简单。
NumIdentify.h

#pragma once
#pragma execution_character_set("utf-8")
#include <QtWidgets/QDialog>
#include <ImageProcessor.h>
//#include "ui_NumIdentify.h"
#include <qlabel.h>
#include <qpushbutton.h>
#include <qtextedit.h>
#include <qprogressbar.h>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <qgraphicsview.h>

class NumIdentify : public QDialog
{
    Q_OBJECT

public:
    NumIdentify(QWidget *parent = Q_NULLPTR);

private:
    //Ui::NumIdentifyClass ui;
    QLabel *ImageLabel1;
    QLabel *ImageLabel2;
    QLabel *TextLabel;
    QLabel *StatusLabel;

    QPushButton *OpenBtn;
    QPushButton *CleanBtn;
    QPushButton *IdentifyBtn;

    QGraphicsView *Image1;
    QGraphicsView *Image2;

    QProgressBar *Progress;

    QTextEdit *TextShow;

    //the followings are layout
    QVBoxLayout *LeftLayout;
    QVBoxLayout *RightLayout;
    QHBoxLayout *TopLayout;
    QHBoxLayout *BottomLayout;
    QVBoxLayout *MainLayout;

    //two scenes
    QGraphicsScene *scene1;
    QGraphicsScene *scene2;

    //一个ImageProcessor类的指针
    ImageProcessor *i=NULL;

public:
    void showImage(QImage img,uint view)const;//this function 
    void init();

private slots:
    void onOpenFile();
    void onClean();
    void onIdentify();
};

NumIdentify.cpp

#include "NumIdentify.h"
#include <qgraphicsscene.h>
#include <qpixmap.h>
#include <ImageProcessor.h>
#include <qfiledialog.h>
#include <qmessagebox.h>
#include <qfont.h>

NumIdentify::NumIdentify(QWidget *parent)
    : QDialog(parent)
{
    //ui.setupUi(this);
    this->setGeometry(50, 50, 1200,500);
    init();//this function can create the ui

}

//INIT finish arranging layout and appearance
void NumIdentify::init()
{
    //create widgets and add them into layout
    //the Top Left Layout
    ImageLabel1 = new QLabel(tr("Original Image"));
    scene1 = new QGraphicsScene;
    Image1 = new QGraphicsView(scene1);

    LeftLayout = new QVBoxLayout;

    LeftLayout->addWidget(ImageLabel1);
    LeftLayout->addWidget(Image1);
    LeftLayout->setAlignment(Qt::AlignCenter);

    //set the right layout
    ImageLabel2 = new QLabel(tr("Cut Image"));
    scene2 = new QGraphicsScene;
    Image2 = new QGraphicsView(scene2);
    //
    TextLabel = new QLabel(tr("Identified Text"));
    TextShow = new QTextEdit();
    RightLayout = new QVBoxLayout;
    RightLayout->addWidget(ImageLabel2);
    RightLayout->addWidget(Image2);
    RightLayout->addWidget(TextShow);
    RightLayout->setAlignment(Qt::AlignCenter);

    //set the bottom layout
    OpenBtn = new QPushButton(tr("Open File"));
    CleanBtn = new QPushButton(tr("Clean"));
    IdentifyBtn = new QPushButton(tr("Identify"));
    StatusLabel = new QLabel("Status:");
    Progress = new QProgressBar;
    BottomLayout = new QHBoxLayout;
    BottomLayout->addWidget(OpenBtn);
    BottomLayout->addWidget(CleanBtn);
    BottomLayout->addWidget(IdentifyBtn);
    BottomLayout->addWidget(StatusLabel);
    BottomLayout->addWidget(Progress);

    //set the top layout
    TopLayout = new QHBoxLayout;
    TopLayout->addLayout(LeftLayout);
    TopLayout->addLayout(RightLayout);

    //set the general layout
    MainLayout = new QVBoxLayout(this);
    MainLayout->addLayout(TopLayout);
    MainLayout->addLayout(BottomLayout);
    setLayout(MainLayout);

    //上面的语句完成了UI的初始化
    //以下语句将控件和函数联系起来,主要是一些connect函数
    connect(OpenBtn, SIGNAL(clicked()), this, SLOT(onOpenFile()));
    connect(CleanBtn, SIGNAL(clicked()), this, SLOT(onClean()));
    connect(IdentifyBtn, SIGNAL(clicked()), this, SLOT(onIdentify()));
}

//SHOWIMAGE show image designated view
//when view=0,show image in scene1
//when view=1,show image in scene2
//this function must be used after scene1 and scene2 were created.
void NumIdentify::showImage(QImage img, uint view)const
{
    QPixmap temp = QPixmap::fromImage(img,Qt::ColorOnly);
    if (view == 0)
    {
        scene1->addPixmap(temp);
    }
    else if (view == 1)
    {
        scene2->addPixmap(temp);
    }
}

void NumIdentify::onOpenFile()
{
    QString path0 = QFileDialog::getOpenFileName(this, tr("Open..."), tr("D:\\"), tr("Images (*.jpg *.jpeg)"));
    if (path0.length() == 0) {
        QMessageBox::information(NULL, tr("Path"), tr("You didn't select any files."));
        return;//退出
    }
    string path = path0.toStdString();//QString to string
    i = new ImageProcessor(path);
    
    //显示原始图形
    showImage(i->Mat2QImage(i->originalImage), 0);
}

void NumIdentify::onIdentify()
{
    if (i != NULL)//存在ImagegProcessor对象才能识别啊
    {
        i->action();
    }
    else if (i == NULL)
    {
        return;
    }
    //显示切割图像accurateImage
    //Mat temp;
    //cvtColor(i->accurateImage, temp, CV_GRAY2BGR);
    showImage(i->Mat2QImage(i->accurateImage), 1);

    //显示切割出来的字符
    string tmp="";
    for (int k = 0; k < i->recognizedCharacters.size(); k++)
        tmp = tmp + i->recognizedCharacters[k];

    QString tmp1 = QString::fromStdString(tmp);
    TextShow->setFontWeight(QFont::Bold);//粗体显示
    TextShow->setFont(QFont("Timers", 28, QFont::Bold));
    TextShow->setPlainText(tmp1.toUtf8());
}

void NumIdentify::onClean()
{
    //QMessageBox::information(this, tr("just try"), tr("test"));
    //先把所有的显示给清空
    scene1->clear();
    scene2->clear();
    TextShow->clear();
    i = NULL;
}

完毕

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容