2013-01-24 14 views
26

Sto lavorando a un programma (python, opencv) in cui utilizzo lo spacebar per passare al fotogramma successivo e Esc per uscire dal programma. Queste sono le uniche due chiavi che ho lavorato. Ho provato a scoprire più chiavi, ho provato vari codici per loro ma non funzionava. in particolare i tasti freccia.Utilizzo di altri tasti per la funzione waitKey() di opencv

Ho trovato this su waitkey, ma non funziona.

Quindi la mia domanda è: come posso prendere altre chiavi oltre a esc e spacebar per attivare determinate funzioni nel mio programma python-opencv?

risposta

42

È possibile utilizzare la funzione ord() in Python per questo.

Ad esempio, se si vuole innescare 'una' pressione di un tasto, procedere come segue:

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

Consulta l'esempio di codice qui: Drawing Histogram

UPDATE:

Per trovare il valore chiave per qualsiasi chiave è stampare il valore della chiave utilizzando uno script semplice come indicato:

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 

Con questo codice, ho avuto i seguenti valori:

Upkey : 2490368 
DownKey : 2621440 
LeftKey : 2424832 
RightKey: 2555904 
Space : 32 
Delete : 3014656 
...... # Continue yourself :) 
+0

Grazie a @Abid, funziona con la maggior parte dei tasti, Come faccio a usare i tasti freccia? – md1hunox

+0

aggiornato la risposta @vineetrok –

+0

Non ho ricevuto alcun numero per i tasti freccia su OSX – mirosval

14

I keycodes restituiti da waitKey sembrano dipendente dalla piattaforma. Tuttavia, può essere molto educativo, per vedere che cosa i tasti tornano (e tra l'altro, sulla mia piattaforma, Esc non restituisce 27 ...)

L'interi Thay liste risposta di Abid sono mosty inutili per la mente umana (a meno che tu non sia un prodigio savant ...). Tuttavia, se li si esamina in esadecimale, o dare un'occhiata al byte meno significativo, è possibile notare i modelli ...

Il mio script per l'esame dei valori di ritorno da waitKey è qui sotto:

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

Puoi usarlo come minimo, visualizzatore di immagini da riga di comando.

Alcuni risultati, che ho ottenuto:

  • q lettera:

    È stato premuto 1.048.689 (0x100071), LSB: 113 ('q')

  • tasto Escape (tradizionalmente, ASCII 27):

    È stato premuto 1.048.603 (0x10001b), LSB: 27 ('\ X1B')

  • Spazio:

    avete premuto 1.048.608 (0x100020), LSB: 32 (' ')

La lista potrebbe continuare a lungo, ma si vede la strada da percorrere, quando si ottiene 'Risultati strani' .

BTW, se si desidera inserirlo in un ciclo, è possibile solo waitKey(0) (attendere per sempre), invece di ignorare il valore di ritorno -1.

+3

La dipendenza dalla piattaforma sembra un problema con segno/senza segno. Dovrebbe essere facilmente risolta utilizzando operazioni bit a bit, ad esempio 'res = cv2.waitkey() & 0xEFFFFF'. – billyjmc

0

per C++:

Nel caso di utilizzo di caratteri di tastiera/numeri, una soluzione più facile sarebbe:

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; 
} 
9

Le risposte che sono già state pubblicate suggeriscono che alcuni dei valori insoliti ottenuti per waitKey sono dovuti a differenze di piattaforma. Di seguito, propongo che (almeno su alcune piattaforme) il comportamento apparentemente strano di waitKey sia dovuto a modificatori di tastiera. Questo post assomiglia alla risposta di Tomasz perché inizialmente l'ho scritto come una modifica, che è stata respinta.


I keycodes restituiti da waitKey cambiamento a seconda di quale modificatori sono abilitati. Bloc Num, Bloc Maiusc e i tasti Maiusc, Ctrl e Alt modificano tutti il ​​codice chiave restituito da waitKey attivando determinati bit sopra i due byte meno significativi. Il più piccolo di questi flag è Shift a 0x10000.

Una versione modificata dello script Tomasz pubblicato è il seguente:

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

che danno i seguenti risultati:

  • lettera q con NumLock:

    avete premuto 1.048.689 (0x100071), 2LSB: 113 ('q')

  • Chiave di fuga con tappi Blocco ma non NumLock:

    avete premuto 131.099 (0x2001b), 2LSB: 27 ('\ X1B')

  • spazio con Shift e NumLock:

    avete premuto 1.114.144 (0x110020), 2LSB: 32 (' ')

  • tasto freccia destra con controllo, NumLock fuori:

    avete premuto 327507 (0x4ff53), 2LSB: 65.363 (' S')

Spero che questo aiuti a spiegare il comportamento insolito di waitKey e come ottenere premuto il tasto effettivo indipendentemente dallo stato di NumLock e CapLock. Da qui è relativamente semplice da fare qualcosa di simile:

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

... come il "controllo chiave" bandiera è po 19. Shift è in po '17, lo stato di CapsLock a bit 18, Alt è a 20 bit e NumLock è al bit 21.

+1

Wow, quindi riguardava i modificatori ... Bello, non escludo quasi mai NumLock. Nota a margine: a volte è più conveniente contare i bit da 0 - cioè Shift è al bit 16 (e la maschera è '(1 << 16)' Inoltre, premendo Shift si ottiene anche un valore: LShift è '0xffe1' e RShift' 0xffe2'. I modificatori si applicano anche qui. –

0

Con Ubuntu e C++ ho avuto problemi con il cast di Character/Integer. Avevo bisogno di usare cv::waitKey()%256 per ottenere il valore ASCII corretto.

Problemi correlati