Co robi funkcja cvWaitKey () OpenCV?

82

Co się dzieje podczas wykonywania cvWaitKey()? Jakie są typowe przypadki użycia? Widziałem to w źródłach OpenCV, ale dokumentacja nie jest jasna co do jego dokładnego celu.

Prostota
źródło
3
Czego z tego nie rozumiesz lub jak myślisz, co to robi? Odniesienie do dokumentacji OpenCV wydaje mi się bardzo jasne ...
Daniel Sloof,
8
@ user588855 Dla nas wszystkich ważne jest, abyś przejrzał swoje pytania i zaakceptował niektóre odpowiedzi, w tym te.
karlphillip
4
Dla przypomnienia, cvWaitKey()jest teraz przestarzałą funkcją C. waitKey()to nowoczesny odpowiednik C ++.
StockB
1
Czy możesz zaznaczyć jedną z odpowiedzi (na razie wydaje się najlepsza odpowiedź @SuperElectric), aby można było uznać, że na pytanie udzielono odpowiedzi. 4 lata czekania na odpowiedź i otrzymywania wielu odpowiedzi to długi okres czasu ...
rbaleksandar
Na przykład @DanielSloof, dobrze byłoby wiedzieć, za którym standardem następują zwracane wartości.
lahjaton_j

Odpowiedzi:

138

cvWaitKey(x) / cv::waitKey(x) robi dwie rzeczy:

  1. Oczekuje x milisekund na naciśnięcie klawisza w oknie OpenCV (tj. Utworzonym z cv::imshow()). Zauważ, że nie nasłuchuje na stdin dla danych wejściowych konsoli. Jeśli klawisz został naciśnięty w tym czasie, zwraca kod ASCII klawisza. W przeciwnym razie wraca -1. (Jeśli x wynosi zero, czeka nieskończenie długo na naciśnięcie klawisza).
  2. Obsługuje wszelkie zdarzenia związane z oknami, takie jak tworzenie okien cv::namedWindow()lub wyświetlanie obrazów za pomocą cv::imshow().

Częstym błędem dla nowicjuszy opencv jest wywoływanie cv::imshow()pętli przez klatki wideo, bez śledzenia każdego losowania za pomocą cv::waitKey(30). W tym przypadku nic nie pojawia się na ekranie, ponieważ highgui nigdy nie ma czasu na przetworzenie żądań losowania cv::imshow().

SuperElectric
źródło
19

Po prostu cvWaitKey()śpi przez X milisekund, czekając na naciśnięcie dowolnego klawisza.

int cvWaitKey(int X);

Jeśli klawisz jest wciśnięty, funkcja zwraca kod klucza ASCII. Lub zwraca -1, jeśli w tym czasie nie został naciśnięty żaden klawisz.

karlphillip
źródło
3
To nie jest cała historia. W praktyce, nawet jeśli nie zależy ci na wprowadzaniu danych z klawiatury, wywołanie tej funkcji może być niezbędne w niektórych aplikacjach OpenCV. Tutaj jest więcej informacji .
Drew Noakes
13

cvWaitKey(0) zatrzymuje program do momentu naciśnięcia przycisku.

cvWaitKey(10)nie zatrzymuje programu, ale budzi się i ostrzega o zakończeniu programu po naciśnięciu przycisku. Jest używany w pętlach, ponieważ cvWaitkeynie zatrzymuje pętli.

Normalne użytkowanie

char k;

k=cvWaitKey(0);

if(k == 'ESC')

z kwas może zobaczyć, co klawisz został naciśnięty.

Jorge Vega Sánchez
źródło
5
Nieco ważniejsze - jest to pętla komunikatów openCV. Nie zobaczysz żadnych nowych danych w cvNamedWindow, chyba że wywołasz cvWaitKey () w pętli
Martin Beckett
14
-1 ode mnie za wykonanie porównania char? = Multichar . To jest po prostu złe. Użyj albo znaku drukowalnego (co w tym przypadku nie jest możliwe, ponieważ ESC jest znakiem niedrukowalnym, ale w przypadku użycia na przykład klawisza Q możesz zrobić porównanie? = 'Q') lub wybierz jedną z reprezentacji liczbowych. ASCII obsługuje wiele systemów numerycznych: szesnastkowy (0x1b), dziesiętny (27) i ósemkowy (033). Wszystkie wymienione reprezentują klawisz ESC.
rbaleksandar
1
powinno być int, a nie char, użyj bit ops
Vlad
@Vlad Tak, powinno być 27 jak w user1564486
FindOutIslamNow
9

. argument z 0jest interpretowany jakoinfinite

. aby przeciągać okna highGUI, musisz ciągle wywoływać tę cv::waitKey()funkcję. np. dla obrazów statycznych:

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

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


źródło
8

Uwaga dla każdego, kto mógł mieć problemy z tą cvWaitKey( )funkcją. Jeśli zauważysz, że cvWaitKey(x)w ogóle nie czeka, upewnij się, że masz otwarte okno (tj cvNamedWindow(...).). Umieść cvNamedWindow(...)deklarację PRZED jakimkolwiek cvWaitKey()wywołaniem funkcji.

Andy
źródło
Witamy w SO, to dobre miejsce na publikowanie informacji, tak jak Ty. Zwykle, kiedy publikujesz odpowiedź, musi ona zawierać nowe informacje na pytanie, więc nie tworzy zbędnego postu. Tak było w przypadku twojego postu. Jeśli masz mniejszy komentarz, możesz również skomentować pytanie później (gdy zdobędziesz więcej przedstawicieli). Jeśli jeszcze tego nie czytałeś, radzę zajrzeć do FAQ: stackoverflow.com/faq . Pozdrawiam
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); */
entuzjastyczny
źródło
4

Po cvWaitKeyprostu zapewnia coś w rodzaju opóźnienia. Na przykład:

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

Było to oprócz mojego kodu, w którym wideo było ładowane do openCV i wysyłane ramki. 33Liczba w kodzie, który za pomocą 33ms, nowa ramka będzie widoczne. W związku z tym był to gęsty lub przedział czasu 33msmiędzy wyświetlaniem każdej klatki na ekranie. Mam nadzieję że to pomoże.

sue-ling
źródło
1

cvWaitKey(milliseconds) po prostu poczekaj milisekundy podane jako parametr dla następnego naciśnięcia klawisza na klawiaturze.

Ludzkie oczy nie są w stanie zobaczyć obiektu poruszającego się w czasie krótszym niż 1/10 sekundy, więc używamy tego do utrzymywania tej samej klatki obrazu przez pewien czas na ekranie. Po naciśnięciu klawisza klawiatury zostanie wykonana następna operacja.

Krótko cvWaitKey(milliseconds)poczekaj na naciśnięcie klawisza lub millisecondpodany czas.

Pravin Dahale
źródło
1
„Ludzkie oczy nie są w stanie zobaczyć, jak przedmiot porusza się w czasie krótszym niż 1/10 sekundy, więc używamy tego do zatrzymania tej samej klatki obrazu przez jakiś czas na ekranie. Po naciśnięciu klawisza klawiatury zostanie wykonana następna operacja”. to naprawdę ma znaczenie dla pytania?
kwantowy
-1

czeka milisekundy, aby sprawdzić, czy klawisz jest wciśnięty, jeśli naciśnięty w tym przedziale czasu zwraca wartość ascii, w przeciwnym razie nadal -1

Yassine Abdul-Rahman
źródło