Implémentation basique notes avec les doigts

This commit is contained in:
Quentin Roussel
2023-05-04 13:45:21 +02:00
parent b709602be6
commit 6fcc0e6ac0
7 changed files with 101 additions and 15 deletions

View File

@@ -118,7 +118,7 @@ class HandDetector():
class FingerCountDetector(): class FingerCountDetector():
def __init__(self): def __init__(self):
self.BUFFER_LENGTH = 20 self.BUFFER_LENGTH = 40
self.DETECTION_THRESHOLD = 1/2 self.DETECTION_THRESHOLD = 1/2
self.hands = mp_hands.Hands(static_image_mode=False, max_num_hands=2, min_detection_confidence=0.5, min_tracking_confidence=0.5) self.hands = mp_hands.Hands(static_image_mode=False, max_num_hands=2, min_detection_confidence=0.5, min_tracking_confidence=0.5)
self.buffer = [] self.buffer = []

View File

@@ -51,6 +51,7 @@ class Manager():
if(res != False): if(res != False):
self.state = 1 self.state = 1
self.timeLastChange = time.time() self.timeLastChange = time.time()
print("Change to state 1")
self.server.sendMessage({"type": "state", "state": 1}) self.server.sendMessage({"type": "state", "state": 1})
#Envoie la position de la main a l'écran et passe a l'étape suivante si une main est detectée pendant assez longtemps #Envoie la position de la main a l'écran et passe a l'étape suivante si une main est detectée pendant assez longtemps
@@ -63,7 +64,26 @@ class Manager():
res = self.handDetector.loop() res = self.handDetector.loop()
if(res != False): if(res != False):
state, coords, size, finalDecision, progress = res state, coords, size, finalDecision, progress = res
self.server.sendMessage({"type": "effects", "effects": [{"type": "loading", "x":coords[0], "y": coords[1], "width": size, "height": size, "progress": progress},{"type": state, "x":coords[0], "y": coords[1], "width": size, "height": size}]}) self.server.sendMessage({
"type": "effects",
"effects": [
{
"type": "loading",
"x":coords[0],
"y": coords[1],
"width": size,
"height": size,
"progress": progress
},
{
"type": state,
"x":coords[0],
"y": coords[1],
"width": size,
"height": size
}
]
})
self.isLastHandPacketEmpty = False self.isLastHandPacketEmpty = False
self.timeLastChange = time.time() self.timeLastChange = time.time()
if(finalDecision != False): if(finalDecision != False):
@@ -75,25 +95,41 @@ class Manager():
self.isLastHandPacketEmpty = True self.isLastHandPacketEmpty = True
def grade(self): def grade(self):
#Premier passage dans la boucle
if(self.currentCriteria == None): if(self.currentCriteria == None):
self.currentCriteria = 0 self.currentCriteria = 0
self.server.sendMessage({"type":"new_criteria","criteria":self.criteria_list[self.currentCriteria]}) self.server.sendMessage({
"type": "state",
"state": 2
})
self.server.sendMessage({
"type":"new_criteria",
"criteria":self.criteria_list[self.currentCriteria]
})
return return
grade = self.fingerCountDetector.loop() grade = self.fingerCountDetector.loop()
if(grade != None): if(grade != None):
self.avis["notes_autres"][self.criteria_list[self.currentCriteria]] = grade self.avis["notes_autres"][self.criteria_list[self.currentCriteria]] = grade
self.server.sendMessage({
"type":"criteria_grade",
"grade":grade
})
time.sleep(3)
self.currentCriteria+=1 self.currentCriteria+=1
if(self.currentCriteria < len(self.criteria_list)): if(self.currentCriteria < len(self.criteria_list)):
self.server.sendMessage({"type":"new_criteria","criteria":self.criteria_list[self.currentCriteria]}) self.server.sendMessage({
"type":"new_criteria",
"criteria":self.criteria_list[self.currentCriteria]
})
self.fingerCountDetector.reset() self.fingerCountDetector.reset()
else: else:
print("Change to state 3")
self.state = 3 self.state = 3
self.server.sendMessage({"type": "state", "state": 3}) self.server.sendMessage({"type": "state", "state": 3})
def audio(self): def audio(self):
time.sleep(3)
self.server.sendMessage({"type":"recording_started"}) self.server.sendMessage({"type":"recording_started"})
with sr.Microphone() as source: with sr.Microphone() as source:
audio = self.recongizer.listen(source) audio = self.recongizer.listen(source)

View File

