Was macht die cvWaitKey () -Funktion von OpenCV?

82

Was passiert während der Ausführung von cvWaitKey()? Was sind einige typische Anwendungsfälle? Ich habe es in der OpenCV- Referenz gesehen, aber die Dokumentation ist nicht klar über den genauen Zweck.

Einfachheit
quelle
3
Was verstehst du nicht oder was glaubst du, macht es? Die OpenCV-Dokumentationsreferenz scheint mir sehr klar zu sein ...
Daniel Sloof
8
@ user588855 Es ist uns allen wichtig, dass Sie Ihre Fragen überprüfen und einige Antworten akzeptieren, einschließlich dieser.
Karlphillip
4
Für den Datensatz cvWaitKey()ist jetzt eine veraltete C-Funktion. waitKey()ist das moderne C ++ - Äquivalent.
StockB
1
Können Sie bitte eine der Antworten markieren (@SuperElectric's scheint derzeit die beste zu sein), damit die Frage als beantwortet betrachtet werden kann. 4 Jahre auf eine Antwort zu warten und mehrere Antworten zu erhalten, ist eine lange Zeitspanne ...
rbaleksandar
@DanielSloof zum Beispiel wäre es schön zu wissen, welchem ​​Standard die Rückgabewerte folgen.
lahjaton_j

Antworten:

138

cvWaitKey(x) / cv::waitKey(x) macht zwei Dinge:

  1. Es wartet x Millisekunden auf einen Tastendruck in einem OpenCV-Fenster (dh erstellt aus cv::imshow()). Beachten Sie, dass stdin nicht auf Konsoleneingaben wartet. Wenn während dieser Zeit eine Taste gedrückt wurde, wird der ASCII-Code der Taste zurückgegeben. Andernfalls wird es zurückgegeben -1. (Wenn x Null ist, wartet es unbegrenzt auf den Tastendruck.)
  2. Es behandelt alle Fensterereignisse, z. B. das Erstellen von Fenstern mit cv::namedWindow()oder das Anzeigen von Bildern mit cv::imshow().

Ein häufiger Fehler für OpenCV-Neulinge besteht darin, cv::imshow()eine Schleife durch Videobilder aufzurufen , ohne jede Ziehung mit zu verfolgen cv::waitKey(30). In diesem Fall wird nichts auf dem Bildschirm angezeigt, da highgui nie Zeit hat, die Zeichnungsanforderungen von zu verarbeiten cv::imshow().

SuperElectric
quelle
19

Einfach gesagt, cvWaitKey()schläft X Millisekunden und wartet darauf, dass eine Taste gedrückt wird.

int cvWaitKey(int X);

Wenn eine Taste gedrückt wird, gibt diese Funktion den ASCII-Code der Taste zurück. Oder gibt -1 zurück, wenn während dieser Zeit keine Tasten gedrückt wurden.

Karlphillip
quelle
3
Das ist nicht die ganze Geschichte. In der Praxis kann das Aufrufen dieser Funktion für einige OpenCV-Anwendungen von entscheidender Bedeutung sein, auch wenn Sie sich nicht für Tastatureingaben interessieren. Hier finden Sie weitere Informationen .
Drew Noakes
13

cvWaitKey(0) stoppt Ihr Programm, bis Sie eine Taste drücken.

cvWaitKey(10)stoppt Ihr Programm nicht, sondern wacht auf und meldet sich, um Ihr Programm zu beenden, wenn Sie eine Taste drücken. Es wird in Schleifen verwendet, da cvWaitkeydie Schleife nicht gestoppt wird.

Normaler Gebrauch

char k;

k=cvWaitKey(0);

if(k == 'ESC')

mit können kSie sehen, welche Taste gedrückt wurde.

Jorge Vega Sánchez
quelle
5
Etwas wichtiger ist auch die openCV-Nachrichtenschleife. Sie werden keine neuen Daten in einem cvNamedWindow sehen, es sei denn, Sie rufen cvWaitKey () in der Schleife auf
Martin Beckett
14
-1 von mir für einen Vergleich char? = Multichar . Das ist einfach falsch. Verwenden Sie entweder das druckbare Zeichen (was in diesem Fall nicht möglich ist, da ESC ein nicht druckbares Zeichen ist, aber wenn Sie beispielsweise die Q-Taste verwenden, können Sie einen Vergleich mit? = 'Q' durchführen) oder wählen Sie eine der numerischen Darstellungen aus. Das ASCII unterstützt mehrere numerische Systeme: hexadezimal (0x1b), dezimal (27) und oktal (033). Alle aufgelisteten repräsentieren den ESC-Schlüssel.
Rbaleksandar
1
sollte int nicht char sein, dann benutze Bit Ops
Vlad
@Vlad Ja, es sollte 27 sein wie in user1564486
FindOutIslamNow
9

. Argument von 0wird interpretiert alsinfinite

. Um die HighGUI-Fenster zu ziehen, müssen Sie die cv::waitKey()Funktion kontinuierlich aufrufen . zB für statische Bilder:

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

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


quelle
8

Hinweis für alle, die möglicherweise Probleme mit der cvWaitKey( )Funktion hatten. Wenn Sie feststellen, dass cvWaitKey(x)das überhaupt nicht wartet, stellen Sie sicher, dass tatsächlich ein Fenster geöffnet ist (dh cvNamedWindow(...)). Setzen Sie die cvNamedWindow(...)Deklaration VOR cvWaitKey()Funktionsaufrufen.

Andy
quelle
Willkommen auf SO, es ist ein guter Ort, um Informationen zu veröffentlichen, wie Sie es getan haben. Wenn Sie eine Antwort veröffentlichen, muss diese normalerweise neue Informationen in die Frage einbringen, damit keine redundanten Beiträge erstellt werden. Welches war der Fall für Ihren Beitrag. Wenn Sie einen kleineren Kommentar haben, können Sie die Frage auch später kommentieren (wenn Sie mehr Wiederholungen erhalten). Wenn Sie es noch nicht gelesen haben, empfehlen wir Ihnen, die FAQ zu lesen : stackoverflow.com/faq . Grüße
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); */
enthusiastisch
quelle
4

