[MERGE] develop into this

This commit is contained in:
Sem van der Hoeven
2021-06-18 15:25:15 +02:00
21 changed files with 461 additions and 106 deletions

View File

@@ -1,4 +1,4 @@
#include "BackgroundRemover.h"
#include "background_remover.h"
/*
Author: Pierfrancesco Soffritti https://github.com/PierfrancescoSoffritti

View File

@@ -1,4 +1,4 @@
#include "FingerCount.h"
#include "finger_count.h"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"

View File

@@ -1,6 +1,6 @@
#include "HandDetectRegion.h"
#include "hand_detect_region.h"
#define TIME_DURATION 1.0f
namespace computervision
{
@@ -20,6 +20,15 @@ namespace computervision
Mat input_frame = GenerateHandMaskSquare(camera_frame);
frame_out = input_frame.clone();
if (!background_calibrated || !skin_calibrated)
if (time >= TIME_DURATION)
{
//std::cout << "timer finised, seconds left: " << seconds_left << std::endl;
seconds_left--;
time = 0;
}
// detect skin color
skin_detector.drawSkinColorSampler(camera_frame,start_x_pos,start_y_pos,region_width,region_height);
@@ -33,6 +42,29 @@ namespace computervision
// draw the hand rectangle on the camera input, and draw text showing if the hand is open or closed.
DrawHandMask(&camera_frame);
if (seconds_left <= 0)
{
if (!background_calibrated)
{
background_remover.calibrate(input_frame);
background_calibrated = true;
hand_calibrator.SetBackGroundCalibrated(background_calibrated);
seconds_left = 5;
time = 0;
}
else
{
if (!skin_calibrated)
{
if (is_main_skin_detection_region)
skin_timer_callback();
}
}
}
// uncomment these lines to show debug hand information
//imshow("output" + region_id, frame_out);
//imshow("foreground" + region_id, foreground);
//imshow("handMask" + region_id, handMask);
@@ -48,7 +80,17 @@ namespace computervision
hand_calibrator.DrawBackgroundSkinCalibrated(camera_frame);
std::string calibration_text = (!background_calibrated ? "calibrating background in " : (!skin_calibrated ? "calibrating skin in " : ""));
calibration_text += std::to_string(seconds_left);
if (!background_calibrated || !skin_calibrated)
{
cv::rectangle(camera_frame, cv::Rect(0, camera_frame.rows - 130, 600, 60), cv::Scalar(0, 0, 0), -1);
cv:putText(camera_frame, calibration_text, cv::Point(5, 400), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255, 0, 255), 2);
}
if (background_calibrated && !skin_calibrated)
{
cv::putText(camera_frame, "put your hand in the left square", cv::Point(5, camera_frame.rows - 105), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255, 0, 255), 2);
}
}
@@ -93,6 +135,8 @@ namespace computervision
{
std::cout << "calibrating skin " << region_id << std::endl;
hand_calibrator.SetSkinCalibration(true);
skin_calibrated = true;
time = 0;
return skin_detector.calibrateAndReturn(frame_out);
}
@@ -101,6 +145,13 @@ namespace computervision
std::cout << "setting skin " << region_id << std::endl;
skin_detector.setTresholds(tresholds);
hand_calibrator.SetSkinCalibration(true);
skin_calibrated = true;
time = 0;
}
void HandDetectRegion::UpdateTime(float delta_time)
{
time += delta_time;
}
}

View File

@@ -2,11 +2,13 @@
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <GLFW/glfw3.h>
#include "async/StaticCameraInstance.h"
#include "calibration/HandCalibrator.h"
#include "BackgroundRemover.h"
#include "SkinDetector.h"
#include "FingerCount.h"
#include "background_remover.h"
#include "skin_detector.h"
#include "finger_count.h"
namespace computervision
{
class HandDetectRegion
@@ -36,8 +38,12 @@ namespace computervision
std::vector<int> CalculateSkinTresholds();
void setSkinTresholds(std::vector<int>& tresholds);
void UpdateTime(float delta_time);
void SetMainSkinDetecRegion(bool val) { is_main_skin_detection_region = val; };
void SetSkinTimerCallback(std::function<void()> fun) { skin_timer_callback = fun; };
private:
int start_x_pos;
int start_y_pos;
int region_height;
@@ -51,6 +57,17 @@ namespace computervision
std::string region_id;
bool DrawHandMask(cv::Mat* input);
float time = 0;
int seconds_left = 5; // calibration countdown
bool background_calibrated = false;
bool skin_calibrated = false;
bool is_main_skin_detection_region = false;
std::function<void()> skin_timer_callback;
};
}

View File

@@ -1,14 +1,7 @@
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/video.hpp>
#include "object_detection.h"
#include "ObjectDetection.h"
#include "BackgroundRemover.h"
#include "SkinDetector.h"
#include "FingerCount.h"
#include "async/StaticCameraInstance.h"
#include "calibration/HandCalibrator.h"
#define TIME_DURATION 1.0f
namespace computervision
{
@@ -25,6 +18,11 @@ namespace computervision
handcalibration::HandCalibrator hand_calibrator;
cv::VideoCapture cap = static_camera::getCap();
float time = 0;
int seconds_left = 5; // calibration countdown
bool background_calibrated = false;
bool skin_calibrated = false;
ObjectDetection::ObjectDetection()
{
@@ -42,6 +40,20 @@ namespace computervision
bool ObjectDetection::DetectHand(Mat camera_frame, bool& hand_present)
{
//calculate deltatime
if (!background_calibrated || !skin_calibrated)
{
UpdateTime();
if (time >= TIME_DURATION)
{
std::cout << "timer finised, seconds left: " << seconds_left << std::endl;
seconds_left--;
time = 0;
}
}
Mat input_frame = GenerateHandMaskSquare(camera_frame);
frame_out = input_frame.clone();
@@ -62,38 +74,59 @@ namespace computervision
// draw the hand rectangle on the camera input, and draw text showing if the hand is open or closed.
DrawHandMask(&camera_frame);
if (seconds_left <= 0)
{
if (!background_calibrated)
{
background_remover.calibrate(input_frame);
background_calibrated = true;
hand_calibrator.SetBackGroundCalibrated(background_calibrated);
seconds_left = 5;
time = 0;
}
else
{
if (!skin_calibrated)
{
skin_detector.calibrate(input_frame);
skin_calibrated = true;
hand_calibrator.SetSkinCalibration(skin_calibrated);
time = 0;
}
}
}
hand_calibrator.SetAmountOfFingers(fingers_amount);
finger_count.DrawHandContours(camera_frame);
hand_calibrator.DrawHandCalibrationText(camera_frame);
std::string calibration_text = (!background_calibrated ? "calibrating background in " : (!skin_calibrated ? "calibrating skin in " : ""));
calibration_text += std::to_string(seconds_left);
if (!background_calibrated || !skin_calibrated)
{
cv::rectangle(camera_frame, cv::Rect(0, camera_frame.rows - 120, 500, 50), cv::Scalar(0, 0, 0), -1);
cv::putText(camera_frame, calibration_text, cv::Point(5, camera_frame.rows-80), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255, 0, 255), 2);
}
if (background_calibrated && !skin_calibrated)
{
cv::putText(camera_frame, "put your hand in the square", cv::Point(5, camera_frame.rows - 100), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255, 0, 255), 2);
}
imshow("camera", camera_frame);
// uncomment these lines to show debug hand information
/*imshow("output", frame_out);
imshow("foreground", foreground);
imshow("handMask", handMask);
imshow("handDetection", fingerCountDebug);*/
hand_present = hand_calibrator.CheckIfHandPresent(handMask,handcalibration::HandDetectionType::MENU);
hand_present = hand_calibrator.CheckIfHandPresent(handMask, handcalibration::HandDetectionType::MENU);
hand_calibrator.SetHandPresent(hand_present);
int key = waitKey(1);
if (key == 98) // b, calibrate the background
{
background_remover.calibrate(input_frame);
hand_calibrator.SetBackGroundCalibrated(true);
}
else if (key == 115) // s, calibrate the skin color
{
skin_detector.calibrate(input_frame);
hand_calibrator.SetSkinCalibration(true);
}
return fingers_amount > 0;
}
@@ -144,5 +177,15 @@ namespace computervision
imshow("Webcam image", img);
}
void ObjectDetection::UpdateTime()
{
double current_time = glfwGetTime();
static double last_frame_time = current_time;
double delt_time = current_time - last_frame_time;
last_frame_time = current_time;
time += delt_time;
}
}

View File

@@ -8,6 +8,14 @@
#include <opencv2/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/video.hpp>
#include <GLFW/glfw3.h>
#include "background_remover.h"
#include "skin_detector.h"
#include "finger_count.h"
#include "async/StaticCameraInstance.h"
#include "calibration/HandCalibrator.h"
namespace computervision
@@ -86,6 +94,7 @@ namespace computervision
private:
bool is_hand_open;
bool is_hand_present;
void UpdateTime();
};

View File

@@ -1,4 +1,4 @@
#include "SkinDetector.h"
#include "skin_detector.h"
#include <iostream>
/*