@@ -109,7 +109,6 @@ class CameraPage {
height = height * this.videoHeight * 2; height = height * this.videoHeight * 2;
x = x * this.videoWidth - width / 2; x = x * this.videoWidth - width / 2;
y = y * this.videoHeight - height / 2; y = y * this.videoHeight - height / 2;
console.log(width, height);
if (effect.type == "thumbs_down") { if (effect.type == "thumbs_down") {
this._drawThumbsDown(x, y, width, height); this._drawThumbsDown(x, y, width, height);
} }

View File

@@ -0,0 +1,23 @@
class GradePage {
constructor() {
this.isEnabled = false;
this.DOMElement = document.getElementById("grade");
}
set enabled(isEnabled) {
this.isEnabled = isEnabled;
this.DOMElement.style.display = isEnabled ? "block" : "none";
}
onNewCriteria(criteriaName) {
document.getElementById("criteria").innerHTML = criteriaName;
document.getElementById("criteria-grade").innerHTML = "";
}
onNewGrade(grade) {
document.getElementById("criteria-grade").innerHTML = grade;
}
reset() {
document.getElementById("criteria-grade").innerHTML = "";
document.getElementById("criteria").innerHTML = "";
}
}

View File

@@ -1,5 +1,5 @@
class WebsocketClient { class WebsocketClient {
constructor(onNewEffects, onNewState, onNewGrade, onReset, onRecordingDone) { constructor(onNewEffects, onNewState, onNewGrade, onReset, onRecordingDone, onNewCriteria, onNewCriteriaGrade) {
this.socket = new WebSocket("ws://localhost:5000"); this.socket = new WebSocket("ws://localhost:5000");
this.socket.addEventListener("open", (event) => { this.socket.addEventListener("open", (event) => {
this.socket.send("connected"); this.socket.send("connected");
@@ -10,16 +10,25 @@ class WebsocketClient {
let msg = JSON.parse(event.data); let msg = JSON.parse(event.data);
if (msg.type == "effects") { if (msg.type == "effects") {
onNewEffects(msg.effects); onNewEffects(msg.effects);
}else if(msg.type == "state") { }
else if(msg.type == "state") {
onNewState(msg.state); onNewState(msg.state);
}else if(msg.type == "new_grade") { }
else if(msg.type == "new_grade") {
onNewGrade(msg.word); onNewGrade(msg.word);
}else if(msg.type == "reset") { }
else if(msg.type == "reset") {
onReset(); onReset();
} }
else if(msg.type == "recording_done") { else if(msg.type == "recording_done") {
onRecordingDone(); onRecordingDone();
} }
else if(msg.type == "new_criteria") {
onNewCriteria(msg.criteria)
}
else if(msg.type == "criteria_grade") {
onNewCriteriaGrade(msg.grade);
}
}; };
} }
} }

View File

@@ -1,8 +1,9 @@
const STATE = { const STATE = {
sleeping: 0, sleeping: 0,
video: 1, video: 1,
audio: 2, grade: 2,
thankYou: 3, audio: 3,
thankYou: 4,
}; };
class StateManager { class StateManager {
@@ -12,6 +13,7 @@ class StateManager {
this._sleepingPage = new SleepingPage(); this._sleepingPage = new SleepingPage();
this._audioPage = new AudioPage(); this._audioPage = new AudioPage();
this._thankYouPage = new ThankYouPage(); this._thankYouPage = new ThankYouPage();
this._gradePage = new GradePage();
this.wsClient = new WebsocketClient( this.wsClient = new WebsocketClient(
(effects) => { (effects) => {
@@ -22,22 +24,30 @@ class StateManager {
(grade) => this._audioPage.setGrade(grade), (grade) => this._audioPage.setGrade(grade),
() => this.reset(), () => this.reset(),
() => this._audioPage.onRecordingDone(), () => this._audioPage.onRecordingDone(),
(crit) => this._gradePage.onNewCriteria(crit),
(grade) => this._gradePage.onNewGrade(grade),
); );
this._sleepingPage.enabled = true; this._sleepingPage.enabled = true;
this._cameraPage.enabled = false; this._cameraPage.enabled = false;
this._gradePage.enabled = false;
this._audioPage.enabled = false; this._audioPage.enabled = false;
this._thankYouPage.enabled = false; this._thankYouPage.enabled = false;
} }
setState(newState) { setState(newState) {
console.log("state change")
console.log({current:this._state,new:newState}) console.log({current:this._state,new:newState})
if(this._state == STATE.sleeping && newState == STATE.video) { if(this._state == STATE.sleeping && newState == STATE.video) {
this._cameraPage.enabled = true; this._cameraPage.enabled = true;
this._sleepingPage.enabled = false; this._sleepingPage.enabled = false;
this._state = newState; this._state = newState;
}else if(this._state == STATE.video && newState == STATE.audio) { }else if(this._state == STATE.video && newState == STATE.grade) {
this._cameraPage.enabled = false; this._cameraPage.enabled = false;
this._gradePage.enabled = true;
this._state = newState;
}else if(this._state == STATE.grade && newState == STATE.audio) {
this._gradePage.enabled = false;
this._audioPage.enabled = true; this._audioPage.enabled = true;
this._state = newState; this._state = newState;
}else if(this._state == STATE.audio && newState == STATE.thankYou) { }else if(this._state == STATE.audio && newState == STATE.thankYou) {

View File

@@ -30,6 +30,14 @@
<canvas id="overlay-canvas"></canvas> <canvas id="overlay-canvas"></canvas>
<video id="camera-video"></video> <video id="camera-video"></video>
</div> </div>
<div id="grade">
<div class="instructions">
<div class="title">
<h1>Qu'avez vous pensé de <span id="criteria"></span></h1>
</div>
<p>Votre note : <span id="criteria-grade"></span>/10</p>
</div>
</div>
<div id="audio"> <div id="audio">
<div class="instructions"> <div class="instructions">
<div class="title"> <div class="title">
@@ -51,6 +59,7 @@
<script src="assets/js/camera_page.js"></script> <script src="assets/js/camera_page.js"></script>
<script src="assets/js/network.js"></script> <script src="assets/js/network.js"></script>
<script src="assets/js/thank_you_page.js"></script> <script src="assets/js/thank_you_page.js"></script>
<script src="assets/js/grade_page.js"></script>
<script src="assets/js/audio_page.js"></script> <script src="assets/js/audio_page.js"></script>
<script src="assets/js/sleeping_page.js"></script> <script src="assets/js/sleeping_page.js"></script>
<script src="assets/js/state_manager.js"></script> <script src="assets/js/state_manager.js"></script>