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.


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


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.


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.


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


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.


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

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.


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.