mirror of
https://github.com/Armored-Dragon/overte.git
synced 2025-03-11 16:13:16 +01:00
Refactor face tracking FPS calculation
This commit is contained in:
parent
23ac8b1c8c
commit
736691e3ec
6 changed files with 69 additions and 69 deletions
|
@ -136,9 +136,6 @@ struct Packet {
|
||||||
|
|
||||||
const float STARTING_DDE_MESSAGE_TIME = 0.033f;
|
const float STARTING_DDE_MESSAGE_TIME = 0.033f;
|
||||||
|
|
||||||
const int FPS_TIMER_DELAY = 2000; // ms
|
|
||||||
const int FPS_TIMER_DURATION = 2000; // ms
|
|
||||||
|
|
||||||
DdeFaceTracker::DdeFaceTracker() :
|
DdeFaceTracker::DdeFaceTracker() :
|
||||||
DdeFaceTracker(QHostAddress::Any, DDE_SERVER_PORT, DDE_CONTROL_PORT)
|
DdeFaceTracker(QHostAddress::Any, DDE_SERVER_PORT, DDE_CONTROL_PORT)
|
||||||
{
|
{
|
||||||
|
@ -171,9 +168,7 @@ DdeFaceTracker::DdeFaceTracker(const QHostAddress& host, quint16 serverPort, qui
|
||||||
_lastLeftEyeBlink(0.0f),
|
_lastLeftEyeBlink(0.0f),
|
||||||
_filteredLeftEyeBlink(0.0f),
|
_filteredLeftEyeBlink(0.0f),
|
||||||
_lastRightEyeBlink(0.0f),
|
_lastRightEyeBlink(0.0f),
|
||||||
_filteredRightEyeBlink(0.0f),
|
_filteredRightEyeBlink(0.0f)
|
||||||
_isCalculatingFPS(false),
|
|
||||||
_frameCount(0)
|
|
||||||
{
|
{
|
||||||
_coefficients.resize(NUM_FACESHIFT_BLENDSHAPES);
|
_coefficients.resize(NUM_FACESHIFT_BLENDSHAPES);
|
||||||
|
|
||||||
|
@ -228,19 +223,18 @@ void DdeFaceTracker::processFinished(int exitCode, QProcess::ExitStatus exitStat
|
||||||
}
|
}
|
||||||
|
|
||||||
void DdeFaceTracker::reset() {
|
void DdeFaceTracker::reset() {
|
||||||
_reset = true;
|
if (_udpSocket.state() == QAbstractSocket::BoundState) {
|
||||||
|
_reset = true;
|
||||||
|
|
||||||
qDebug() << "[Info] Reset DDE Tracking";
|
qCDebug(interfaceapp) << "DDE Face Tracker: Reset";
|
||||||
const char* DDE_RESET_COMMAND = "reset";
|
|
||||||
_udpSocket.writeDatagram(DDE_RESET_COMMAND, DDE_SERVER_ADDR, _controlPort);
|
|
||||||
|
|
||||||
// Log camera FPS after a reset
|
const char* DDE_RESET_COMMAND = "reset";
|
||||||
if (!_isCalculatingFPS) {
|
_udpSocket.writeDatagram(DDE_RESET_COMMAND, DDE_SERVER_ADDR, _controlPort);
|
||||||
QTimer::singleShot(FPS_TIMER_DELAY, this, SLOT(startFPSTimer()));
|
|
||||||
_isCalculatingFPS = true;
|
FaceTracker::reset();
|
||||||
|
|
||||||
|
_reset = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
_reset = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DdeFaceTracker::isActive() const {
|
bool DdeFaceTracker::isActive() const {
|
||||||
|
@ -419,23 +413,10 @@ void DdeFaceTracker::decodePacket(const QByteArray& buffer) {
|
||||||
}
|
}
|
||||||
_lastMessageReceived = usecsNow;
|
_lastMessageReceived = usecsNow;
|
||||||
|
|
||||||
// Count frames if timing
|
FaceTracker::countFrame();
|
||||||
if (_isCalculatingFPS) {
|
|
||||||
_frameCount++;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
qCDebug(interfaceapp) << "[Error] DDE Face Tracker Decode Error";
|
qCDebug(interfaceapp) << "[Error] DDE Face Tracker Decode Error";
|
||||||
}
|
}
|
||||||
_lastReceiveTimestamp = usecTimestampNow();
|
_lastReceiveTimestamp = usecTimestampNow();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DdeFaceTracker::startFPSTimer() {
|
|
||||||
_frameCount = 0;
|
|
||||||
QTimer::singleShot(FPS_TIMER_DURATION, this, SLOT(finishFPSTimer()));
|
|
||||||
}
|
|
||||||
|
|
||||||
void DdeFaceTracker::finishFPSTimer() {
|
|
||||||
qDebug() << "[Info] DDE FPS =" << (float)_frameCount / ((float)FPS_TIMER_DURATION / 1000.0f);
|
|
||||||
_isCalculatingFPS = false;
|
|
||||||
}
|
|
||||||
|
|
|
@ -59,9 +59,6 @@ private slots:
|
||||||
void readPendingDatagrams();
|
void readPendingDatagrams();
|
||||||
void socketStateChanged(QAbstractSocket::SocketState socketState);
|
void socketStateChanged(QAbstractSocket::SocketState socketState);
|
||||||
|
|
||||||
void startFPSTimer();
|
|
||||||
void finishFPSTimer();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DdeFaceTracker();
|
DdeFaceTracker();
|
||||||
DdeFaceTracker(const QHostAddress& host, quint16 serverPort, quint16 controlPort);
|
DdeFaceTracker(const QHostAddress& host, quint16 serverPort, quint16 controlPort);
|
||||||
|
@ -111,9 +108,6 @@ private:
|
||||||
float _filteredLeftEyeBlink;
|
float _filteredLeftEyeBlink;
|
||||||
float _lastRightEyeBlink;
|
float _lastRightEyeBlink;
|
||||||
float _filteredRightEyeBlink;
|
float _filteredRightEyeBlink;
|
||||||
|
|
||||||
bool _isCalculatingFPS;
|
|
||||||
int _frameCount;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_DdeFaceTracker_h
|
#endif // hifi_DdeFaceTracker_h
|
|
@ -9,9 +9,21 @@
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
#include <GLMHelpers.h>
|
#include <GLMHelpers.h>
|
||||||
|
|
||||||
#include "FaceTracker.h"
|
#include "FaceTracker.h"
|
||||||
|
#include "InterfaceLogging.h"
|
||||||
|
|
||||||
|
const int FPS_TIMER_DELAY = 2000; // ms
|
||||||
|
const int FPS_TIMER_DURATION = 2000; // ms
|
||||||
|
|
||||||
|
FaceTracker::FaceTracker() :
|
||||||
|
_isCalculatingFPS(false),
|
||||||
|
_frameCount(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
inline float FaceTracker::getBlendshapeCoefficient(int index) const {
|
inline float FaceTracker::getBlendshapeCoefficient(int index) const {
|
||||||
return isValidBlendshapeIndex(index) ? glm::mix(0.0f, _blendshapeCoefficients[index], getFadeCoefficient())
|
return isValidBlendshapeIndex(index) ? glm::mix(0.0f, _blendshapeCoefficients[index], getFadeCoefficient())
|
||||||
|
@ -65,4 +77,27 @@ void FaceTracker::update(float deltaTime) {
|
||||||
_relaxationStatus = glm::clamp(_relaxationStatus - deltaTime / RELAXATION_TIME, 0.0f, 1.0f);
|
_relaxationStatus = glm::clamp(_relaxationStatus - deltaTime / RELAXATION_TIME, 0.0f, 1.0f);
|
||||||
_fadeCoefficient = std::exp(-(1.0f - _relaxationStatus) * INVERSE_AT_EPSILON);
|
_fadeCoefficient = std::exp(-(1.0f - _relaxationStatus) * INVERSE_AT_EPSILON);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FaceTracker::reset() {
|
||||||
|
if (isActive() && !_isCalculatingFPS) {
|
||||||
|
QTimer::singleShot(FPS_TIMER_DELAY, this, SLOT(startFPSTimer()));
|
||||||
|
_isCalculatingFPS = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FaceTracker::startFPSTimer() {
|
||||||
|
_frameCount = 0;
|
||||||
|
QTimer::singleShot(FPS_TIMER_DURATION, this, SLOT(finishFPSTimer()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void FaceTracker::countFrame() {
|
||||||
|
if (_isCalculatingFPS) {
|
||||||
|
_frameCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FaceTracker::finishFPSTimer() {
|
||||||
|
qCDebug(interfaceapp) << "Face tracker FPS =" << (float)_frameCount / ((float)FPS_TIMER_DURATION / 1000.0f);
|
||||||
|
_isCalculatingFPS = false;
|
||||||
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@ public:
|
||||||
|
|
||||||
virtual void init() {}
|
virtual void init() {}
|
||||||
virtual void update(float deltaTime);
|
virtual void update(float deltaTime);
|
||||||
virtual void reset() {}
|
virtual void reset();
|
||||||
|
|
||||||
float getFadeCoefficient() const;
|
float getFadeCoefficient() const;
|
||||||
|
|
||||||
|
@ -44,6 +44,9 @@ public:
|
||||||
float getBlendshapeCoefficient(int index) const;
|
float getBlendshapeCoefficient(int index) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
FaceTracker();
|
||||||
|
virtual ~FaceTracker() {};
|
||||||
|
|
||||||
glm::vec3 _headTranslation = glm::vec3(0.0f);
|
glm::vec3 _headTranslation = glm::vec3(0.0f);
|
||||||
glm::quat _headRotation = glm::quat();
|
glm::quat _headRotation = glm::quat();
|
||||||
float _estimatedEyePitch = 0.0f;
|
float _estimatedEyePitch = 0.0f;
|
||||||
|
@ -52,6 +55,16 @@ protected:
|
||||||
|
|
||||||
float _relaxationStatus = 0.0f; // Between 0.0f and 1.0f
|
float _relaxationStatus = 0.0f; // Between 0.0f and 1.0f
|
||||||
float _fadeCoefficient = 0.0f; // Between 0.0f and 1.0f
|
float _fadeCoefficient = 0.0f; // Between 0.0f and 1.0f
|
||||||
|
|
||||||
|
void countFrame();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void startFPSTimer();
|
||||||
|
void finishFPSTimer();
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool _isCalculatingFPS;
|
||||||
|
int _frameCount;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_FaceTracker_h
|
#endif // hifi_FaceTracker_h
|
||||||
|
|
|
@ -30,14 +30,9 @@ const QString DEFAULT_FACESHIFT_HOSTNAME = "localhost";
|
||||||
const quint16 FACESHIFT_PORT = 33433;
|
const quint16 FACESHIFT_PORT = 33433;
|
||||||
const float DEFAULT_FACESHIFT_EYE_DEFLECTION = 0.25f;
|
const float DEFAULT_FACESHIFT_EYE_DEFLECTION = 0.25f;
|
||||||
|
|
||||||
const int FPS_TIMER_DELAY = 2000; // ms
|
|
||||||
const int FPS_TIMER_DURATION = 2000; // ms
|
|
||||||
|
|
||||||
Faceshift::Faceshift() :
|
Faceshift::Faceshift() :
|
||||||
_eyeDeflection("faceshiftEyeDeflection", DEFAULT_FACESHIFT_EYE_DEFLECTION),
|
_eyeDeflection("faceshiftEyeDeflection", DEFAULT_FACESHIFT_EYE_DEFLECTION),
|
||||||
_hostname("faceshiftHostname", DEFAULT_FACESHIFT_HOSTNAME),
|
_hostname("faceshiftHostname", DEFAULT_FACESHIFT_HOSTNAME)
|
||||||
_isCalculatingFPS(false),
|
|
||||||
_frameCount(0)
|
|
||||||
{
|
{
|
||||||
#ifdef HAVE_FACESHIFT
|
#ifdef HAVE_FACESHIFT
|
||||||
connect(&_tcpSocket, SIGNAL(connected()), SLOT(noteConnected()));
|
connect(&_tcpSocket, SIGNAL(connected()), SLOT(noteConnected()));
|
||||||
|
@ -83,15 +78,13 @@ void Faceshift::update(float deltaTime) {
|
||||||
|
|
||||||
void Faceshift::reset() {
|
void Faceshift::reset() {
|
||||||
if (_tcpSocket.state() == QAbstractSocket::ConnectedState) {
|
if (_tcpSocket.state() == QAbstractSocket::ConnectedState) {
|
||||||
|
qCDebug(interfaceapp, "Faceshift: Reset");
|
||||||
|
|
||||||
|
FaceTracker::reset();
|
||||||
|
|
||||||
string message;
|
string message;
|
||||||
fsBinaryStream::encode_message(message, fsMsgCalibrateNeutral());
|
fsBinaryStream::encode_message(message, fsMsgCalibrateNeutral());
|
||||||
send(message);
|
send(message);
|
||||||
|
|
||||||
// Log camera FPS after a reset
|
|
||||||
if (!_isCalculatingFPS) {
|
|
||||||
QTimer::singleShot(FPS_TIMER_DELAY, this, SLOT(startFPSTimer()));
|
|
||||||
_isCalculatingFPS = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
_longTermAverageInitialized = false;
|
_longTermAverageInitialized = false;
|
||||||
}
|
}
|
||||||
|
@ -294,10 +287,8 @@ void Faceshift::receive(const QByteArray& buffer) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// Count frames if timing
|
|
||||||
if (_isCalculatingFPS) {
|
FaceTracker::countFrame();
|
||||||
_frameCount++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Faceshift::setEyeDeflection(float faceshiftEyeDeflection) {
|
void Faceshift::setEyeDeflection(float faceshiftEyeDeflection) {
|
||||||
|
@ -308,12 +299,3 @@ void Faceshift::setHostname(const QString& hostname) {
|
||||||
_hostname.set(hostname);
|
_hostname.set(hostname);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Faceshift::startFPSTimer() {
|
|
||||||
_frameCount = 0;
|
|
||||||
QTimer::singleShot(FPS_TIMER_DURATION, this, SLOT(finishFPSTimer()));
|
|
||||||
}
|
|
||||||
|
|
||||||
void Faceshift::finishFPSTimer() {
|
|
||||||
qCDebug(interfaceapp) << "Faceshift: FPS =" << (float)_frameCount / ((float)FPS_TIMER_DURATION / 1000.0f);
|
|
||||||
_isCalculatingFPS = false;
|
|
||||||
}
|
|
||||||
|
|
|
@ -95,8 +95,6 @@ private slots:
|
||||||
void noteError(QAbstractSocket::SocketError error);
|
void noteError(QAbstractSocket::SocketError error);
|
||||||
void readPendingDatagrams();
|
void readPendingDatagrams();
|
||||||
void readFromSocket();
|
void readFromSocket();
|
||||||
void startFPSTimer();
|
|
||||||
void finishFPSTimer();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Faceshift();
|
Faceshift();
|
||||||
|
@ -154,9 +152,6 @@ private:
|
||||||
int _mouthSmileRightIndex = 29;
|
int _mouthSmileRightIndex = 29;
|
||||||
|
|
||||||
int _jawOpenIndex = 21;
|
int _jawOpenIndex = 21;
|
||||||
|
|
||||||
bool _isCalculatingFPS;
|
|
||||||
int _frameCount;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_Faceshift_h
|
#endif // hifi_Faceshift_h
|
||||||
|
|
Loading…
Reference in a new issue