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

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

Ответ 1

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().

Ответ 2

Просто, cvWaitKey() спит для X miliseconds, ожидая нажатия любой клавиши.

int cvWaitKey(int X);

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

Ответ 3

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

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

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

char k;

k=cvWaitKey(0);

if(k == 'ESC')

с k вы можете увидеть, какой ключ был нажат.

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

/* 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); */

Ответ 7

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

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

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

Ответ 8

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

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

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

Ответ 9

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