2012-02-28 2 views
1

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

ответ

1

Да, можно, но вам придется использовать потоки. Объявите глобальную переменную bool exec_circle_detection = false; и запустите 2-й поток. В этой теме вызовите 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 к ложным после выполнения пользовательской обработки. На вторичной нити отрегулируйте свой код так, чтобы цикл while менялся exec_circle_detection на true каждые 10 секунд.

+0

Большое спасибо. я планирую сделать обнаружение круга, а затем хочу, чтобы программа ничего не делала, кроме показа видео в течение следующих десяти секунд. затем вернитесь к следующей строке кода. –

+0

Удивительный, не стесняйтесь повышать свой ответ или выбирать его в качестве официального ответа на свой вопрос, нажав на флажок рядом с ним. Или обоим :) – karlphillip

+0

Возможно, сложный вопрос. Я участвую в моем коде, который обнаруживает круги. я хочу, чтобы он посчитал 10 секунд и обнаружил круги и отобразил видео, не запускаясь в следующие строки кода ??? –

0

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

+0

Что делать, если приложение должно работать с различными типами камер, а не только с одним? Более надежным решением является использование механизма синхронизации, как описано в моем ответе. – karlphillip

Смежные вопросы