From d90d3ae2b42d82b69f2fab847f74afe6d0f81d66 Mon Sep 17 00:00:00 2001 From: Thomas Perin Date: Fri, 24 Feb 2023 12:06:11 +0100 Subject: [PATCH] Lab1 Progress, begining of calculations --- ppg.cpp | 98 ++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 69 insertions(+), 29 deletions(-) diff --git a/ppg.cpp b/ppg.cpp index 9ba06e6..ba461a8 100644 --- a/ppg.cpp +++ b/ppg.cpp @@ -2,7 +2,6 @@ #include "opencv2/videoio.hpp" #include "opencv2/highgui.hpp" -#include const int FPS = 30; bool isDiscardData = true; @@ -10,15 +9,26 @@ int countDiscard = 0; const int DISCARD_DURATION = 5; const int BUFFER_DURATION = 30; +template +cv::Mat plotGraph(std::vector& vals, int YRange[2]) +{ + auto it = minmax_element(vals.begin(), vals.end()); + float scale = 1./ceil(*it.second - *it.first); + float bias = *it.first; + int rows = YRange[1] - YRange[0] + 1; + cv::Mat image = 255*cv::Mat::ones( rows, vals.size(), CV_8UC3 ); + image.setTo(255); + for (int i = 0; i < (int)vals.size()-1; i++) + { + cv::line(image, cv::Point(i, rows - 1 - (vals[i] - bias)*scale*YRange[1]), cv::Point(i+1, rows - 1 - (vals[i+1] - bias)*scale*YRange[1]), cv::Scalar(255, 0, 0), 1); + } + return image; +} + int main() { cv::VideoCapture cap; cap.open(0); - if (!cap.isOpened()) - { - std::cerr << "[ERROR] Unable to open camera!" << std::endl; - return -2; - } //If Haard Cascade not found: error cv::CascadeClassifier faceDetector; if( !faceDetector.load("./haarcascade_frontalface_alt.xml")) @@ -26,6 +36,12 @@ int main() std::cerr << "[ERROR] Unable to load face cascade" << std::endl; return -1; }; + cv::Rect foreheadROI; + if (!cap.isOpened()) + { + std::cerr << "[ERROR] Unable to open camera!" << std::endl; + return -2; + } while (true) { @@ -50,36 +66,60 @@ int main() //Draw Rectangle around the face std::vector faceRectangles; - faceDetector.detectMultiScale(frame, faceRectangles, 1.1, 3, 0, - cv::Size(20, 20)); - cv::rectangle(frame, faceRectangles[0], cv::Scalar(0, 0, 255), 1, 1, 0); - //Reduce to ROI - cv::Rect foreheadROI; - foreheadROI = faceRectangles[0]; - foreheadROI.height *= 0.3; - cv::rectangle(frame, foreheadROI, cv::Scalar(255, 0, 0), 1, 1, 0); - + faceDetector.detectMultiScale(frame, faceRectangles, 1.1, 3, 0,cv::Size(20, 20)); + + if (faceRectangles.size() > 0) + { + foreheadROI = faceRectangles[0]; + foreheadROI.height *= 0.3; + + cv::rectangle(frame, faceRectangles[0], cv::Scalar(0, 0, 255), 1, 1, 0); + cv::rectangle(frame, foreheadROI, cv::Scalar(255, 0, 0), 1, 1, 0); + + cv::Mat frame_forehead = frame(foreheadROI); + cv::Scalar avg_forehead = mean(frame_forehead); + + bool isBufferFull = false; + int sampleIdBuffer = 0; + cv::Mat greenSignal(1, FPS*BUFFER_DURATION, CV_64F); + if (!isBufferFull) + { + greenSignal.at(0, sampleIdBuffer) = avg_forehead[1] ; + sampleIdBuffer++; + if (sampleIdBuffer == FPS*BUFFER_DURATION) + { + isBufferFull = true; + } + } + else + { + std::vector greenSignalNormalized; + cv::Scalar mean, stddev; + cv::meanStdDev(greenSignal, mean, stddev); + for (int l_sample=0; l_sample < FPS*BUFFER_DURATION; l_sample++) + { + greenSignalNormalized.push_back((greenSignal.at(0, l_sample) - mean[0])/stddev[0]); + } + + + int range[2] = {0, (int)(FPS*BUFFER_DURATION)}; + cv::imshow("green", plotGraph(greenSignalNormalized, range)); + + + } + + + } cv::imshow("Your Face PLS", frame); if (cv::waitKey(1000.0/FPS) >= 0) break; - cv::Mat frame_forehead = frame(foreheadROI); - cv::Scalar avg_forehead = mean(frame_forehead); - bool isBufferFull = false; - int sampleIdBuffer = 0; - cv::Mat greenSignal(1, FPS*BUFFER_DURATION, CV_64F); - if (!isBufferFull) - { - greenSignal.at(0, sampleIdBuffer) = avg_forehead[1] ; - sampleIdBuffer++; - if (sampleIdBuffer == FPS*BUFFER_DURATION) - { - isBufferFull = true; - } - } + } + } + return 0; }