// -*- mode: c++ -*-
-#ifndef __FACIAL_LANDMARK_DETECTOR_H__
-#define __FACIAL_LANDMARK_DETECTOR_H__
+#ifndef FACIAL_LANDMARK_DETECTOR_H
+#define FACIAL_LANDMARK_DETECTOR_H
/****
-Copyright (c) 2020 Adrian I. Lam
+Copyright (c) 2020-2021 Adrian I. Lam
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
#include <deque>
#include <string>
-#include <opencv2/opencv.hpp>
-#include <dlib/image_processing/frontal_face_detector.h>
-#include <dlib/image_processing.h>
-#include <dlib/gui_widgets.h>
+
+struct Point
+{
+ double x;
+ double y;
+
+ Point(double _x = 0, double _y = 0)
+ {
+ x = _x;
+ y = _y;
+ }
+};
class FacialLandmarkDetector
{
bool autoBreath;
bool randomMotion;
// TODO eyebrows currently not supported...
- // I'd like to include them, but the dlib detection is very
+ // I'd like to include them, but the dlib / OSF detection is very
// noisy and inaccurate (at least for my face).
};
FacialLandmarkDetector(std::string cfgPath);
+ ~FacialLandmarkDetector();
Params getParams(void) const;
void mainLoop(void);
private:
+ FacialLandmarkDetector(const FacialLandmarkDetector&) = delete;
+ FacialLandmarkDetector& operator=(const FacialLandmarkDetector &) = delete;
+
enum LeftRight : bool
{
LEFT,
RIGHT
};
- cv::VideoCapture webcam;
- dlib::image_window win;
- dlib::frontal_face_detector detector;
- dlib::shape_predictor predictor;
bool m_stop;
- double calcEyeAspectRatio(dlib::point& p1, dlib::point& p2,
- dlib::point& p3, dlib::point& p4,
- dlib::point& p5, dlib::point& p6) const;
+ int m_sock;
+ static const int m_faceId = 0; // Only support one face for now
+
+ double calcEyeAspectRatio(Point& p1, Point& p2,
+ Point& p3, Point& p4,
+ Point& p5, Point& p6) const;
- double calcRightEyeAspectRatio(dlib::full_object_detection& shape) const;
- double calcLeftEyeAspectRatio(dlib::full_object_detection& shape) const;
+ double calcRightEyeAspectRatio(Point landmarks[]) const;
+ double calcLeftEyeAspectRatio(Point landmarks[]) const;
double calcEyeOpenness(LeftRight eye,
- dlib::full_object_detection& shape,
+ Point landmarks[],
double faceYAngle) const;
- double calcMouthForm(dlib::full_object_detection& shape) const;
- double calcMouthOpenness(dlib::full_object_detection& shape, double mouthForm) const;
+ double calcMouthForm(Point landmarks[]) const;
+ double calcMouthOpenness(Point landmarks[], double mouthForm) const;
- double calcFaceXAngle(dlib::full_object_detection& shape) const;
- double calcFaceYAngle(dlib::full_object_detection& shape, double faceXAngle, double mouthForm) const;
- double calcFaceZAngle(dlib::full_object_detection& shape) const;
+ double calcFaceXAngle(Point landmarks[]) const;
+ double calcFaceYAngle(Point landmarks[], double faceXAngle, double mouthForm) const;
+ double calcFaceZAngle(Point landmarks[]) const;
void populateDefaultConfig(void);
void parseConfig(std::string cfgPath);
struct Config
{
- int cvVideoCaptureId;
- std::string predictorPath;
+ std::string osfIpAddress;
+ int osfPort;
double faceYAngleCorrection;
double eyeSmileEyeOpenThreshold;
double eyeSmileMouthFormThreshold;
double eyeSmileMouthOpenThreshold;
- bool showWebcamVideo;
- bool renderLandmarksOnVideo;
- bool lateralInversion;
std::size_t faceXAngleNumTaps;
std::size_t faceYAngleNumTaps;
std::size_t faceZAngleNumTaps;
std::size_t mouthOpenNumTaps;
std::size_t leftEyeOpenNumTaps;
std::size_t rightEyeOpenNumTaps;
- int cvWaitKeyMs;
double eyeClosedThreshold;
double eyeOpenThreshold;
double mouthNormalThreshold;
double faceYAngleZeroValue;
double faceYAngleUpThreshold;
double faceYAngleDownThreshold;
+ bool winkEnable;
bool autoBlink;
bool autoBreath;
bool randomMotion;