From 0a2111ee0fa4b0a79d1e6f8d0bd03d1e7e792749 Mon Sep 17 00:00:00 2001 From: MPIBR-kretschmerf Date: Wed, 14 Dec 2016 11:28:08 +0100 Subject: [PATCH] Added bright-pupil tracking option --- TrackerPlugin_EyeTracker.cpp | 39 ++++--- TrackerPlugin_EyeTracker.h | 15 +-- TrackerPlugin_EyeTracker.ui | 206 +++++++++++++++++++++++------------ TrackerWorker.cpp | 12 +- TrackerWorker.h | 2 + 5 files changed, 184 insertions(+), 90 deletions(-) diff --git a/TrackerPlugin_EyeTracker.cpp b/TrackerPlugin_EyeTracker.cpp index d3f0681..f6fd240 100644 --- a/TrackerPlugin_EyeTracker.cpp +++ b/TrackerPlugin_EyeTracker.cpp @@ -2,10 +2,13 @@ TrackerPlugin_EyeTracker::TrackerPlugin_EyeTracker(QObject *parent) { - ui = new Ui::TrackerPlugin_PupilDiam; + ui = new Ui::TrackerPlugin_EyeTracker; trackerWorker = new TrackerWorker(); ui->setupUi(this); + ui->label_cornea->setStyleSheet("QLabel { color : magenta; }"); + ui->label_pupil->setStyleSheet("QLabel { color : green; }"); + pixmapItem = new QGraphicsPixmapItem(); plotPens.push_back(new QPen(Qt::green)); @@ -32,11 +35,14 @@ TrackerPlugin_EyeTracker::TrackerPlugin_EyeTracker(QObject *parent) uiPlots.push_back(ui->qwtPlot_4); uiPlots.push_back(ui->qwtPlot_5); - uiSliders.push_back(ui->Slider_1); - uiSliders.push_back(ui->Slider_2); + uiSliders.push_back(ui->horizontalSlider_1); + uiSliders.push_back(ui->horizontalSlider_2); + + uiSliders_Size.push_back(ui->horizontalSlider_Size_1); + uiSliders_Size.push_back(ui->horizontalSlider_Size_2); - uiSliders_Size.push_back(ui->Slider_Size_1); - uiSliders_Size.push_back(ui->Slider_Size_2); + uiLabels.push_back(ui->label_threshold_1); + uiLabels.push_back(ui->label_threshold_2); uiLineEdits.push_back(ui->lineEdit_PupilMinArea); uiLineEdits.push_back(ui->lineEdit_PupilMaxArea); @@ -103,19 +109,19 @@ TrackerPlugin_EyeTracker::TrackerPlugin_EyeTracker(QObject *parent) /*Sliders signalmapper*/ signalMapperSliders = new QSignalMapper(this); /*Connect checkboxes and sliders*/ - connect(ui->Slider_1, SIGNAL(sliderMoved(double)), signalMapperSliders, SLOT(map())); - connect(ui->Slider_2, SIGNAL(sliderMoved(double)), signalMapperSliders, SLOT(map())); - signalMapperSliders->setMapping(ui->Slider_1, 0); - signalMapperSliders->setMapping(ui->Slider_2, 1); + connect(ui->horizontalSlider_1, SIGNAL(valueChanged(int)), signalMapperSliders, SLOT(map())); + connect(ui->horizontalSlider_2, SIGNAL(valueChanged(int)), signalMapperSliders, SLOT(map())); + signalMapperSliders->setMapping(ui->horizontalSlider_1, 0); + signalMapperSliders->setMapping(ui->horizontalSlider_2, 1); connect(signalMapperSliders, SIGNAL(mapped(int)), this, SLOT(onThreshSliderMoved(int))); /*Sliders Size signalmapper*/ signalMapperSliders_Size = new QSignalMapper(this); /*Connect checkboxes and sliders*/ - connect(ui->Slider_Size_1, SIGNAL(sliderMoved(double)), signalMapperSliders_Size, SLOT(map())); - connect(ui->Slider_Size_2, SIGNAL(sliderMoved(double)), signalMapperSliders_Size, SLOT(map())); - signalMapperSliders_Size->setMapping(ui->Slider_Size_1, 0); - signalMapperSliders_Size->setMapping(ui->Slider_Size_2, 1); + connect(ui->horizontalSlider_Size_1, SIGNAL(valueChanged(int)), signalMapperSliders_Size, SLOT(map())); + connect(ui->horizontalSlider_Size_2, SIGNAL(valueChanged(int)), signalMapperSliders_Size, SLOT(map())); + signalMapperSliders_Size->setMapping(ui->horizontalSlider_Size_1, 0); + signalMapperSliders_Size->setMapping(ui->horizontalSlider_Size_2, 1); connect(signalMapperSliders_Size, SIGNAL(mapped(int)), this, SLOT(onSizeSliderMoved(int))); /*LineEdit signalmapper*/ @@ -141,8 +147,11 @@ TrackerPlugin_EyeTracker::TrackerPlugin_EyeTracker(QObject *parent) connect(this, SIGNAL(sizeChanged(int, QSize)), trackerWorker, SLOT(onSizeChanged(int, QSize))); connect(this, SIGNAL(areaContraintsChanged(int,int)), trackerWorker, SLOT(onAreaConstraintsChanged(int,int))); connect(ui->checkBox_showBinary, SIGNAL(clicked(bool)), trackerWorker, SLOT(onShowBinary(bool))); + connect(ui->checkBox_brightPupil, SIGNAL(clicked(bool)), trackerWorker, SLOT(onBrightPupil(bool))); connect(trackerWorker, SIGNAL(trackingResult(std::vector)), this, SLOT(onTrackingResult(std::vector))); // connect(trackerWorker, SIGNAL(trackingResult(TrackingResults)), this, SLOT(onTrackingResult(TrackingResults))); + + } QObject *TrackerPlugin_EyeTracker::worker() @@ -218,13 +227,15 @@ void TrackerPlugin_EyeTracker::onCheckBoxClicked(int index) void TrackerPlugin_EyeTracker::onThreshSliderMoved(int index) { - float value = uiSliders.at(index)->value(); + float value = (uiSliders.at(index)->value()); + uiLabels.at(index)->setText(QString("Threshold: ").append(QString::number(int(value)))); emit(thresholdChanged(index, value)); } void TrackerPlugin_EyeTracker::onSizeSliderMoved(int index) { float value = uiSliders_Size.at(index)->value(); + value = value /100.0; if((rectItems.at(index)->pos().x() + maxRectWidth*value < cameraScene->width()) & (rectItems.at(index)->pos().y() + maxRectWidth*value < cameraScene->height())) { diff --git a/TrackerPlugin_EyeTracker.h b/TrackerPlugin_EyeTracker.h index 44b7e3e..037bb9a 100644 --- a/TrackerPlugin_EyeTracker.h +++ b/TrackerPlugin_EyeTracker.h @@ -1,5 +1,5 @@ -#ifndef PUPILDIAMTRACKER_H -#define PUPILDIAMTRACKER_H +#ifndef EYETRACKER_H +#define EYETRACKER_H #include "TrackerInterface.h" #include "TrackerWorker.h" @@ -24,7 +24,7 @@ namespace Ui { - class TrackerPlugin_PupilDiam; + class TrackerPlugin_EyeTracker; } class TrackerPlugin_EyeTracker : public QWidget, public TrackerInterface @@ -41,7 +41,7 @@ class TrackerPlugin_EyeTracker : public QWidget, public TrackerInterface QSize cameraResolution; private: - Ui::TrackerPlugin_PupilDiam *ui; + Ui::TrackerPlugin_EyeTracker *ui; QGraphicsScene* cameraScene; QGraphicsPixmapItem* pixmapItem; QVector rectItems; @@ -59,8 +59,9 @@ class TrackerPlugin_EyeTracker : public QWidget, public TrackerInterface /*ui pointers for use with signalmapper*/ QVector uiPlots; - QVector uiSliders; - QVector uiSliders_Size; + QVector uiSliders; + QVector uiLabels; + QVector uiSliders_Size; QVector uiCheckboxes; QVector uiLineEdits; @@ -94,4 +95,4 @@ private slots: }; -#endif // PUPILDIAMTRACKER_H +#endif // EYETRACKER_H diff --git a/TrackerPlugin_EyeTracker.ui b/TrackerPlugin_EyeTracker.ui index aff21a1..fcd6a7d 100644 --- a/TrackerPlugin_EyeTracker.ui +++ b/TrackerPlugin_EyeTracker.ui @@ -1,13 +1,13 @@ - TrackerPlugin_PupilDiam - + TrackerPlugin_EyeTracker + 0 0 610 - 909 + 925 @@ -42,7 +42,6 @@ 100 - horizontalLayoutWidget @@ -159,6 +158,9 @@ + + 2 + Qt::Horizontal @@ -180,35 +182,16 @@ 0 - - - - 0.010000000000000 - - - 1.000000000000000 - - - 2 - - - 0 - - - 1.000000000000000 - - - Qt::Horizontal - - - - - - - 255.000000000000000 + + + + + 75 + true + - - Qt::Horizontal + + Pupil @@ -222,14 +205,20 @@ - Pupil min Area + Min Area + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - Pupil max Area + Max Area + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter @@ -240,10 +229,59 @@ + + + + ROI size + + + + + + + Threshold + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + 1 + + + 255 + + + Qt::Horizontal + + + + + + + 0 + + + Qt::Horizontal + + + + + QFrame::Sunken + + + 2 + + + 0 + Qt::Vertical @@ -254,63 +292,93 @@ 0 - + - Cornea max Area + Max Area + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - 0.010000000000000 + + + 50000 - - 1.000000000000000 + + + + + + Min Area - - 2 + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - 0 + + + + + + 0 + + + + + + + + 75 + true + - - 1.000000000000000 + + Cornea - - Qt::Horizontal + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - + + - 50000 + Threshold + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - + + - Cornea min Area + ROI size - - - - 255.000000000000000 + + + + 0 + + + 255 Qt::Horizontal - - - - 0 + + + + 1 + + + Qt::Horizontal @@ -344,6 +412,13 @@ + + + + Bright pupil + + + @@ -355,11 +430,6 @@
qwt_plot.h
1 - - QwtSlider - QWidget -
qwt_slider.h
-
diff --git a/TrackerWorker.cpp b/TrackerWorker.cpp index ece6758..6604397 100644 --- a/TrackerWorker.cpp +++ b/TrackerWorker.cpp @@ -36,7 +36,12 @@ void TrackerWorker::onFrameGrabbed(Mat src) /*Pupil*/ Mat pMask; Mat pRegion = rgb[0].rowRange(rois.at(0).y(),rois.at(0).y() + rois.at(0).height()).colRange(rois.at(0).x(),rois.at(0).x() + rois.at(0).width()); - cv::threshold(pRegion, pMask, thresholds.at(0), 1, THRESH_BINARY_INV); + if(isBrightPupil){ + cv::threshold(pRegion, pMask, thresholds.at(0), 1, THRESH_BINARY); + }else{ + cv::threshold(pRegion, pMask, thresholds.at(0), 1, THRESH_BINARY_INV); + } + std::vector pHierarchy; std::vector > pContours; @@ -148,3 +153,8 @@ void TrackerWorker::onShowBinary(bool showBinary) { this->showBinary = showBinary; } + +void TrackerWorker::onBrightPupil(bool isBrightPupil) +{ + this->isBrightPupil = isBrightPupil; +} diff --git a/TrackerWorker.h b/TrackerWorker.h index 7cd4bc7..087811f 100644 --- a/TrackerWorker.h +++ b/TrackerWorker.h @@ -24,6 +24,7 @@ class TrackerWorker : public QObject, public TrackerWorkerInterface QVector thresholds; QVector areaConstraints; /*Pupil minArea, maxArea, Cornea minArea, maxArea*/ bool showBinary = false; + bool isBrightPupil = false; public slots: void onFrameGrabbed(Mat); @@ -32,6 +33,7 @@ public slots: void onPosChanged(int index, QPoint pos); void onSizeChanged(int index, QSize size); void onShowBinary(bool showBinary); + void onBrightPupil(bool isInverted); signals: