Что делает функция OpenCV cvWaitKey ()?

82

Что происходит во время исполнения cvWaitKey()? Какие типичные варианты использования? Я видел это в справочнике OpenCV, но в документации неясно его точное назначение.

Простота
источник
3
Что вы в нем не понимаете или как вы думаете, что он делает? Ссылка на документацию OpenCV кажется мне очень понятной ...
Дэниел Слоф,
8
@ user588855 Для всех нас важно, чтобы вы рассмотрели свои вопросы и приняли некоторые ответы, включая этот.
karlphillip
4
Для записи, cvWaitKey()теперь это устаревшая функция C. waitKey()это современный эквивалент C ++.
StockB
1
Не могли бы вы отметить один из ответов (на данный момент лучшим вариантом кажется @SuperElectric), чтобы на вопрос можно было ответить. 4 года ожидания ответа и получение нескольких ответов - это долгий срок ...
rbaleksandar
Например, @DanielSloof, было бы неплохо знать, за каким стандартом следуют возвращаемые значения.
lahjaton_j 02

Ответы:

138

cvWaitKey(x) / cv::waitKey(x) делает две вещи:

  1. Он ждет x миллисекунд для нажатия клавиши в окне OpenCV (т.е. созданном из cv::imshow()). Обратите внимание, что он не прослушивает ввод с консоли на stdin. Если в это время была нажата клавиша, возвращается ее код ASCII. В противном случае возвращается -1. (Если x равен нулю, он бесконечно ждет нажатия клавиши.)
  2. Он обрабатывает любые оконные события, такие как создание окон cv::namedWindow()или отображение изображений с помощью cv::imshow().

Распространенной ошибкой новичков в opencv является cv::imshow()циклический вызов видеокадров без выполнения каждой отрисовки с помощью cv::waitKey(30). В этом случае на экране ничего не отображается, потому что highgui никогда не получает времени на обработку запросов на отрисовку cv::imshow().

SuperElectric
источник
19

Проще говоря, cvWaitKey()спит в течение X миллисекунд, ожидая нажатия любой клавиши.

int cvWaitKey(int X);

Если клавиша нажата, эта функция возвращает код клавиши ASCII. Или возвращает -1, если в это время не нажимались никакие клавиши.

Карлфиллип
источник
3
Это еще не все. На практике, даже если вас не волнует ввод с клавиатуры, вызов этой функции может быть необходим для некоторых приложений OpenCV. Здесь есть дополнительная информация .
Дрю Ноукс
13

cvWaitKey(0) останавливает вашу программу, пока вы не нажмете кнопку.

cvWaitKey(10)не останавливает вашу программу, а просыпается и предупреждает о завершении программы при нажатии кнопки. Он используется в циклах, потому cvWaitkeyчто не останавливает цикл.

Нормальное использование

char k;

k=cvWaitKey(0);

if(k == 'ESC')

с помощью kвы можете увидеть, какая клавиша была нажата.

Хорхе Вега Санчес
источник
5
Также немного важнее - это цикл сообщений openCV. Вы не увидите никаких новых данных в cvNamedWindow, если не вызовете cvWaitKey () в цикле
Мартин Беккет,
14
-1 от меня за сравнение char? = Multichar . Это просто неправильно. Используйте либо печатный символ (что в этом случае невозможно, поскольку ESC - непечатаемый символ, но, например, в случае использования клавиши Q вы можете выполнить сравнение? = 'Q'), либо выберите одно из числовых представлений. ASCII поддерживает несколько систем счисления: шестнадцатеричную (0x1b), десятичную (27) и восьмеричную (033). Все перечисленные представляют собой клавишу ESC.
rbaleksandar
1
должно быть int, а не char, тогда используйте bit ops
Влад
@Vlad Да, должно быть 27 как в user1564486
FindOutIslamNow
9

. аргумент 0интерпретируется какinfinite

. чтобы перетащить окна с высоким интерфейсом пользователя, вам нужно постоянно вызывать cv::waitKey()функцию. например, для статических изображений:

cv::imshow("winname", img);

while(cv::waitKey(1) != 27); // 27 = ascii value of ESC


источник
8

Примечание для всех, у кого могут быть проблемы с cvWaitKey( )функцией. Если вы обнаружите, что cvWaitKey(x)это совсем не ожидание, убедитесь, что у вас действительно открыто окно (т.е. cvNamedWindow(...)). Поместите cvNamedWindow(...)объявление ПЕРЕД вызовом любых cvWaitKey()функций.

Энди
источник
Добро пожаловать на SO, это хорошее место для размещения информации, как и вы. Обычно, когда вы публикуете ответ, он должен привносить новую информацию в вопрос, поэтому он не создает лишних сообщений. Так было с вашим постом. Если у вас небольшой комментарий, вы также можете прокомментировать вопрос позже (когда у вас появится больше респондентов). Если вы еще не читали его, я предлагаю вам взглянуть на FAQ: stackoverflow.com/faq . С уважением
ForceMagic
5
/* Assuming this is a while loop -> e.g. video stream where img is obtained from say web camera.*/    
cvShowImage("Window",img);

/* A small interval of 10 milliseconds. This may be necessary to display the image correctly */
cvWaitKey(10);  

/* to wait until user feeds keyboard input replace with cvWaitKey(0); */
энтузиазм
источник
4

cvWaitKeyПросто дает что - то задержки. Например:

char c = cvWaitKey(33);
if( c == 27 ) break;

Это была часть моего кода, в котором видео загружалось в openCV и выводились кадры. 33Номер в средстве кода, после того 33ms, новый кадр будет показан. Следовательно, это было делом или временным интервалом 33msмежду отображением каждого кадра на экране. Надеюсь это поможет.

предъявление иска
источник
1

cvWaitKey(milliseconds) просто дождитесь миллисекунд, предоставленных в качестве параметра для следующего нажатия клавиши клавиатуры.

Человеческий глаз не может видеть объект, движущийся менее чем за 1/10 секунды, поэтому мы используем это, чтобы в течение некоторого времени удерживать один и тот же кадр изображения на экране. Как только будет нажата клавиша клавиатуры, будет выполнена следующая операция.

Короче, cvWaitKey(milliseconds)дождитесь нажатия клавиши или millisecondпредоставленного времени.

Правин Дахале
источник
1
«Человеческий глаз не может видеть объект, движущийся менее чем за 1/10 секунды, поэтому мы используем это, чтобы удерживать один и тот же кадр изображения в течение некоторого времени на экране. Как только будет нажата клавиша клавиатуры, будет выполнена следующая операция» это действительно имеет значение для вопроса?
квант
-1

ждет миллисекунды, чтобы проверить, нажата ли клавиша, если она нажата в этом интервале, вернет ее значение ascii, в противном случае все равно -1

Ясин Абдул-Рахман
источник