diff --git a/DiagramRecognizer/DiagramRecognizer.pro b/DiagramRecognizer/DiagramRecognizer.pro index b75983b..51d1e00 100644 --- a/DiagramRecognizer/DiagramRecognizer.pro +++ b/DiagramRecognizer/DiagramRecognizer.pro @@ -14,12 +14,12 @@ SOURCES += main.cpp\ bitmap.cpp \ output.cpp \ component.cpp \ - diagramRecognizer.cpp \ formSegmentator.cpp \ simpleFormsInitializer.cpp \ recognizers/mixedGesturesManager.cpp \ recognizers/nearestPosGridGesturesManager.cpp \ - recognizers/rectangleGesturesManager.cpp + recognizers/rectangleGesturesManager.cpp \ + diagramMainWIndow.cpp HEADERS += \ geometricForms.h \ @@ -30,14 +30,15 @@ HEADERS += \ component.h \ figure.h \ edge.h \ - diagramRecognizer.h \ formSegmentator.h \ simpleFormsInitializer.h \ recognizers/mixedGesturesManager.h \ recognizers/nearestPosGridGesturesmanager.h \ - recognizers/rectangleGesturesManager.h + recognizers/rectangleGesturesManager.h \ + diagramMainWindow.h -FORMS += +FORMS += \ + mainWindow.ui OTHER_FILES += \ readme.txt \ diff --git a/DiagramRecognizer/abstractRecognizer.h b/DiagramRecognizer/abstractRecognizer.h index 2e0cb3a..22d1fb6 100644 --- a/DiagramRecognizer/abstractRecognizer.h +++ b/DiagramRecognizer/abstractRecognizer.h @@ -4,7 +4,7 @@ #include #include #include "geometricForms.h" -#include "paintmanager.h" +#include "paintManager.h" class GesturesManager { diff --git a/DiagramRecognizer/bitmap.h b/DiagramRecognizer/bitmap.h index 7d19f5a..4fd0ac3 100644 --- a/DiagramRecognizer/bitmap.h +++ b/DiagramRecognizer/bitmap.h @@ -16,7 +16,7 @@ class Bitmap : public QList > int yLower() const; Component rasterizedDiagram() const; -private: +public: void rasterizeDiagram(); void rasterizeSegment(int x1, int y1, int x2, int y2); void setLower(); diff --git a/DiagramRecognizer/diagramMainWIndow.cpp b/DiagramRecognizer/diagramMainWIndow.cpp new file mode 100644 index 0000000..664147f --- /dev/null +++ b/DiagramRecognizer/diagramMainWIndow.cpp @@ -0,0 +1,158 @@ +#include "diagramMainWindow.h" +#include "ui_mainWindow.h" + +#include "bitmap.h" +#include "formSegmentator.h" +#include "simpleFormsInitializer.h" +#include "recognizers/mixedGesturesManager.h" +#include "output.h" + +#include +#include +#include +#include +#include +#include +#include + +mainWindow::mainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::mainWindow) +{ + ui->setupUi(this); + + printedDiagram = new Output; + scene = new QGraphicsScene; + ui->outputView->setScene(scene); + ui->outputView->setFrameStyle(0); + ui->outputView->setAlignment(Qt::AlignLeft | Qt::AlignTop); + ui->outputView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + ui->outputView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + ui->stages->setCurrentIndex(4); + + connect(ui->exitButton, SIGNAL(clicked()), this, SLOT(close())); + connect(ui->clearButton, SIGNAL(clicked()), this, SLOT(clear())); + connect(ui->recButton, SIGNAL(clicked()), this, SLOT(recognize())); + connect(ui->recImButton, SIGNAL(clicked()), this, SLOT(recognizeImage())); + connect(ui->stages, SIGNAL(activated(int)), this, SLOT(showStage(int))); + + connect(this, SIGNAL(print(PathVector, Bitmap *, FormSegmentator *, int)), printedDiagram, SLOT(draw(PathVector, Bitmap *, FormSegmentator *, int))); + + mRecognized = false; + mComponentPoint.setX(-1000); + mComponentPoint.setY(-1000); + mGesturesManager = new MixedGesturesManager(); + mAbstractRecognizer = new AbstractRecognizer(mGesturesManager, + SimpleFormsInitializer::initialForms()); + + this->showFullScreen(); +} + +void mainWindow::clear() +{ + clearScene(); + mRecognized = false; + mComponentPoint.setX(-10000); + mComponentPoint.setY(-10000); + emit print(mDiagram, mBitmap, mFormSegmentator, 4); +} + +void mainWindow::recognizeImage() +{ + QString fileName = QFileDialog::QFileDialog::getOpenFileName(this, + tr("Recognize image"), ".", + tr("Png files (*.png)")); + inputImage = new QGraphicsPixmapItem(QPixmap::fromImage(QImage(fileName))); + mBitmap = new Bitmap(QImage(fileName)); + recognizeDiagram(); + +} + +void mainWindow::recognize() +{ + mBitmap = new Bitmap(mDiagram); + recognizeDiagram(); +} + +void mainWindow::recognizeDiagram() +{ + //mRecognized = true; + mFormSegmentator = new FormSegmentator(mBitmap); + mFormSegmentator->uniteComponents(); + QList objects = mFormSegmentator->getObjects(); + mDiagram.clear(); + foreach (Component const &object, objects) { + PathVector recognizedObject = mAbstractRecognizer->recognizeObject( + object.figure(mBitmap->xLeft(), mBitmap->yUpper())); + mDiagram.append(recognizedObject); + } + foreach (Component const &edge, mFormSegmentator->getEdges()) { + mDiagram.append(edge.figure(mBitmap->xLeft(), mBitmap->yUpper())); + } + emit print(mDiagram, mBitmap, mFormSegmentator, 4); + + scene->addItem(inputImage); + scene->addWidget(printedDiagram); + clearScene(); + showInput(); +} + +void mainWindow::showStage(int index) +{ + switch(index) + { + case 0: + showInput(); + break; + case 1: + showBitmap(); + break; + case 2: + showComponents(); + break; + case 3: + showUniStage(); + break; + } + +} + +void mainWindow::showInput() +{ + clearScene(); + inputImage->setVisible(true); +} + +void mainWindow::showUniStage() +{ + clearScene(); + emit print(mDiagram, mBitmap, mFormSegmentator, 4); + printedDiagram->setVisible(true); +} + +void mainWindow::showBitmap() +{ + clearScene(); + emit print(mDiagram, mBitmap, mFormSegmentator, 2); + printedDiagram->setVisible(true); +} + +void mainWindow::showComponents() +{ + clearScene(); + emit print(mDiagram, mBitmap, mFormSegmentator, 3); + printedDiagram->setVisible(true); +} + +void mainWindow::clearScene() +{ + if(inputImage->isVisible()) + inputImage->setVisible(false); + if(printedDiagram->isVisible()) + printedDiagram->setVisible(false); +} + +mainWindow::~mainWindow() +{ + delete ui; +} diff --git a/DiagramRecognizer/diagramMainWindow.h b/DiagramRecognizer/diagramMainWindow.h new file mode 100644 index 0000000..ff100fe --- /dev/null +++ b/DiagramRecognizer/diagramMainWindow.h @@ -0,0 +1,49 @@ +#pragma once + +#include +#include "bitmap.h" +#include "formSegmentator.h" +#include "abstractRecognizer.h" +#include "output.h" +#include +#include + +namespace Ui { +class mainWindow; +} + +class mainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit mainWindow(QWidget *parent = 0); + ~mainWindow(); + +public slots: + void clear(); + void recognize(); + void recognizeImage(); + void showStage(int); +signals: + void print(PathVector mDiagram, Bitmap * mBitmap, FormSegmentator *mFormSegmentator, int stageNum); + +private: + void showInput(); + void showUniStage(); + void showBitmap(); + void showComponents(); + void clearScene(); + QGraphicsPixmapItem *inputImage; + Output *printedDiagram; + Ui::mainWindow *ui; + void recognizeDiagram(); + PathVector mDiagram; + Bitmap * mBitmap; + FormSegmentator *mFormSegmentator; + bool mRecognized; + QPoint mComponentPoint; + GesturesManager *mGesturesManager; + AbstractRecognizer *mAbstractRecognizer; + QGraphicsScene *scene; +}; diff --git a/DiagramRecognizer/diagramrecognizer.cpp b/DiagramRecognizer/diagramrecognizer.cpp deleted file mode 100644 index 5d625c8..0000000 --- a/DiagramRecognizer/diagramrecognizer.cpp +++ /dev/null @@ -1,92 +0,0 @@ -#include "diagramRecognizer.h" -#include "bitmap.h" -#include "formSegmentator.h" -#include "simpleFormsInitializer.h" -#include "recognizers/mixedGesturesManager.h" -#include "output.h" - -#include -#include -#include -#include -#include -#include -#include - -DiagramRecognizer::DiagramRecognizer(QWidget *parent) : - QWidget(parent) -{ - QPushButton *clearButton = new QPushButton(tr("Clear")); - clearButton->setFont(QFont("Times", 18, QFont::Bold)); - QPushButton *recognizeButton = new QPushButton(tr("Recognize")); - recognizeButton->setFont(QFont("Times", 18, QFont::Bold)); - QPushButton *recognizeImageButton = new QPushButton(tr("Recognize Image")); - recognizeImageButton->setFont(QFont("Times", 18, QFont::Bold)); - - Output *PrintedDiagram = new Output; - - connect(clearButton, SIGNAL(clicked()), this, SLOT(clear())); - connect(recognizeButton, SIGNAL(clicked()), this, SLOT(recognize())); - connect(recognizeImageButton, SIGNAL(clicked()), this, SLOT(recognizeImage())); - - connect(this, SIGNAL(print(PathVector, Bitmap *, FormSegmentator *)), PrintedDiagram, SLOT(draw(PathVector, Bitmap *, FormSegmentator *))); - - QGridLayout *gridLayout = new QGridLayout; - gridLayout->addWidget(clearButton, 0, 0); - gridLayout->addWidget(recognizeButton, 1, 0); - gridLayout->addWidget(recognizeImageButton, 2, 0); - gridLayout->addWidget(PrintedDiagram, 1, 1, 3, 1); - gridLayout->setColumnStretch(1, 10); - setLayout(gridLayout); - - mRecognized = false; - mComponentPoint.setX(-1000); - mComponentPoint.setY(-1000); - mGesturesManager = new MixedGesturesManager(); - mAbstractRecognizer = new AbstractRecognizer(mGesturesManager, - SimpleFormsInitializer::initialForms()); -} - -void DiagramRecognizer::clear()//чистит все -{ - mDiagram.clear(); - mRecognized = false; - mComponentPoint.setX(-10000); - mComponentPoint.setY(-10000); - emit print(mDiagram, mBitmap, mFormSegmentator); -} - -void DiagramRecognizer::recognizeImage() -{ - QString fileName = QFileDialog::QFileDialog::getOpenFileName(this, - tr("Recognize image"), ".", - tr("Png files (*.png)")); - mBitmap = new Bitmap(QImage(fileName)); - recognizeDiagram(); - -} - -void DiagramRecognizer::recognize() -{ - mBitmap = new Bitmap(mDiagram); - recognizeDiagram(); -} - -void DiagramRecognizer::recognizeDiagram() -{ - //mRecognized = true; - mFormSegmentator = new FormSegmentator(mBitmap); - mFormSegmentator->uniteComponents(); - QList objects = mFormSegmentator->getObjects(); - mDiagram.clear(); - foreach (Component const &object, objects) { - PathVector recognizedObject = mAbstractRecognizer->recognizeObject( - object.figure(mBitmap->xLeft(), mBitmap->yUpper())); - mDiagram.append(recognizedObject); - } - foreach (Component const &edge, mFormSegmentator->getEdges()) { - mDiagram.append(edge.figure(mBitmap->xLeft(), mBitmap->yUpper())); - } - emit print(mDiagram, mBitmap, mFormSegmentator); -} - diff --git a/DiagramRecognizer/diagramrecognizer.h b/DiagramRecognizer/diagramrecognizer.h deleted file mode 100644 index 4940a1e..0000000 --- a/DiagramRecognizer/diagramrecognizer.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once -#include "bitmap.h" -#include "formsegmentator.h" -#include "abstractRecognizer.h" -#include - - -class DiagramRecognizer : public QWidget -{ - Q_OBJECT - -public: - explicit DiagramRecognizer(QWidget *parent = 0); - -public slots: - void clear(); - void recognize(); - void recognizeImage(); -signals: - void print(PathVector mDiagram, Bitmap * mBitmap, FormSegmentator *mFormSegmentator); - -private: - void recognizeDiagram(); - PathVector mDiagram; - Bitmap * mBitmap; - FormSegmentator *mFormSegmentator; - bool mRecognized; - QPoint mComponentPoint; - GesturesManager *mGesturesManager; - AbstractRecognizer *mAbstractRecognizer; -}; diff --git a/DiagramRecognizer/formsegmentator.h b/DiagramRecognizer/formSegmentator.h similarity index 100% rename from DiagramRecognizer/formsegmentator.h rename to DiagramRecognizer/formSegmentator.h diff --git a/DiagramRecognizer/main.cpp b/DiagramRecognizer/main.cpp index f2203a0..8bab19e 100644 --- a/DiagramRecognizer/main.cpp +++ b/DiagramRecognizer/main.cpp @@ -1,12 +1,11 @@ #include -#include "diagramrecognizer.h" +#include "diagramMainWindow.h" int main(int argc, char *argv[]) { - QApplication a(argc, argv); - DiagramRecognizer widget; - widget.setGeometry(100, 100, 500, 355); - widget.show(); + QApplication a(argc, argv); + mainWindow w; + w.show(); - return a.exec(); + return a.exec(); } diff --git a/DiagramRecognizer/mainWindow.ui b/DiagramRecognizer/mainWindow.ui new file mode 100644 index 0000000..6004381 --- /dev/null +++ b/DiagramRecognizer/mainWindow.ui @@ -0,0 +1,162 @@ + + + mainWindow + + + + 0 + 0 + 800 + 600 + + + + MainWindow + + + + + + + + + + + Clear + + + + + + + Recognize + + + + + + + Recognize image + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + Input + + + + + Vectorization + + + + + Dividing + + + + + Uniting + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Exit + + + + + + + + + + + + + + + + 0 + 0 + 800 + 21 + + + + + + + + diff --git a/DiagramRecognizer/output.cpp b/DiagramRecognizer/output.cpp index 4223b82..adab0bd 100644 --- a/DiagramRecognizer/output.cpp +++ b/DiagramRecognizer/output.cpp @@ -1,4 +1,3 @@ - #include #include "output.h" @@ -13,11 +12,12 @@ Output::Output(QWidget *parent) mRecognized = false; } -void Output::draw(PathVector RecognizedDiagram, Bitmap *newBitmap, FormSegmentator *newFormSegmentator) +void Output::draw(PathVector RecognizedDiagram, Bitmap *newBitmap, FormSegmentator *newFormSegmentator, int stageNum) { mBitmap = newBitmap; mDiagram = RecognizedDiagram; mFormSegmentator = newFormSegmentator; + stage = stageNum; this->update(); } @@ -55,9 +55,15 @@ void Output::mouseReleaseEvent(QMouseEvent * event) void Output::paintEvent(QPaintEvent *paintEvent) { QPainter painter(this); + QTime time = QTime::currentTime(); + qsrand((uint)time.msec()); //for random colours generation foreach(PointVector const &scetch, mDiagram) { for (int i = 1; i < scetch.size(); i ++) { QPen pen(Qt::black); + if(stage == 2 || stage == 4) + pen.setColor(Qt::black); + else if(stage == 3) + pen.setColor(QColor::fromRgb(randInt(0,255), randInt(0,255), randInt(0,255))); pen.setWidth(3); if ((scetch.at(0) - scetch.back()).manhattanLength() <= 4) { painter.setPen(pen); @@ -65,7 +71,12 @@ void Output::paintEvent(QPaintEvent *paintEvent) } else { - pen.setColor(Qt::red); + if(stage == 2) + pen.setColor(Qt::black); + else if(stage == 3) + pen.setColor(QColor::fromRgb(randInt(0,255), randInt(0,255), randInt(0,255))); + else if(stage == 4) + pen.setColor(Qt::red); painter.setPen(pen); painter.drawLine(scetch.at(0), scetch.back()); } @@ -115,3 +126,8 @@ void Output::drawDiagram(const Component &component, const QColor &color, QPaint painter->drawRect(rect); } } + +int Output::randInt(int low, int high) +{ + return qrand() % ((high + 1) - low) + low; +} diff --git a/DiagramRecognizer/output.h b/DiagramRecognizer/output.h index e467329..481638a 100644 --- a/DiagramRecognizer/output.h +++ b/DiagramRecognizer/output.h @@ -3,8 +3,9 @@ #include "component.h" #include #include "bitmap.h" -#include "formsegmentator.h" +#include "formSegmentator.h" #include +#include class Output : public QWidget { @@ -14,7 +15,7 @@ class Output : public QWidget explicit Output(QWidget *parent = 0); public slots: - void draw(PathVector RecognizedDiagram, Bitmap * newBitmap, FormSegmentator *newFormSegmentator); + void draw(PathVector RecognizedDiagram, Bitmap * newBitmap, FormSegmentator *newFormSegmentator, int stageNum); protected: void mousePressEvent(QMouseEvent *); @@ -26,8 +27,10 @@ public slots: void drawDiagram(Component const &diagram, QColor const &color, QPainter *painter); + int randInt(int low, int high); PathVector mDiagram; Bitmap * mBitmap; + int stage; bool mLeftButtonPressed; bool mRecognized; FormSegmentator *mFormSegmentator; diff --git a/DiagramRecognizer/paintmanager.cpp b/DiagramRecognizer/paintManager.cpp similarity index 100% rename from DiagramRecognizer/paintmanager.cpp rename to DiagramRecognizer/paintManager.cpp diff --git a/DiagramRecognizer/paintmanager.h b/DiagramRecognizer/paintManager.h similarity index 100% rename from DiagramRecognizer/paintmanager.h rename to DiagramRecognizer/paintManager.h diff --git a/DiagramRecognizer/recognizers/mixedgesturesmanager.cpp b/DiagramRecognizer/recognizers/mixedGesturesManager.cpp similarity index 100% rename from DiagramRecognizer/recognizers/mixedgesturesmanager.cpp rename to DiagramRecognizer/recognizers/mixedGesturesManager.cpp diff --git a/DiagramRecognizer/recognizers/mixedgesturesmanager.h b/DiagramRecognizer/recognizers/mixedGesturesManager.h similarity index 100% rename from DiagramRecognizer/recognizers/mixedgesturesmanager.h rename to DiagramRecognizer/recognizers/mixedGesturesManager.h diff --git a/DiagramRecognizer/recognizers/nearestposgridgesturesmanager.cpp b/DiagramRecognizer/recognizers/nearestPosGridGesturesManager.cpp similarity index 100% rename from DiagramRecognizer/recognizers/nearestposgridgesturesmanager.cpp rename to DiagramRecognizer/recognizers/nearestPosGridGesturesManager.cpp diff --git a/DiagramRecognizer/recognizers/nearestposgridgesturesmanager.h b/DiagramRecognizer/recognizers/nearestPosGridGesturesManager.h similarity index 100% rename from DiagramRecognizer/recognizers/nearestposgridgesturesmanager.h rename to DiagramRecognizer/recognizers/nearestPosGridGesturesManager.h diff --git a/DiagramRecognizer/recognizers/rectanglegesturesmanager.cpp b/DiagramRecognizer/recognizers/rectangleGesturesManager.cpp similarity index 100% rename from DiagramRecognizer/recognizers/rectanglegesturesmanager.cpp rename to DiagramRecognizer/recognizers/rectangleGesturesManager.cpp diff --git a/DiagramRecognizer/recognizers/rectanglegesturesmanager.h b/DiagramRecognizer/recognizers/rectangleGesturesManager.h similarity index 100% rename from DiagramRecognizer/recognizers/rectanglegesturesmanager.h rename to DiagramRecognizer/recognizers/rectangleGesturesManager.h diff --git a/DiagramRecognizer/simpleformsinitializer.h b/DiagramRecognizer/simpleFormsInitializer.h similarity index 100% rename from DiagramRecognizer/simpleformsinitializer.h rename to DiagramRecognizer/simpleFormsInitializer.h