diff --git a/ppg b/ppg index 6bb2183..a14c1d7 100755 Binary files a/ppg and b/ppg differ diff --git a/ppg.cpp b/ppg.cpp index 5dc0601..a504d74 100644 --- a/ppg.cpp +++ b/ppg.cpp @@ -5,6 +5,25 @@ int FPS = 15; int DISCARD_DURATION = 1; +int BUFFER_DURATION = 1; + +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() { @@ -65,10 +84,41 @@ int main() foreheadROI.height *= 0.3; cv::rectangle(frame, foreheadROI, cv::Scalar(0, 0, 255), 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; + } + } + + 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("Color", frame); + + if (cv::waitKey(1000.0/FPS) >= 0) break;