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.
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:
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.)
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().
Einfach gesagt, cvWaitKey()schläft X Millisekunden und wartet darauf, dass eine Taste gedrückt wird.
intcvWaitKey(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.
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.
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
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.
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 whileloop -> e.g. video stream where img is obtained from say web camera.*/
cvShowImage("Window",img);
/* A small interval of10 milliseconds. This may be necessary to display the image correctly */
cvWaitKey(10);
/* to wait until user feeds keyboard input replace with cvWaitKey(0); */
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.
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.
"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
cvWaitKey()
ist jetzt eine veraltete C-Funktion.waitKey()
ist das moderne C ++ - Äquivalent.Antworten:
cvWaitKey(x) / cv::waitKey(x)
macht zwei Dinge: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.)cv::namedWindow()
oder das Anzeigen von Bildern mitcv::imshow()
.Ein häufiger Fehler für OpenCV-Neulinge besteht darin,
cv::imshow()
eine Schleife durch Videobilder aufzurufen , ohne jede Ziehung mit zu verfolgencv::waitKey(30)
. In diesem Fall wird nichts auf dem Bildschirm angezeigt, da highgui nie Zeit hat, die Zeichnungsanforderungen von zu verarbeitencv::imshow()
.quelle
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.
quelle
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, dacvWaitkey
die Schleife nicht gestoppt wird.Normaler Gebrauch
char k; k=cvWaitKey(0); if(k == 'ESC')
mit können
k
Sie sehen, welche Taste gedrückt wurde.quelle
. Argument von
0
wird 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
Hinweis für alle, die möglicherweise Probleme mit der
cvWaitKey( )
Funktion hatten. Wenn Sie feststellen, dasscvWaitKey(x)
das überhaupt nicht wartet, stellen Sie sicher, dass tatsächlich ein Fenster geöffnet ist (dhcvNamedWindow(...)
). Setzen Sie diecvNamedWindow(...)
Deklaration VORcvWaitKey()
Funktionsaufrufen.quelle
/* 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); */
quelle
Das
cvWaitKey
sorgt 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
33
Nummer im Code bedeutet, dass danach33ms
ein neuer Frame angezeigt wird. Daher war dies ein Zeitintervall33ms
zwischen jedem Bild, das auf dem Bildschirm angezeigt wurde. Hoffe das hilft.quelle
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 odermillisecond
Zeit.quelle
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
quelle