From bfe11e4541cb034f9006d6b07dbc37b9e357589b Mon Sep 17 00:00:00 2001 From: youssef Shaban <85808789+youssef-shaban@users.noreply.github.com> Date: Mon, 20 Mar 2023 19:01:37 +0200 Subject: [PATCH] adding page4 with HoughTransform --- CV/hough.cpp | 120 +++++++++++++ CV/hough.h | 19 +++ a01-team06.pro | 35 ++-- main.cpp | 35 +++- pages/mainwindow.cpp | 35 +++- pages/mainwindow.h | 2 + pages/mainwindow.ui | 7 + pages/page1.cpp | 4 + pages/page1.ui | 16 +- pages/page3.ui | 6 +- pages/page4.cpp | 99 +++++++++++ pages/page4.h | 44 +++++ pages/page4.ui | 310 ++++++++++++++++++++++++++++++++++ resources.qrc | 4 + resources/cursor-png-1108.png | Bin 0 -> 14947 bytes resources/default.png | Bin 0 -> 263 bytes resources/handpointing.png | Bin 0 -> 356 bytes resources/textcursor.png | Bin 0 -> 308 bytes style/Cstartpage.qss | 47 ++++-- 19 files changed, 731 insertions(+), 52 deletions(-) create mode 100644 CV/hough.cpp create mode 100644 CV/hough.h create mode 100644 pages/page4.cpp create mode 100644 pages/page4.h create mode 100644 pages/page4.ui create mode 100644 resources/cursor-png-1108.png create mode 100644 resources/default.png create mode 100644 resources/handpointing.png create mode 100644 resources/textcursor.png diff --git a/CV/hough.cpp b/CV/hough.cpp new file mode 100644 index 0000000..82d2212 --- /dev/null +++ b/CV/hough.cpp @@ -0,0 +1,120 @@ +#include "hough.h" + + +void Hough::HoughLine(cv::Mat edges, std::vector &lines, int threshold, double angleRes) +{ + int width = edges.cols; + int height = edges.rows; + double rhoMax = sqrt(width * width + height * height); + int rhoSize = 2 * round(rhoMax); + int thetaSize = 180 * angleRes; + cv::Mat accumulator = cv::Mat::zeros(rhoSize, thetaSize, CV_32SC1); + + std::vector thetas(thetaSize); + for (int i = 0; i < thetaSize; i++) + { + thetas[i] = i / angleRes; + } + std::cout << thetas[thetas.size() - 1]; + for (int y = 0; y < height; y++) + { + for (int x = 0; x < width; x++) + { + if (edges.at(y, x) > 0) + { + for (int i = 0; i < thetaSize; i++) + { + double rho = x * cos(thetas[i]) + y * sin(thetas[i]); + int rhoIndex = round(rho + rhoMax); + accumulator.at(rhoIndex, i)++; + } + } + } + } + for (int y = 0; y < rhoSize; y++) + { + + for (int x = 0; x < thetaSize; x++) + { + if (accumulator.at(y, x) >= threshold) + { + double rho = y - rhoMax; + double theta = x / angleRes; + lines.push_back(cv::Vec2d(rho, theta)); + } + } + } +} + +void Hough::drawLines(cv::Mat &img, std::vector lines, cv::Scalar color) +{ + for (size_t i = 0; i < lines.size(); i++) + { + double rho = lines[i][0]; + double theta = lines[i][1]; + double a = cos(theta); + double b = sin(theta); + double x0 = a * rho; + double y0 = b * rho; + cv::Point pt1(cvRound(x0 + 1000 * (-b)), cvRound(y0 + 1000 * a)); + cv::Point pt2(cvRound(x0 - 1000 * (-b)), cvRound(y0 - 1000 * a)); + cv::line(img, pt1, pt2,color, 1); + } +} + +void Hough::HoughCircle(cv::Mat edges, std::vector &circles, int threshold, int minRadius, int maxRadius, int radiusStep, QProgressBar* bar) +{ + std::vector>> accumulator(edges.rows, std::vector>(edges.cols, std::vector(maxRadius / radiusStep, 0))); + for (int r = minRadius; r < maxRadius; r += radiusStep) + { + bar->setValue((r -(double)minRadius)/ (maxRadius - (double)minRadius) * 100); + for (int y = 0; y < edges.rows; y++) + { + for (int x = 0; x < edges.cols; x++) + { + if (edges.at(y, x) == 255) + { + for (int k = 0; k < 180; k++) + { + int a = x - r * std::cos(k); + int b = y - r * std::sin(k); + + if (a >= 0 && a < edges.cols && b >= 0 && b < edges.rows) + { + accumulator[b][a][r / radiusStep]++; + } + } + } + } + } + } + + for (int y = 0; y < edges.rows; y++) + { + for (int x = 0; x < edges.cols; x++) + { + for (int r = 0; r < maxRadius / radiusStep; r++) + { + if (accumulator[y][x][r] > threshold) + { + circles.push_back(cv::Vec3d(x, y, r * radiusStep)); + } + } + } + } + bar->setValue(100); +} + +void Hough::drawCircles(cv::Mat &img, std::vector circles, cv::Scalar color) +{ + for (int i = 0; i < circles.size(); i++) + { + cv::Point center = cv::Point(circles[i][0], circles[i][1]); + cv::Scalar color(0, 255, 0); + int size = 5; + cv::circle(img, center, circles[i][2], cv::Scalar(0, 0, 255), 2); + cv::line(img, cv::Point(center.x - size, center.y), cv::Point(center.x + size, center.y), color, 1); + cv::line(img, cv::Point(center.x, center.y - size), cv::Point(center.x, center.y + size), color, 1); + + } +} diff --git a/CV/hough.h b/CV/hough.h new file mode 100644 index 0000000..7ef3bf2 --- /dev/null +++ b/CV/hough.h @@ -0,0 +1,19 @@ +#ifndef HOUGH_H +#define HOUGH_H +#include +#include +#include +#include +#include + +class Hough +{ +public: + Hough(); + static void HoughLine(cv::Mat edges, std::vector& lines, int threshold, double angleRes); + static void drawLines(cv::Mat& img, std::vector lines, cv::Scalar color); + static void HoughCircle(cv::Mat edges, std::vector& circles,int threshold, int minRadius, int maxRadius, int radiusStep,QProgressBar* bar); + static void drawCircles(cv::Mat& img, std::vector circles, cv::Scalar color); +}; + +#endif // HOUGH_H diff --git a/a01-team06.pro b/a01-team06.pro index 46c1bad..2af2f93 100644 --- a/a01-team06.pro +++ b/a01-team06.pro @@ -12,42 +12,45 @@ SOURCES += \ CV/histogram.cpp \ CV/filters.cpp \ CV/frequency.cpp \ - Plot/plotter.cpp \ - qcustomplot.cpp \ +# Plot/plotter.cpp \ + CV/hough.cpp \ + pages/page4.cpp \ +# qcustomplot.cpp \ clickable.cpp \ main.cpp \ pages/page3.cpp \ pages/mainwindow.cpp \ - pages/page2.cpp \ +# pages/page2.cpp \ pages/page1.cpp HEADERS += \ CV/histogram.h \ CV/filters.h \ CV/frequency.h \ - Plot/plotter.h \ - qcustomplot.h \ +# Plot/plotter.h \ + CV/hough.h \ + pages/page4.h \ +# qcustomplot.h \ clickable.h \ pages/page3.h \ pages/mainwindow.h \ - pages/page2.h \ +# pages/page2.h \ pages/page1.h FORMS += \ + pages/page4.ui \ pages/page3.ui \ pages/mainwindow.ui \ - pages/page2.ui \ +# pages/page2.ui \ pages/page1.ui +INCLUDEPATH += C:\Users\youss\Documents\libraries\opencv\build\include -INCLUDEPATH += C:\opencv\release\install\include - -LIBS += C:\opencv\release\bin\libopencv_core470.dll -LIBS += C:\opencv\release\bin\libopencv_highgui470.dll -LIBS += C:\opencv\release\bin\libopencv_imgcodecs470.dll -LIBS += C:\opencv\release\bin\libopencv_imgproc470.dll -LIBS += C:\opencv\release\bin\libopencv_calib3d470.dll -LIBS += C:\opencv\release\bin\libopencv_features2d470.dll - +LIBS += C:\Users\youss\Documents\libraries\opencv\release\bin\libopencv_core470.dll +LIBS += C:\Users\youss\Documents\libraries\opencv\release\bin\libopencv_highgui470.dll +LIBS += C:\Users\youss\Documents\libraries\opencv\release\bin\libopencv_imgcodecs470.dll +LIBS += C:\Users\youss\Documents\libraries\opencv\release\bin\libopencv_imgproc470.dll +LIBS += C:\Users\youss\Documents\libraries\opencv\release\bin\libopencv_features2d470.dll +LIBS += C:\Users\youss\Documents\libraries\opencv\release\bin\libopencv_calib3d470.dll # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin diff --git a/main.cpp b/main.cpp index 7b2ab3c..134c018 100644 --- a/main.cpp +++ b/main.cpp @@ -1,11 +1,44 @@ #include "pages/mainwindow.h" #include +#include +#include +#include +#include "clickable.h" +void changeLabelCursors(const QCursor &newCursor) +{ + // Iterate through all widgets in the application + foreach (QWidget *widget, QApplication::allWidgets()) + { + qDebug()<<"Here"; + // Check if the widget is a QLabel + QLabel *label = qobject_cast(widget); + if (label != nullptr) + { + // Set the new cursor for the QLabel + label->setCursor(newCursor); + } + } +} int main(int argc, char *argv[]) { QApplication a(argc, argv); +// QPixmap pixmap(":/resources/resources/handpointing.png"); +// QPoint hotSpot(11, 10); +// QCursor cursor(pixmap, hotSpot.x(), hotSpot.y()); +// changeLabelCursors(cursor); +// QApplication::setOverrideCursor(cursor); + MainWindow w; + w.show(); - return a.exec(); + a.exec(); + + QList widgets = a.allWidgets(); + qDebug()<setStyleSheet( ts.readAll() ); } + QPixmap pixmap(":/resources/resources/default.png"); + QPoint hotSpot(11, 10); + QCursor cursor(pixmap, hotSpot.x(), hotSpot.y()); + this->setCursor(cursor); QButtonGroup *group = new QButtonGroup(); group->addButton(ui->pushButton); group->addButton(ui->pushButton2); group->addButton(ui->pushButton_3); + group->addButton(ui->pushButton_4); ui->stackedWidget->insertWidget(0,new page1()); - ui->stackedWidget->insertWidget(1,new page2()); +// ui->stackedWidget->insertWidget(1,new page2()); ui->stackedWidget->insertWidget(2,new page3()); + ui->stackedWidget->insertWidget(3,new page4()); ui->stackedWidget->setCurrentIndex(0); connect(ui->pushButton, &QPushButton::clicked, ui->stackedWidget, [=]() { ui->stackedWidget->setCurrentIndex(0); }); - connect(ui->pushButton2, &QPushButton::clicked, ui->stackedWidget, [=]() { - ui->stackedWidget->setCurrentIndex(1); - }); +// connect(ui->pushButton2, &QPushButton::clicked, ui->stackedWidget, [=]() { +// ui->stackedWidget->setCurrentIndex(1); +// }); connect(ui->pushButton_3, &QPushButton::clicked, ui->stackedWidget, [=]() { ui->stackedWidget->setCurrentIndex(2); }); + connect(ui->pushButton_4, &QPushButton::clicked, ui->stackedWidget, [=]() { + ui->stackedWidget->setCurrentIndex(3); + }); + + + QPixmap pointPix(":/resources/resources/handpointing.png"); + QPoint hotSpot2(11, 10); + QCursor pointerCursor(pointPix, hotSpot2.x(), hotSpot2.y()); + QList widgets= this->findChildren(); + foreach (QWidget *widget, widgets) + { + // Check if the widget is a QLabel + Clickable *label = qobject_cast(widget); + if (label != nullptr) + { + // Set the new cursor for the QLabel + label->setCursor(pointerCursor); + continue; + } + } } diff --git a/pages/mainwindow.h b/pages/mainwindow.h index 15115af..e44a500 100644 --- a/pages/mainwindow.h +++ b/pages/mainwindow.h @@ -5,6 +5,8 @@ #include "page3.h" #include "page2.h" #include "page1.h" +#include "pages/page4.h" +#include "clickable.h" QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } diff --git a/pages/mainwindow.ui b/pages/mainwindow.ui index de07a9b..fc038b6 100644 --- a/pages/mainwindow.ui +++ b/pages/mainwindow.ui @@ -72,6 +72,13 @@ + + + + Page 4 + + + diff --git a/pages/page1.cpp b/pages/page1.cpp index dafd147..252b53e 100644 --- a/pages/page1.cpp +++ b/pages/page1.cpp @@ -9,6 +9,10 @@ page1::page1(QWidget *parent) : ui->setupUi(this); ui->stackedWidget->setCurrentIndex(0); ui->label1_1->setText("Noise Value"); + QPixmap pixmap(":/resources/resources/handpointing.png"); + QPoint hotSpot(11, 10); + QCursor cursor(pixmap, hotSpot.x(), hotSpot.y()); + ui->image->setCursor(cursor); } page1::~page1() diff --git a/pages/page1.ui b/pages/page1.ui index c6b3511..45dd7cf 100644 --- a/pages/page1.ui +++ b/pages/page1.ui @@ -461,23 +461,13 @@ - - PointingHandCursor - - QLabel:hover { -background-color: #33b78620; - border: 1px solid #d66d31; - -} + - - :/resources/resources/icons8-upload-32.png - Qt::AlignCenter @@ -526,8 +516,6 @@ background-color: #33b78620; - - - + diff --git a/pages/page3.ui b/pages/page3.ui index 6a23239..674c4b5 100644 --- a/pages/page3.ui +++ b/pages/page3.ui @@ -87,11 +87,7 @@ - QLabel:hover { - background-color: #33b78620; - border: 1px solid #d66d31; - -} + diff --git a/pages/page4.cpp b/pages/page4.cpp new file mode 100644 index 0000000..93f9ef1 --- /dev/null +++ b/pages/page4.cpp @@ -0,0 +1,99 @@ +#include "page4.h" +#include "ui_page4.h" + +page4::page4(QWidget *parent) : + QWidget(parent), + ui(new Ui::page4) +{ + ui->setupUi(this); + connect(ui->comboBox, QOverload::of(&QComboBox::currentIndexChanged), ui->stackedWidget, &QStackedWidget::setCurrentIndex); + ui->stackedWidget->setCurrentIndex(0); + ui->progressBar->setVisible(false); +} + +page4::~page4() +{ + delete ui; +} + +void page4::on_image1_clicked() +{ + fileName = QFileDialog::getOpenFileName(this, "Open Image", "", "Image Files (*.png *.jpg *.bmp *.jpeg)"); + if (!fileName.isEmpty()) { + // read colored image + img = cv::imread(fileName.toStdString()); + QImage qimage(img.data, img.cols, img.rows, QImage::Format_BGR888); + image = QPixmap::fromImage(qimage); + // using canny with image + cv::Canny(img, edges, 100, 200); + rescaleImg(ui->image1, image); + ui->image1->setPixmap(image); + + } +} + +void page4::rescaleImg(QLabel* imgSlot, QPixmap& image) +{ + QSize labelSize = imgSlot->size(); + QSize imageSize = image.size(); + if (imageSize.width() > labelSize.width() || imageSize.height() > labelSize.height()) { + imageSize.scale(labelSize, Qt::KeepAspectRatio); + image =image.scaled(imageSize, Qt::KeepAspectRatio); + } +} + + + +void page4::on_comboBox_currentIndexChanged(int index) +{ + if(index == 0){ + ui->thresholdSpin->setValue(100); + ui->HoughLineAngleSpin->setValue(1.0); + } + else if(index == 1){ + ui->thresholdSpin->setValue(100); + ui->circleMaxRadiusSpin->setValue(100); + ui->circleMinRadiusSpin->setValue(10); + ui->circleRadiusStepSpin->setValue(5); + } + else{ + ui->thresholdSpin->setValue(8); + ui->ellipseMaxRadius->setValue(70); + ui->ellipseMinRadius->setValue(20); + } +} + + +void page4::on_generateBtn_clicked() +{ + cv::Mat output; + img.copyTo(output); + ui->progressBar->setVisible(true); + if(ui->comboBox->currentIndex() == 0){ + std::vector lines; + Hough::HoughLine(edges, lines, ui->thresholdSpin->value(), ui->HoughLineAngleSpin->value()); + Hough::drawLines(output, lines, cv::Scalar(0,0,255)); + + }else if(ui->comboBox->currentIndex() == 1){ + std::vector circles; + Hough::HoughCircle(edges, circles, ui->thresholdSpin->value(), ui->circleMinRadiusSpin->value(), ui->circleMaxRadiusSpin->value(), ui->circleRadiusStepSpin->value(), ui->progressBar); + Hough::drawCircles(output, circles, cv::Scalar(0,0,255)); + } + + + uploadImg(output, ui->image2); + ui->progressBar->setValue(0); + ui->progressBar->setVisible(false); + +} + +void page4::uploadImg(cv::Mat img, QLabel* imgSlot) +{ + QImage qimage2(img.data, img.cols, img.rows,QImage::Format_BGR888); + QPixmap outputPix = QPixmap::fromImage(qimage2); + + rescaleImg(imgSlot, outputPix); + imgSlot->setPixmap(outputPix); +} + + diff --git a/pages/page4.h b/pages/page4.h new file mode 100644 index 0000000..e3f02b1 --- /dev/null +++ b/pages/page4.h @@ -0,0 +1,44 @@ +#ifndef PAGE4_H +#define PAGE4_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Ui { +class page4; +} + +class page4 : public QWidget +{ + Q_OBJECT + +public: + explicit page4(QWidget *parent = nullptr); + ~page4(); + +private slots: + void on_image1_clicked(); + + void on_comboBox_currentIndexChanged(int index); + + void on_generateBtn_clicked(); + +private: + QPixmap image; + cv::Mat img; + cv::Mat edges; + QString fileName; + void rescaleImg(QLabel* imgSlot, QPixmap& image); + void uploadImg(cv::Mat img, QLabel* imgSlot); + Ui::page4 *ui; +}; + +#endif // PAGE4_H diff --git a/pages/page4.ui b/pages/page4.ui new file mode 100644 index 0000000..d6a8c17 --- /dev/null +++ b/pages/page4.ui @@ -0,0 +1,310 @@ + + + page4 + + + + 0 + 0 + 1054 + 689 + + + + Form + + + + + + Before + + + + + + + + + Qt::AlignCenter + + + + + + + + + + After + + + + + + + + + Qt::AlignCenter + + + + + + + + + + + 0 + 0 + + + + Options + + + + + + + 0 + 0 + + + + 24 + + + + + + + + 0 + 0 + + + + 1 + + + + + + + + 0 + 0 + + + + Angle Resolution + + + + + + + 0.500000000000000 + + + 1.000000000000000 + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 40 + 20 + + + + + + + + + + + + + 0 + 0 + + + + Min Radius + + + + + + + 500 + + + + + + + + 0 + 0 + + + + max Radius + + + + + + + 500 + + + + + + + + 0 + 0 + + + + Radius Steps + + + + + + + + + + + + + + + 0 + 0 + + + + Min Radius + + + + + + + + + + + 0 + 0 + + + + Max Radius + + + + + + + + + + + + + + + 0 + 0 + + + + 300 + + + 100 + + + + + + + + 0 + 0 + + + + Threshold + + + + + + + + 0 + 0 + + + + Generate + + + + + + + + Hough Line + + + + + Hough Circle + + + + + Hough Ellipse + + + + + + + + + + + + Clickable + QLabel +
clickable.h
+ + clicked() + +
+
+ + +
diff --git a/resources.qrc b/resources.qrc index dc3865f..fa82b8a 100644 --- a/resources.qrc +++ b/resources.qrc @@ -1,6 +1,10 @@ resources/icons8-upload-32.png + resources/cursor-png-1108.png + resources/default.png + resources/handpointing.png + resources/textcursor.png resources/icons8-upload-32.png diff --git a/resources/cursor-png-1108.png b/resources/cursor-png-1108.png new file mode 100644 index 0000000000000000000000000000000000000000..b95dc01176ebfc0025f82f7893479b789d80eed2 GIT binary patch literal 14947 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 HA7TCnLFja( literal 0 HcmV?d00001 diff --git a/resources/default.png b/resources/default.png new file mode 100644 index 0000000000000000000000000000000000000000..e16a1e599bc7af24620c8cadd19a13e8452edbdc GIT binary patch literal 263 zcmV+i0r>ujP)kdg0002aNkl6vy#1MX)KDAiRPJcvVH=8vKcZs!+{6a051OK~h}9TWEsjC6WAl_BH=TeV(V7 z`ITS$?Cfmki2U=b!L^?4Rj?vZLY4D|oCRP-JOH6)O1yv@aoLcy0E9Xh zUz_*@jEFZ7Aw`NF_++$!G(r(zj)%vTh!)UcPYhuKErTU?Va2eI;G))qv;melgb!N> zVGKQ8U_s*E?GZwfkdg0003iNklmp znYP*Xcu|kfeac6VG^Vdy?9h3(LI^)|q14K%84(1;->g=52MVn!rPm zdxmpU{I-q;R88A?3P>@8qXHCxcN{U)r>cUX+#6895e4ReIUF+|YLW{JoBS|<0Sr)~ zCna}0#}|AvfB_6}fZ}qgFPKT=hyW2F!X2I0vgF!$DEkByfjm%T4UMWMW3zd_Y}rdC zn~{ua)qJ_i8WCFwZA_QFS=G#|fcn)XN4qRF{8yhnm+=4a10ERw0000kdg0002{Nkl~e}{FZ5aVa9;N53u3cCK==f0OpNETxxy*jHW08A zFEf3K4qBLL@6A*25~xXcu2X!FJfIfU0}i|>u!}D89{`7c1d2E96s+66L@pq5h6HtR z6*&QoMHGNy6y1TaLM8Df9x*F8jt7p}DR3Ns6pd>5s#CmEIY2!aF!|bK)WAKO$mqw| zX&~VF0yoIX*_^J?3P0z~$b7FBxP`*qYFVt!vi+R^0000