Що робить функція cvWaitKey () OpenCV?


82

Що відбувається під час виконання cvWaitKey()? Які типові випадки використання? Я бачив це у посиланні на OpenCV, але документація не чітко визначає його точну мету.


3
Що ви не розумієте з цього приводу або що, на вашу думку, це робить? Посилання на документацію OpenCV мені здається дуже зрозумілим ...
Даніель Слоф

8
@ user588855 Всім нам важливо переглянути ваші запитання та прийняти деякі відповіді, включаючи цю.
karlphillip

4
Для запису cvWaitKey()тепер застаріла функція C. waitKey()є сучасним еквівалентом C ++.
StockB

1
Чи можете ви, будь ласка, позначити одну з відповідей (@SuperElectric здається найкращою на даний момент), щоб на питання можна було вважати відповідь. 4 роки очікування відповіді та отримання декількох відповідей - це довгий проміжок часу ...
rbaleksandar

Наприклад, @DanielSloof, було б непогано знати, за яким стандартом слідують значення, що повертаються.
lahjaton_j

Відповіді:


138

cvWaitKey(x) / cv::waitKey(x) робить дві речі:

  1. Він чекає х мілісекунд натискання клавіші у вікні OpenCV (тобто створене з cv::imshow()). Зверніть увагу, що він не слухає stdin для введення консолі. Якщо протягом цього часу була натиснута клавіша, вона повертає код ASCII ключа. В іншому випадку він повертається -1. (Якщо x дорівнює нулю, це очікування натискання клавіші нескінченно довго).
  2. Він обробляє будь-які події вікон, наприклад, створення вікон за допомогою cv::namedWindow()або показ зображень за допомогою cv::imshow().

Типовою помилкою для новачків opencv є виклик cv::imshow()циклу через відеокадри, не слідкуючи за кожним розіграшем cv::waitKey(30). У цьому випадку на екрані нічого не відображається, оскільки у highgui ніколи не дається часу на обробку запитів на розіграш cv::imshow().


19

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

int cvWaitKey(int X);

Якщо натиснути клавішу, ця функція повертає ASCII-код ключа. Або повертає -1, якщо протягом цього часу не було натиснуто жодної клавіші.


3
Це не зовсім вся історія. На практиці, навіть якщо ви не дбаєте про введення з клавіатури, виклик цієї функції може бути важливим для деяких програм OpenCV. Тут є додаткова інформація .
Дрю Ноукс

13

cvWaitKey(0) зупиняє програму, доки ви не натиснете кнопку.

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

Звичайне використання

char k;

k=cvWaitKey(0);

if(k == 'ESC')

з kви можете побачити , що клавіша була натиснута.


5
Також трохи важливіше - це цикл повідомлення openCV. Ви не побачите нових даних у вікні cvNamedWindow, якщо не зателефонуєте cvWaitKey () у циклі
Мартін Беккет

14
-1 від мене за порівняння char? = Multichar . Це просто неправильно. Використовуйте або символ для друку (що в цьому випадку неможливо, оскільки ESC є символом, що не друкується, але у випадку, наприклад, за допомогою клавіші Q, ви можете зробити порівняння? = 'Q'), або виберіть одне з числових подань. ASCII підтримує кілька числових систем: шістнадцяткову (0x1b), десяткову (27) та восьмеричну (033). Всі перелічені представляють ключ ESC.
rbaleksandar

1
має бути int, а не char, тоді використовуйте bit ops
Влад

@Vlad Так, має бути 27, як у користувача1564486
FindOutIslamNow

9

. аргумент Росії 0трактується якinfinite

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

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

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


8

Примітка для тих, хто мав проблеми з cvWaitKey( )функцією. Якщо ви виявили, що cvWaitKey(x)зовсім не чекаєте, переконайтесь, що у вас насправді відкрито вікно (тобто cvNamedWindow(...)). Помістіть cvNamedWindow(...)декларацію ПЕРЕД будь-якими cvWaitKey()викликами функцій.


Ласкаво просимо на SO, це гарне місце для розміщення інформації, як ви це робили. Зазвичай, коли ви публікуєте відповідь, він повинен додавати нову інформацію до запитання, тому він не створює надмірних повідомлень. Що було у випадку з вашим постом. Якщо у вас є менший коментар, ви також можете прокоментувати питання пізніше (коли отримаєте більше представників). Якщо ви його ще не прочитали, я пропоную вам поглянути на поширені запитання: stackoverflow.com/faq . З повагою
ForceMagic

5
/* 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

cvWaitKeyПросто дає що - то затримки. Наприклад:

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

Це було окремо від мого коду, в якому відео завантажувалось у openCV і виводились кадри. 33Номер в засобі коду, після того 33ms, новий кадр буде показаний. Отже, делі або часовий інтервал 33msміж кожним кадром відображався на екрані. Сподіваюся, це допомагає.


1

cvWaitKey(milliseconds) просто почекайте мілісекунд, наданих як параметр для наступного натискання клавіші клавіатури.

Людські очі не бачать, як річ рухається менше ніж за 1/10 секунди, тому ми використовуємо це, щоб деякий час утримувати на екрані один і той же кадр зображення. Як тільки буде натиснута клавіша клавіатури, буде виконана наступна операція.

Коротше cvWaitKey(milliseconds)зачекайте натискання клавіші або millisecondчасу.


1
"Людські очі не бачать, як річ рухається менше ніж за 1/10 секунди, тому ми використовуємо це, щоб деякий час утримувати на екрані один і той же кадр зображення. Як тільки натиснута клавіша клавіатури, буде виконана наступна операція" це справді питання до питання?
квантовий

-1

чекає мілісекунд, щоб перевірити, чи натиснута клавіша, якщо натиснути в цьому інтервалі, повернути її значення ascii, інакше вона все ще -1

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.