OpenCV круг обнаружения с видео - PullRequest
1 голос
/ 28 февраля 2012

есть способ подождать, пока что-то произойдет (пока идет цикл), или подождать 10 секунд, прежде чем выполнять обнаружение окружности, но при этом показывать видео. я пробовал это с циклом while, но если условие не выполнено, кадры не будут отображаться, так как код не получает cvShow \ iamge ().

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Да, возможно , но вам придется использовать потоки. Объявите глобальную переменную bool exec_circle_detection = false; и запустите второй поток. В этой ветке позвоните sleep(10), чтобы подождать 10 секунд, а затем измените exec_circle_detection на true .

В главном потоке, внутри цикла захвата фрейма, вы проверяете, установлено ли для логической переменной значение true, а в противном случае вы не будете обрабатывать фрейм. Эта часть будет выглядеть примерно так (в C):

char key = 0;
while (key != 27) // ESC
{    
  frame = cvQueryFrame(capture);
  if (!frame) 
  {
      fprintf( stderr, "!!! cvQueryFrame failed!\n" );
      break;
  }

  if (exec_circle_detection)
  {
      // execute custom processing
  }

  // Display processed frame
  cvShowImage("result", frame);

  // Exit when user press ESC
  key = cvWaitKey(10);
}

Если вы планируете обнаруживать окружность каждые 10 секунд, вам нужно будет изменить exec_circle_detection на false после выполнения пользовательской обработки. Во вторичном потоке настройте свой код так, чтобы цикл while менял exec_circle_detection на true каждые 10 секунд.

0 голосов
/ 28 февраля 2012

Вы можете просто запустить обнаружение каждые X кадров.Добавьте счетчик кадров в свой код, перезапустите до 0, когда будет выполнено обнаружение, увеличьте его на единицу для каждого полученного нового кадра и выполните обнаружение, когда счетчик равен 300, учитывая, что ваше видео отображается на 30 fps.Вы получите 10-секундную задержку между каждым обнаружением.

...