From 06c6fb678c3d72ae644626c52bacf004a647b341 Mon Sep 17 00:00:00 2001 From: Thiago Santini Date: Fri, 8 Dec 2017 15:25:36 +0100 Subject: [PATCH] Improves calibration overlay --- EyeRecToo/src/GazeEstimation.cpp | 85 +++++++++++++++++++------------- EyeRecToo/src/GazeEstimation.h | 5 +- EyeRecToo/src/utils.h | 1 + 3 files changed, 55 insertions(+), 36 deletions(-) diff --git a/EyeRecToo/src/GazeEstimation.cpp b/EyeRecToo/src/GazeEstimation.cpp index 22a56ee..a34ca84 100644 --- a/EyeRecToo/src/GazeEstimation.cpp +++ b/EyeRecToo/src/GazeEstimation.cpp @@ -7,7 +7,8 @@ GazeEstimation::GazeEstimation(QObject *parent) : QObject(parent), calibrated(false), isCalibrating(false), - gazeEstimationMethod(NULL), + gazeEstimationMethod(NULL), + lastOverlayIdx(0), settings(NULL) { availableGazeEstimationMethods.push_back( new PolyFit(PolyFit::POLY_1_X_Y_XY_XX_YY_XYY_YXX_XXYY) ); @@ -37,7 +38,7 @@ void GazeEstimation::reset(CollectionTuple::TupleType type) { for (size_t i=collectedTuples.size(); i-->0;) if (collectedTuples[i].tupleType == type) - collectedTuples.erase(collectedTuples.begin() + i); + collectedTuples.erase(collectedTuples.begin() + i); } bool GazeEstimation::isPupilOutlineValid(const EyeData &cur) @@ -595,52 +596,66 @@ void GazeEstimation::drawGazeEstimationInfo(DataTuple &dataTuple) if (!shouldDisplay) return; - // avoid drawing every single frame - static Timestamp lastGazeEstimationVisualizationTimestamp = 0; - Timestamp current = gTimer.elapsed(); - bool shouldDraw = current - lastGazeEstimationVisualizationTimestamp > 40; - if (!shouldDraw) - return; - - dataTuple.showGazeEstimationVisualization = true; + dataTuple.showGazeEstimationVisualization = true; + dataTuple.gazeEstimationVisualization = vis; - // frame is already old; display old visualization instead to save processing - if (current - dataTuple.field.timestamp > 100) - return; + // avoid drawing every single frame + static Timestamp lastGazeEstimationVisualizationTimestamp = 0; + Timestamp current = gTimer.elapsed(); + bool shouldDraw = current - lastGazeEstimationVisualizationTimestamp > 40; + if (!shouldDraw) + return; + lastGazeEstimationVisualizationTimestamp = current; - vis = dataTuple.field.input.clone(); + vis = dataTuple.field.input.clone(); int r = max( 1, 0.003125*max(vis.rows, vis.cols) ); - if (isCalibrating) { - for (size_t i=0; i collectedTuples.size()) // sample removed, restart + lastOverlayIdx = 0; + + if (lastOverlayIdx == 0) + overlay = Mat::zeros( vis.rows, vis.cols, CV_8UC3); + + for ( ; lastOverlayIdx < collectedTuples.size(); lastOverlayIdx++) { + circle(overlay, to2D(collectedTuples[lastOverlayIdx].field.collectionMarker.center), r, CV_ALMOST_BLACK, -1); + if (collectedTuples[lastOverlayIdx].isCalibration()) + circle(overlay, to2D(collectedTuples[lastOverlayIdx].field.collectionMarker.center), r+1, CV_GREEN, 0.5*r); + else + circle(overlay, to2D(collectedTuples[lastOverlayIdx].field.collectionMarker.center), r+1, CV_CYAN, 0.5*r); + } + + } else { + // Calibration finished; overlay results and restart + overlay = Mat::zeros( vis.rows, vis.cols, CV_8UC3); + lastOverlayIdx = 0; + + if (!interpolationHull.empty()) { vector< vector > contours; contours.push_back(interpolationHull); - drawContours(vis, contours, 0, CV_GREEN, r); + drawContours(overlay, contours, 0, CV_GREEN, r); } for (size_t i=0; ifield.collectionMarker.center), r, CV_BLACK, -1); + cv::circle( in, to2D(selected->field.collectionMarker.center), r, CV_ALMOST_BLACK, -1); cv::circle( in, to2D(selected->field.collectionMarker.center), r+1, CV_GREEN, r); } else cv::ellipse(in, el, CV_RED, 0.5*r); @@ -207,6 +207,9 @@ private: std::vector errorVectors; QElapsedTimer autoVisualizationTimer; cv::Mat vis; + cv::Mat overlay; + int lastOverlayIdx; + private slots: void detectOutliers(); diff --git a/EyeRecToo/src/utils.h b/EyeRecToo/src/utils.h index 75019e4..16145c3 100644 --- a/EyeRecToo/src/utils.h +++ b/EyeRecToo/src/utils.h @@ -93,6 +93,7 @@ Q_DECLARE_METATYPE(enum CVFlip) #define CV_MAGENT cv::Scalar(0x81,0x40,0xff) #define CV_WHITE cv::Scalar(0xff,0xff,0xff) #define CV_BLACK cv::Scalar(0x00,0x00,0x00) +#define CV_ALMOST_BLACK cv::Scalar(0x01,0x01,0x01) template void set(const QSettings *settings, const QString key, T &v) { -- GitLab