Das cvWaitKeysorgt einfach für eine gewisse Verzögerung. Zum Beispiel:

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

Dies war ein Teil meines Codes, in dem ein Video in openCV geladen und die Frames ausgegeben wurden. Die 33Nummer im Code bedeutet, dass danach 33msein neuer Frame angezeigt wird. Daher war dies ein Zeitintervall 33mszwischen jedem Bild, das auf dem Bildschirm angezeigt wurde. Hoffe das hilft.

verklagen
quelle
1

cvWaitKey(milliseconds) Warten Sie einfach auf Millisekunden, die als Parameter für einen nächsten Tastendruck auf der Tastatur angegeben sind.

Menschliche Augen können nicht sehen, wie sich das Objekt in weniger als 1/10 Sekunde bewegt. Daher verwenden wir dies, um denselben Bildrahmen für einige Zeit auf dem Bildschirm zu halten. Sobald die Tastatur gedrückt wird, wird der nächste Vorgang ausgeführt.

cvWaitKey(milliseconds)Warten Sie kurz auf Tastendruck oder millisecondZeit.

Pravin Dahale
quelle
1
"Menschliche Augen können nicht sehen, wie sich das Objekt in weniger als 1/10 Sekunde bewegt. Daher verwenden wir dies, um denselben Bildrahmen für einige Zeit auf dem Bildschirm zu halten. Sobald die Taste der Tastatur gedrückt wird, wird der nächste Vorgang ausgeführt." Ist das wirklich wichtig für die Frage?
Quanten
-1

Wartet Millisekunden, um zu überprüfen, ob die Taste gedrückt wird. Wenn sie in diesem Intervall gedrückt wird, wird ihr ASCII-Wert zurückgegeben, andernfalls bleibt sie -1

Yassine Abdul-Rahman
quelle