Что происходит во время выполнения cvWaitKey()? Каковы типичные случаи использования? Я видел это в справочнике OpenCV, но документация неясна в его конкретной цели.
Что делает функция OpenVV cvWaitKey()?
Ответ 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