Что происходит во время выполнения 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