Robustesse DSLR + éclairage visage + fix pellicule cadre imposé
- camera.py: fix fuite FD USB sur échec reconnexion (gp.Camera non libéré), cleanup PTP session avant init, catch toutes exceptions preview/capture, deconnecter() avec timeout thread + force del pour libérer le port USB - main.py: thread preview anti-crash (outer try/except), reconnexion DSLR même si preview actif, notification camera_erreur après échec capture, intégration module éclairage (analyse luminosité visage via WS) - printer.py: mode pellicule (-2up) ignoré par le cadre imposé événement - eclairage.py: nouveau module analyse luminosité visage (Haar + HSV) - camera.js: indicateur éclairage temps réel (score/100 + visages) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -173,6 +173,37 @@ wsOnMessage('camera_ok', () => {
|
||||
afficherErreurPreview(false);
|
||||
});
|
||||
|
||||
wsOnMessage('eclairage', (msg) => {
|
||||
if (captureEnCours) return;
|
||||
let el = document.getElementById('indicateur-eclairage');
|
||||
if (!el) {
|
||||
el = document.createElement('div');
|
||||
el.id = 'indicateur-eclairage';
|
||||
el.style.cssText = 'position:fixed;top:12px;left:12px;padding:8px 16px;border-radius:12px;font-size:.9rem;font-weight:600;z-index:90;transition:all .3s;pointer-events:none;display:flex;align-items:center;gap:8px;';
|
||||
document.body.appendChild(el);
|
||||
}
|
||||
const score = msg.score >= 0 ? msg.score : '?';
|
||||
const faces = msg.visages || 0;
|
||||
if (msg.action === 'allumer') {
|
||||
el.style.background = 'rgba(239,68,68,.9)';
|
||||
el.style.color = '#fff';
|
||||
el.innerHTML = `☀️ ALLUMER <span style="opacity:.7;font-size:.8rem">${score}/100 · ${faces} visage${faces > 1 ? 's' : ''}</span>`;
|
||||
} else if (msg.action === 'attention') {
|
||||
el.style.background = 'rgba(245,158,11,.85)';
|
||||
el.style.color = '#fff';
|
||||
el.innerHTML = `⚠️ Faible <span style="opacity:.7;font-size:.8rem">${score}/100 · ${faces} visage${faces > 1 ? 's' : ''}</span>`;
|
||||
} else if (msg.action === 'ok') {
|
||||
el.style.background = 'rgba(34,197,94,.7)';
|
||||
el.style.color = '#fff';
|
||||
el.innerHTML = `✓ <span style="opacity:.7;font-size:.8rem">${score}/100 · ${faces} visage${faces > 1 ? 's' : ''}</span>`;
|
||||
} else if (msg.action === 'no_face') {
|
||||
el.style.background = 'rgba(100,100,120,.6)';
|
||||
el.style.color = '#ccc';
|
||||
el.innerHTML = `<span style="font-size:.8rem">Aucun visage</span>`;
|
||||
}
|
||||
el.style.display = '';
|
||||
});
|
||||
|
||||
// --- Capture ---
|
||||
|
||||
async function lancerCapture() {
|
||||
|
||||
Reference in New Issue
Block a user