Używanie innych klawiszy dla funkcji waitKey () OpenCV

Pracuję nad programem (python, opencv), w którym używam spacebar, aby przejść do następnej klatki i Esc, aby zakończyć program. To jedyne dwa klucze, które mam. Próbowałem dowiedzieć się więcej kluczy, próbowałem różnych kodów dla nich, ale nie zadziałało. zwłaszcza klawisze strzałek.

Znalazłem to o waitkey, ale to nie działa.

Więc moje pytanie brzmi, Jak złapać inne klucze oprócz esc i spacebar aby uruchomić niektóre funkcje w moim Pythonie-opencv program?

Author: md1hunox, 2013-01-24

7 answers

Możesz do tego użyć funkcji ord() w Pythonie.

Na przykład, jeśli chcesz nacisnąć klawisz 'a', wykonaj następujące czynności:

if cv2.waitKey(33) == ord('a'):
   print "pressed a"

Zobacz przykładowy kod tutaj: rysowanie histogramu

Aktualizacja:

Aby znaleźć wartość klucza dla dowolnego klucza, należy wydrukować wartość klucza za pomocą prostego skryptu w następujący sposób:

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

Z tym kodem mam następujące wartości:

Upkey : 2490368
DownKey : 2621440
LeftKey : 2424832
RightKey: 2555904
Space : 32
Delete : 3014656
...... # Continue yourself :)
 54
Author: Abid Rahman K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-24 05:08:31

Kody klawiszy zwracane przez waitKey wydają się zależne od platformy. Jednak może to być bardzo pouczające, aby zobaczyć, co klucze zwracają (a przy okazji, na mojej platformie, Esc nie zwraca 27...)

Liczby całkowite, które według listy odpowiedzi Abida są w większości bezużyteczne dla ludzkiego umysłu (chyba, że jesteś geniuszem...). Jednak, jeśli zbadasz je w hex, albo spójrz na najmniej znaczący bajt, możesz zauważyć wzorce...

Mój skrypt do sprawdzania wartości zwracanych z waitKey jest poniżej:

#!/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 '?')

Można go używać jako minimalnej przeglądarki obrazów wiersza poleceń.

Niektóre wyniki, które dostałem:

  • Q letter:

    Nacisnąłeś 1048689 (0x100071), LSB: 113 ('q')

  • Klucz ucieczki (tradycyjnie, ASCII 27):

    Wcisnąłeś 1048603 (0x10001b), LSB: 27 ('\x1b')

  • Przestrzeń:

    Wcisnąłeś 1048608 (0x100020), LSB: 32 ( '" )

Ta lista może trwać, jakkolwiek widzisz drogę do idź, gdy dostaniesz "dziwne" wyniki.

BTW, jeśli chcesz umieścić go w pętli, możesz po prostu waitKey(0) (czekać w nieskończoność), zamiast ignorować zwracaną wartość -1.

 15
Author: Tomasz Gandor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-13 22:23:56

Odpowiedzi, które zostały już opublikowane, sugerują, że niektóre nietypowe wartości uzyskane przez waitKey są spowodowane różnicami w platformie. Poniżej proponuję, aby (przynajmniej na niektórych platformach) pozornie dziwne zachowanie waitKey wynikało z modyfikatorów klawiatury. Ten post wygląda podobnie do odpowiedzi Tomasza, ponieważ początkowo napisałem to jako edit, który został odrzucony.


Kody klawiszy zwracane przez waitKey zmieniają się w zależności od tego, które modyfikatory są włączone. NumLock, CapsLock I Shift, Wszystkie klawisze Ctrl i Alt modyfikują kod klawiszy zwracany przez waitKey, włączając pewne bity powyżej dwóch najmniej znaczących bajtów. Najmniejszą z tych flag jest Shift przy 0x10000.

Zmodyfikowana wersja skryptu zamieszczonego przez Tomasza znajduje się poniżej:

#!/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 '?')

Które dają następujące wyniki:

  • Q litera Z Numlockiem:

    Nacisnąłeś 1048689 (0x100071), 2LSB: 113 ('q')

  • Klucz ewakuacyjny z CapsLock, ale nie NumLock:

    Wcisnąłeś 131099 (0x2001b), 2LSB: 27 ('\x1b')

  • Spacja z Shift i NumLock:

    Wcisnąłeś 1114144 (0x110020), 2LSB: 32 ( ' ')

  • Klawisz strzałki w prawo ze sterowaniem, NumLock off:

    Wcisnąłeś 327507 (0x4ff53), 2LSB: 65363 ('S')

Mam nadzieję, że to pomoże wyjaśnić nietypowe zachowanie waitKey i sposób naciśnięcia rzeczywistego klawisza niezależnie od stanu NumLock i CapLock. Stąd stosunkowo łatwo jest coś zrobić like:

ctrlPressed = 0 != res & (1 << 18)

...jako znacznik "control key" jest bitem 19. Shift to bit 17, Stan CapsLock to bit 18, Alt To bit 20, A NumLock to bit 21.

 12
Author: Andrew C.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-18 15:59:32

Dla C++:

W przypadku używania znaków/cyfr z klawiatury łatwiejszym rozwiązaniem byłoby:

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
Author: Poka Yoke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-25 10:46:41

Z Ubuntu i C++ miałem problemy z obsadą postaci/liczby całkowitej. Musiałem użyć cv::waitKey()%256, aby uzyskać poprawną wartość ASCII.

 1
Author: 00zetti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-17 11:47:31

Jeśli chcesz zatrzymać program, aby zrobić zrzuty ekranu z postępów

(pokazane w powiedzmy cv2.imshow)

Cv2.waitKey (0) będzie kontynuowane po naciśnięciu przycisku "Scr" (lub jego kombinacji), ale możesz spróbować tego

cv2.waitKey(0)
input('')

Cv2.waitkey (0), aby dać programowi wystarczająco dużo czasu na przetworzenie wszystkiego, co chcesz zobaczyć w imshow i input (")

Aby poczekać, aż naciśniesz Enter w oknie konsoli

To działa na Pythonie 3

 1
Author: GodIsAnAstronaut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-24 16:12:03

Jak dla mnie poniższy kod nie działa , Po uruchomieniu obrazek szybko przejdzie do następnego bez Twojego naciśnięcia:

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

Ale to działa:

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)

Wyjście jak poniżej:

Tutaj wpisz opis obrazka

 1
Author: Jayhello,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-03 03:46:09