Ich arbeite an einem Programm (Python, opencv), in dem ich mit spacebar
zum nächsten Frame gehe und Esc
, um das Programm zu beenden. Dies sind die einzigen beiden Schlüssel, die ich arbeite. Ich habe versucht, mehr über die Tasten herauszufinden, habe verschiedene Codes ausprobiert, aber nicht funktioniert. insbesondere Pfeiltasten.
Ich habe this über waitkey
gefunden, aber es funktioniert nicht.
Meine Frage ist also: Wie fange ich andere Schlüssel außer esc
und spacebar
, um bestimmte Funktionen in meinem Python-opencv-Programm auszulösen?
Sie können die Funktion ord()
in Python dafür verwenden.
Wenn Sie beispielsweise einen Tastendruck "a" auslösen möchten, gehen Sie wie folgt vor:
if cv2.waitKey(33) == ord('a'):
print "pressed a"
Sehen Sie sich hier einen Beispielcode an: Zeichnungshistogramm
UPDATE:
Um den Schlüsselwert für einen beliebigen Schlüssel zu ermitteln, drucken Sie den Schlüsselwert mit einem einfachen Skript wie folgt:
import cv2
img = cv2.imread('sof.jpg') # load a dummy image
while(1):
cv2.imshow('img',img)
k = cv2.waitKey(33)
if k==27: # Esc key to stop
break
Elif k==-1: # normally -1 returned,so don't print it
continue
else:
print k # else print its value
Mit diesem Code habe ich folgende Werte erhalten:
Upkey : 2490368
DownKey : 2621440
LeftKey : 2424832
RightKey: 2555904
Space : 32
Delete : 3014656
...... # Continue yourself :)
Die von waitKey
zurückgegebenen Schlüsselcodes scheinen plattformabhängig zu sein. Es kann jedoch sehr lehrreich sein, zu sehen, was die Schlüssel zurückgeben. (Und übrigens auf meiner Plattform Esc gibt keine 27 zurück ...)
Die ganzen Zahlen, die die Antwortlisten von Abid sind, sind für den menschlichen Verstand meist unbrauchbar. (Sofern Sie kein Wunderkind sind ...). Wenn Sie sie jedoch in hexadezimaler Reihenfolge betrachten, Oder das Least Significant Byte betrachten, können Sie Muster feststellen ...
Mein Skript zum Untersuchen der Rückgabewerte von waitKey
befindet sich unten:
#!/usr/bin/env python
import cv2
import sys
cv2.imshow(sys.argv[1], cv2.imread(sys.argv[1]))
res = cv2.waitKey(0)
print 'You pressed %d (0x%x), LSB: %d (%s)' % (res, res, res % 256,
repr(chr(res%256)) if res%256 < 128 else '?')
Sie können es als minimalen Bildbetrachter für die Befehlszeile verwenden.
Einige Ergebnisse, die ich bekam:
q Brief:
Sie haben 1048689 (0x100071) gedrückt, LSB: 113 ('q')
Escape-Taste (traditionell ASCII 27):
Sie haben 1048603 (0x10001b) gedrückt, LSB: 27 ('\ x1b')
Platz:
Sie haben 1048608 (0x100020) gedrückt, LSB: 32 ('')
Diese Liste könnte weitergehen, jedoch sehen Sie den Weg, wenn Sie "seltsame" Ergebnisse erhalten.
BTW, wenn Sie es in eine Schleife schreiben wollen, können Sie einfach waitKey(0)
(für immer warten), anstatt den -1
-Rückgabewert zu ignorieren.
Die bereits veröffentlichten Antworten deuten darauf hin, dass einige der ungewöhnlichen Werte, die von waitKey
erhalten werden, auf Plattformunterschiede zurückzuführen sind. Im Folgenden schlage ich vor, dass (zumindest auf einigen Plattformen) das anscheinend ungerade Verhalten von waitKey
auf Tastaturmodifizierer zurückzuführen ist. Dieser Beitrag sieht ähnlich aus wie Tomasz 'Antwort, weil ich dies zunächst als Bearbeitung geschrieben habe, die abgelehnt wurde.
Die von waitKey
zurückgegebenen Schlüsselcodes hängen davon ab, welche Modifikatoren aktiviert sind. NumLock, CapsLock und die Tasten Shift, Ctrl und Alt ändern den von waitKey
zurückgegebenen Schlüsselcode, indem bestimmte Bits oberhalb der beiden am wenigsten signifikanten Bytes aktiviert werden. Das kleinste dieser Flags ist Shift bei 0x10000.
Eine modifizierte Version des von Tomasz veröffentlichten Skripts ist unten angegeben:
#!/usr/bin/env python
import cv2
import sys
cv2.imshow(sys.argv[1], cv2.imread(sys.argv[1]))
res = cv2.waitKey(0)
print 'You pressed %d (0x%x), 2LSB: %d (%s)' % (res, res, res % 2**16,
repr(chr(res%256)) if res%256 < 128 else '?')
Welche ergeben folgende Ergebnisse:
q Brief mit NumLock:
Sie haben 1048689 (0x100071), 2LSB gedrückt: 113 ('q')
Escape-Taste mit CapsLock, aber nicht NumLock:
Sie haben 131099 (0x2001b) gedrückt, 2LSB: 27 ('\ x1b')
Leerzeichen mit Shift und NumLock:
Sie haben 1114144 (0x110020), 2LSB: 32 ('') gedrückt.
Rechte Pfeiltaste mit Control, NumLock aus:
Sie haben 327507 (0x4ff53), 2LSB gedrückt: 65363 ('S')
Ich hoffe, das hilft, das ungewöhnliche Verhalten von waitKey
zu erklären und wie die tatsächliche Taste gedrückt wird, unabhängig vom Status von NumLock und CapLock. Von hier ist es relativ einfach etwas zu tun:
ctrlPressed = 0 != res & (1 << 18)
... da das Flag "Steuerschlüssel" das Bit 19 ist. Die Verschiebung ist bei Bit 17, der Zustand von CapsLock bei Bit 18, Alt ist bei Bit 20 und NumLock bei Bit 21.
(gezeigt in cv2.imshow)
cv2.waitKey (0) würde fortfahren, nachdem Sie auf die Schaltfläche "Scr" (oder dessen Kombination) gedrückt haben. Sie können dies jedoch versuchen
cv2.waitKey(0)
input('')
cv2.waitkey (0), um dem Programm genügend Zeit zu geben, um alles zu verarbeiten, was Sie in der Imshow und Eingabe sehen möchten ('')
damit warten Sie, bis Sie im Konsolenfenster die Eingabetaste drücken
das funktioniert auf Python 3
Der unten stehende Code funktioniert nicht. Wenn er ausgeführt wird, springt das Bild ohne Drücken schnell zum nächsten:
import cv2
img = cv2.imread('sof.jpg') # load a dummy image
while(1):
cv2.imshow('img',img)
k = cv2.waitKey(33)
if k==27: # Esc key to stop
break
Elif k==-1: # normally -1 returned,so don't print it
continue
else:
print k # else print its value
Das funktioniert aber:
def test_wait_key():
lst_img_path = [
'/home/xy/yy_face_head/face_det_test/111.png',
'/home/xy/yy_face_head/face_det_test/222.png'
#.....more path ...
]
for f_path in lst_img_path:
img = cv2.imread(f_path)
cv2.imshow('tmp', img)
c = cv2.waitKey(0) % 256
if c == ord('a'):
print "pressed a"
else:
print 'you press %s' % chr(c)
Ausgabe wie folgt:
Mit Ubuntu und C++ hatte ich Probleme mit dem Character/Integer-Cast. Ich musste cv::waitKey()%256
verwenden, um den korrekten ASCII -Wert zu erhalten.
Für C++:
Bei der Verwendung von Tastaturzeichen/-nummern wäre eine einfachere Lösung:
int key = cvWaitKey();
switch(key)
{
case ((int)('a')):
// do something if button 'a' is pressed
break;
case ((int)('h')):
// do something if button 'h' is pressed
break;
}
Das funktioniert am besten für mich:
Manchmal sind es die einfachen Antworten, die am besten sind; +)
Auch ich fand das verwirrend. Ich habe Ubuntu 18 ausgeführt und Folgendes festgestellt: Wenn das Fenster cv.imshow den Fokus hat, wird im Terminal ein Satz von Werten angezeigt - wie die oben erläuterten Werte für ASCII).
Wenn das Terminal den Fokus hat, werden unterschiedliche Werte angezeigt. IE- Sie sehen "a", wenn Sie die a-Taste drücken (anstelle von ASCII Wert 97) und "^]" anstelle von "27", wenn Sie Escape drücken.
In beiden Fällen habe ich die oben genannten 6-stelligen Zahlen nicht gesehen und einen ähnlichen Code verwendet. Es scheint, dass der Wert für waitKey der Abfragezeitraum in ms ist. Die Punkte veranschaulichen dies.
Führen Sie dieses Snippet aus und drücken Sie die Tasten, während der Fokus auf dem Testbild liegt. Klicken Sie dann auf das Terminalfenster und drücken Sie die gleichen Tasten.
import cv2
img = cv2.imread('test.jpg')
cv2.imshow('Your test image', img)
while(1):
k = cv2.waitKey(300)
if k == 27:
break
Elif k==-1:
print "."
continue
else:
print k