[ADD] auto calibration in game scene

This commit is contained in:
Sem van der Hoeven
2021-06-11 16:46:00 +02:00
parent 3f172e1484
commit 344745d9cf
6 changed files with 96 additions and 25 deletions

View File

@@ -1,6 +1,6 @@
#include "HandDetectRegion.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);
@@ -32,6 +41,30 @@ 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;
}
}
}
//imshow("output" + region_id, frame_out);
//imshow("foreground" + region_id, foreground);
//imshow("handMask" + region_id, handMask);
@@ -47,7 +80,10 @@ 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:putText(camera_frame, calibration_text, cv::Point(5, 400), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255, 0, 255), 2);
}
@@ -102,4 +138,9 @@ namespace computervision
hand_calibrator.SetSkinCalibration(true);
}
void HandDetectRegion::UpdateTime(float delta_time)
{
time += delta_time;
}
}

View File

@@ -2,6 +2,8 @@
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <GLFW/glfw3.h>
#include "async/StaticCameraInstance.h"
#include "calibration/HandCalibrator.h"
#include "BackgroundRemover.h"
@@ -36,8 +38,10 @@ namespace computervision
std::vector<int> CalculateSkinTresholds();
void setSkinTresholds(std::vector<int>& tresholds);
void UpdateTime(float delta_time);
private:
int start_x_pos;
int start_y_pos;
int region_height;
@@ -51,6 +55,15 @@ 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;
};
}

View File

@@ -51,26 +51,19 @@ namespace computervision
bool ObjectDetection::DetectHand(Mat camera_frame, bool& hand_present)
{
//calculate deltatime
double current_time = glfwGetTime();
static double last_frame_time = current_time;
double delt_time = current_time - last_frame_time;
std::cout << "delta time : " << delt_time << std::endl;
last_frame_time = current_time;
time += delt_time;
if (time >= TIME_DURATION)
if (!background_calibrated || !skin_calibrated)
{
std::cout << "timer finised, seconds left: " << seconds_left << std::endl;
seconds_left--;
time = 0;
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();
@@ -119,10 +112,11 @@ namespace computervision
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:putText(camera_frame, calibration_text, cv::Point(5, 400), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255, 0, 255),2);
cv:putText(camera_frame, calibration_text, cv::Point(5, 400), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255, 0, 255), 2);
imshow("camera", camera_frame);
@@ -201,5 +195,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

@@ -86,6 +86,7 @@ namespace computervision
private:
bool is_hand_open;
bool is_hand_present;
void UpdateTime();
};