1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include <opencv2/opencv.hpp>
#include <iostream>
void processingLoop() {
cv::VideoCapture cap(0);
if (!cap.isOpened()) return;
cv::Mat frame;
while (true) {
// 1. Acquisition et Traitement (Temps consommateur)
cap >> frame;
if (frame.empty()) break;
// Simulation d'un traitement lourd (ex: 50ms)
// C'est ce temps qui permet au buffer clavier de se remplir
// doHeavyProcessing(frame);
cv::imshow("Flux Video", frame);
// 2. Stratégie de Drainage du Tampon
int key = -1;
int tempKey = -1;
// On boucle tant que waitKey renvoie un code valide (!= -1)
// waitKey(1) est utilisé pour garantir un passage rapide mais traiter l'événement
while ((tempKey = cv::waitKey(1))!= -1) {
key = tempKey; // On ne garde que la dernière touche pressée
// Si on voulait détecter des frappes uniques, on pourrait stocker tempKey dans un vecteur
}
// 3. Logique de Contrôle
// À ce stade, 'key' contient l'état le plus récent du clavier (ou -1 si rien)
// Tous les événements "en retard" ont été consommés et ignorés par la boucle while
if (key == 27) { // Touche ESC pour quitter
break;
} else if (key == 'a') {
std::cout << "Action A activée (sans latence accumulée)" << std::endl;
}
}
} |