Можно ли создать таймер, который пропускает функцию внутри цикла? - PullRequest
0 голосов
/ 12 февраля 2019

В моем проекте я использую opencv, чтобы ловить кадры с веб-камеры и обнаруживать некоторые вещи с помощью некоторых функций.Проблема в том, что в детерминированной функции необязательно перехватывать все кадры, например, было бы достаточно брать кадр каждые 0,5 секунды, а если время не закончилось, цикл переходит к следующей функции.Идея в коде была бы такой:

while(true){
  //read(frame)
  //cvtColor(....)
  // and other things
  time = 0;// start time
  if (time == 0.5){
      determinatefunction(frame, ...)
  }else {
      continue;
  }
  //some others functions
}

Я попытался сделать что-то похожее на приведенное выше с библиотекой хронографа:

// steady_clock example
#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>

using namespace std;

void foo(){
cout << "printing out 1000 stars...\n";
  for (int i=0; i<1000; ++i) cout << "*";
  cout << endl;
}

int main ()
{
    using namespace std::chrono;

    steady_clock::time_point t1 = steady_clock::now();
    int i = 0;
    while(i <= 100){
        cout << "Principio del bucle" << endl;
        steady_clock::time_point t2 = steady_clock::now();
        duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
        cout << time_span.count() << endl;
        if (time_span.count() == 0.1){
            foo();
            steady_clock::time_point t1 = steady_clock::now();
        }else {
            continue;
        }
        cout << "fin del bucle" << endl;
        i++;
    }
}

Но цикл никогда не заканчивается и никогда не запускается foo ()function.

Я не могу использовать поток posix (я видел функцию sleep_for), потому что я использую g ++ (x86_64-win32-sjlj-rev4, созданный проектом MinGW-W64) 4.9.2 и его работыс opencv 2.4.9.Я пытаюсь реализовать Mingw Posix с OpenCV, но это дает мне ошибки, которые не имеют смысла, такие как 'VideoCapture' was not declared in this scope VideoCapture cap(0), когда include и библиотеки написаны правильно.

Я использую Windows 7.

1 Ответ

0 голосов
/ 12 февраля 2019

Использование == в сочетании с вычислениями с плавающей запятой в большинстве случаев неверно.

Нет гарантии, что duration_cast<duration<double>>(t2 - t1) будет выполнено, когда разница будет точно 0.1.

Вместо этого это может быть что-то вроде 0.099324 и в следующей итерации 0.1000121

Вместо этого используйте >=, и определение другого t1 в if не имеет особого смысла.

if (time_span.count() >= 0.1) {
  foo();
  t1 = steady_clock::now();
}
...