Что делает функция OpenCV cvWaitKey ()? - PullRequest
73 голосов
/ 07 марта 2011

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

Ответы [ 9 ]

130 голосов
/ 05 августа 2011

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

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

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

18 голосов
/ 31 марта 2011

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

int cvWaitKey(int X);

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

12 голосов
/ 07 марта 2011

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

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

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

char k;

k=cvWaitKey(0);

if(k == 'ESC')

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

8 голосов
/ 03 июля 2012

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

7 голосов
/ 10 декабря 2012

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

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

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

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

5 голосов
/ 08 марта 2011
/* 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 голосов
/ 20 февраля 2012

cvWaitKey просто обеспечивает некоторую задержку. Например:

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

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

1 голос
/ 18 мая 2012

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

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

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

0 голосов
/ 07 февраля 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...