Что происходит во время исполнения cvWaitKey()? Какие типичные варианты использования? Я видел это в справочнике OpenCV, но в документации неясно его точное назначение.
Что вы в нем не понимаете или как вы думаете, что он делает? Ссылка на документацию OpenCV кажется мне очень понятной ...
Дэниел Слоф,
8
@ user588855 Для всех нас важно, чтобы вы рассмотрели свои вопросы и приняли некоторые ответы, включая этот.
karlphillip
4
Для записи, cvWaitKey()теперь это устаревшая функция C. waitKey()это современный эквивалент C ++.
StockB
1
Не могли бы вы отметить один из ответов (на данный момент лучшим вариантом кажется @SuperElectric), чтобы на вопрос можно было ответить. 4 года ожидания ответа и получение нескольких ответов - это долгий срок ...
rbaleksandar
Например, @DanielSloof, было бы неплохо знать, за каким стандартом следуют возвращаемые значения.
lahjaton_j 02
Ответы:
138
cvWaitKey(x) / cv::waitKey(x) делает две вещи:
Он ждет x миллисекунд для нажатия клавиши в окне OpenCV (т.е. созданном из cv::imshow()). Обратите внимание, что он не прослушивает ввод с консоли на stdin. Если в это время была нажата клавиша, возвращается ее код ASCII. В противном случае возвращается -1. (Если x равен нулю, он бесконечно ждет нажатия клавиши.)
Он обрабатывает любые оконные события, такие как создание окон cv::namedWindow()или отображение изображений с помощью cv::imshow().
Распространенной ошибкой новичков в opencv является cv::imshow()циклический вызов видеокадров без выполнения каждой отрисовки с помощью cv::waitKey(30). В этом случае на экране ничего не отображается, потому что highgui никогда не получает времени на обработку запросов на отрисовку cv::imshow().
Это еще не все. На практике, даже если вас не волнует ввод с клавиатуры, вызов этой функции может быть необходим для некоторых приложений OpenCV. Здесь есть дополнительная информация .
Дрю Ноукс
13
cvWaitKey(0) останавливает вашу программу, пока вы не нажмете кнопку.
cvWaitKey(10)не останавливает вашу программу, а просыпается и предупреждает о завершении программы при нажатии кнопки. Он используется в циклах, потому cvWaitkeyчто не останавливает цикл.
Нормальное использование
char k;
k=cvWaitKey(0);
if(k == 'ESC')
с помощью kвы можете увидеть, какая клавиша была нажата.
Также немного важнее - это цикл сообщений 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
Примечание для всех, у кого могут быть проблемы с cvWaitKey( )функцией. Если вы обнаружите, что cvWaitKey(x)это совсем не ожидание, убедитесь, что у вас действительно открыто окно (т.е. cvNamedWindow(...)). Поместите cvNamedWindow(...)объявление ПЕРЕД вызовом любых cvWaitKey()функций.
Добро пожаловать на SO, это хорошее место для размещения информации, как и вы. Обычно, когда вы публикуете ответ, он должен привносить новую информацию в вопрос, поэтому он не создает лишних сообщений. Так было с вашим постом. Если у вас небольшой комментарий, вы также можете прокомментировать вопрос позже (когда у вас появится больше респондентов). Если вы еще не читали его, я предлагаю вам взглянуть на FAQ: stackoverflow.com/faq . С уважением
ForceMagic
5
/* Assuming this is a whileloop -> e.g. video stream where img is obtained from say web camera.*/
cvShowImage("Window",img);
/* A small interval of10 milliseconds. This may be necessary to display the image correctly */
cvWaitKey(10);
/* to wait until user feeds keyboard input replace with cvWaitKey(0); */
Это была часть моего кода, в котором видео загружалось в openCV и выводились кадры. 33Номер в средстве кода, после того 33ms, новый кадр будет показан. Следовательно, это было делом или временным интервалом 33msмежду отображением каждого кадра на экране. Надеюсь это поможет.
cvWaitKey(milliseconds) просто дождитесь миллисекунд, предоставленных в качестве параметра для следующего нажатия клавиши клавиатуры.
Человеческий глаз не может видеть объект, движущийся менее чем за 1/10 секунды, поэтому мы используем это, чтобы в течение некоторого времени удерживать один и тот же кадр изображения на экране. Как только будет нажата клавиша клавиатуры, будет выполнена следующая операция.
Короче, cvWaitKey(milliseconds)дождитесь нажатия клавиши или millisecondпредоставленного времени.
«Человеческий глаз не может видеть объект, движущийся менее чем за 1/10 секунды, поэтому мы используем это, чтобы удерживать один и тот же кадр изображения в течение некоторого времени на экране. Как только будет нажата клавиша клавиатуры, будет выполнена следующая операция» это действительно имеет значение для вопроса?
квант
-1
ждет миллисекунды, чтобы проверить, нажата ли клавиша, если она нажата в этом интервале, вернет ее значение ascii, в противном случае все равно -1
cvWaitKey()
теперь это устаревшая функция C.waitKey()
это современный эквивалент C ++.Ответы:
cvWaitKey(x) / cv::waitKey(x)
делает две вещи:cv::imshow()
). Обратите внимание, что он не прослушивает ввод с консоли на stdin. Если в это время была нажата клавиша, возвращается ее код ASCII. В противном случае возвращается-1
. (Если x равен нулю, он бесконечно ждет нажатия клавиши.)cv::namedWindow()
или отображение изображений с помощьюcv::imshow()
.Распространенной ошибкой новичков в opencv является
cv::imshow()
циклический вызов видеокадров без выполнения каждой отрисовки с помощьюcv::waitKey(30)
. В этом случае на экране ничего не отображается, потому что highgui никогда не получает времени на обработку запросов на отрисовкуcv::imshow()
.источник
Проще говоря,
cvWaitKey()
спит в течение X миллисекунд, ожидая нажатия любой клавиши.int cvWaitKey(int X);
Если клавиша нажата, эта функция возвращает код клавиши ASCII. Или возвращает -1, если в это время не нажимались никакие клавиши.
источник
cvWaitKey(0)
останавливает вашу программу, пока вы не нажмете кнопку.cvWaitKey(10)
не останавливает вашу программу, а просыпается и предупреждает о завершении программы при нажатии кнопки. Он используется в циклах, потомуcvWaitkey
что не останавливает цикл.Нормальное использование
char k; k=cvWaitKey(0); if(k == 'ESC')
с помощью
k
вы можете увидеть, какая клавиша была нажата.источник
. аргумент
0
интерпретируется какinfinite
. чтобы перетащить окна с высоким интерфейсом пользователя, вам нужно постоянно вызывать
cv::waitKey()
функцию. например, для статических изображений:cv::imshow("winname", img);
while(cv::waitKey(1) != 27); // 27 = ascii value of ESC
источник
Примечание для всех, у кого могут быть проблемы с
cvWaitKey( )
функцией. Если вы обнаружите, чтоcvWaitKey(x)
это совсем не ожидание, убедитесь, что у вас действительно открыто окно (т.е.cvNamedWindow(...)
). ПоместитеcvNamedWindow(...)
объявление ПЕРЕД вызовом любыхcvWaitKey()
функций.источник
/* 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); */
источник
cvWaitKey
Просто дает что - то задержки. Например:char c = cvWaitKey(33); if( c == 27 ) break;
Это была часть моего кода, в котором видео загружалось в openCV и выводились кадры.
33
Номер в средстве кода, после того33ms
, новый кадр будет показан. Следовательно, это было делом или временным интервалом33ms
между отображением каждого кадра на экране. Надеюсь это поможет.источник
cvWaitKey(milliseconds)
просто дождитесь миллисекунд, предоставленных в качестве параметра для следующего нажатия клавиши клавиатуры.Человеческий глаз не может видеть объект, движущийся менее чем за 1/10 секунды, поэтому мы используем это, чтобы в течение некоторого времени удерживать один и тот же кадр изображения на экране. Как только будет нажата клавиша клавиатуры, будет выполнена следующая операция.
Короче,
cvWaitKey(milliseconds)
дождитесь нажатия клавиши илиmillisecond
предоставленного времени.источник
ждет миллисекунды, чтобы проверить, нажата ли клавиша, если она нажата в этом интервале, вернет ее значение ascii, в противном случае все равно -1
источник