Как определить лицо в режиме реального времени opencv?

Почему это неточно?

Поскольку вы используете setTimeout() или setInterval(). Им нельзя доверять , для них нет гарантий точности. Им разрешено произвольно запаздывать , и они не сохраняют постоянный темп, но имеют тенденцию дрейфовать (как вы заметили).

Как создать точный таймер?

Вместо этого используйте объект Date , чтобы получить точное (текущее) время (миллисекунда). Затем укажите свою логику на текущее значение времени, вместо того, чтобы подсчитывать, как часто выполнялся ваш обратный вызов.

Для простого таймера или часов четко отслеживайте разницу во времени:

var start = Date.now();
setInterval(function() {
    var delta = Date.now() - start; // milliseconds elapsed since start
    …
    output(Math.floor(delta / 1000)); // in seconds
    // alternatively just show wall clock time:
    output(new Date().toUTCString());
}, 1000); // update about every second

Теперь у этого есть проблема, возможно, прыгающих значений. Когда интервал задерживается бит и выполняет ваш обратный вызов после 990, 1993, 2996, 3999, 5002 миллисекунд, вы увидите второй счет 0, 1, 2, 3, 5 (!). Поэтому было бы желательно обновлять чаще, примерно каждые 100 мс, чтобы избежать таких переходов.

Однако иногда вам действительно нужен постоянный интервал, выполняющий ваши обратные вызовы без дрейфа. Для этого требуется немного более выгодная стратегия (и код), хотя она хорошо платит (и регистрирует меньше тайм-аутов). Они известны как самонастраивающиеся таймеры. Здесь точная задержка для каждого из повторных тайм-аутов адаптируется к фактически прошедшему времени по сравнению с ожидаемыми интервалами:

var interval = 1000; // ms
var expected = Date.now() + interval;
setTimeout(step, interval);
function step() {
    var dt = Date.now() - expected; // the drift (positive for overshooting)
    if (dt > interval) {
        // something really bad happened. Maybe the browser (tab) was inactive?
        // possibly special handling to avoid futile "catch up" run
    }
    … // do what is to be done

    expected += interval;
    setTimeout(step, Math.max(0, interval - dt)); // take into account drift
}
0
задан Lynx 13 July 2018 в 19:49
поделиться