wake-up-neo.net

Verwenden anderer Schlüssel für die waitKey () - Funktion von opencv

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?

40
md1hunox

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 :)
62
Abid Rahman K

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.

15
Tomasz Gandor

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.

12
Andrew C.

Wenn Sie das Programm anhalten möchten, um Screenshots des Fortschritts aufzunehmen

(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

1

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:

 enter image description here

1
Jayhello

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.

1
00zetti

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;
}
1
Poka Yoke

Das funktioniert am besten für mich:

http://www.asciitable.com/

Manchmal sind es die einfachen Antworten, die am besten sind; +)

0
Joe Rytting

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 
0
gerry174