python - spacebar - Uso de otras claves para la función waitKey() de opencv
opencv waitkey spacebar (7)
Estoy trabajando en un programa (python, opencv) en el que utilizo la spacebar
para ir al siguiente fotograma y Esc
para salir del programa. Estas son las dos únicas claves que tengo trabajando. Traté de averiguar más llaves, intenté varios códigos pero no funcionó. especialmente las teclas de flecha.
Encontré this sobre waitkey
, pero no funciona.
Entonces mi pregunta es, ¿cómo puedo capturar otras teclas además de esc
y la spacebar
para activar ciertas funciones en mi programa python-opencv?
Si desea pausar el programa para tomar capturas de pantalla del progreso
(se muestra en digamos cv2.imshow)
cv2.waitKey (0) continuará después de presionar el botón "Scr" (o su combinación), pero puede intentar esto
cv2.waitKey(0)
input('''')
cv2.waitkey (0) para dar al programa el tiempo suficiente para procesar todo lo que desea ver en el imshow y la entrada ('''')
para hacer que espere a que presione Enter en la ventana de la consola
esto funciona en python 3
Con Ubuntu y C ++ tuve problemas con el reparto Personaje / Entero. Necesitaba usar cv::waitKey()%256
para obtener el valor ASCII correcto.
En cuanto a mí, el siguiente código no funciona , cuando se ejecuta, la imagen pasará a la siguiente rápidamente sin su presión:
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
Pero esto funciona:
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)
Salida como abajo:
Las respuestas que ya se han publicado sugieren que algunos de los valores inusuales obtenidos por waitKey
se deben a diferencias de plataforma. A continuación, propongo que (al menos en algunas plataformas) el comportamiento aparentemente extraño de waitKey
se debe a los modificadores del teclado. Esta publicación es similar a la respuesta de Tomasz porque inicialmente escribí esto como una edición, que fue rechazada.
Los códigos de waitKey
devueltos por waitKey
cambian dependiendo de qué modificadores están habilitados. NumLock, CapsLock y las teclas Mayús, Ctrl y Alt modifican el código waitKey
devuelto por waitKey
al habilitar ciertos bits por encima de los dos bytes menos significativos. El más pequeño de estos indicadores es Shift en 0x10000.
A continuación, se incluye una versión modificada del guión publicado por Tomasz:
#!/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 ''?'')
Que dan los siguientes resultados:
q carta con NumLock:
Presionó 1048689 (0x100071), 2LSB: 113 (''q'')
Escape key con CapsLock pero no NumLock:
Presionó 131099 (0x2001b), 2LSB: 27 (''/ x1b'')
Espacio con Shift y NumLock:
Presionó 1114144 (0x110020), 2LSB: 32 ('''')
Tecla de flecha derecha con control, NumLock desactivado:
Presionó 327507 (0x4ff53), 2LSB: 65363 (''S'')
Espero que eso ayude a explicar el comportamiento inusual de waitKey
y cómo presionar la tecla real independientemente del estado de NumLock y CapLock. A partir de aquí, es relativamente simple hacer algo como:
ctrlPressed = 0 != res & (1 << 18)
... como la bandera de la "tecla de control" es el bit 19. Shift está en el bit 17, el estado de CapsLock en el bit 18, Alt está en el bit 20, y NumLock está en el bit 21.
Los códigos de waitKey
devueltos por waitKey
parecen dependientes de la plataforma. Sin embargo, puede ser muy educativo, ver qué devuelven las claves (y, por cierto, en mi plataforma, Esc no devuelve 27 ...)
Los números enteros de las listas de respuestas de Abid son inútiles para la mente humana (a menos que seas un prodigio sabio ...). Sin embargo, si los examina en hexadecimal o echa un vistazo al Byte menos significativo, puede observar patrones ...
Mi script para examinar los valores de retorno de waitKey
está a continuación:
#!/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 ''?'')
Puede usarlo como un visor de imágenes de línea de comandos mínimo.
Algunos resultados, que obtuve:
q carta:
Presionó 1048689 (0x100071), LSB: 113 (''q'')
Tecla de escape (tradicionalmente, ASCII 27):
Presionó 1048603 (0x10001b), LSB: 27 (''/ x1b'')
Espacio:
Presionó 1048608 (0x100020), LSB: 32 ('''')
Esta lista podría continuar, sin embargo, verá el camino a seguir, cuando obtenga resultados ''extraños''.
Por cierto, si quiere ponerlo en un bucle, puede simplemente waitKey(0)
(esperar para siempre), en lugar de ignorar el -1
valor de retorno.
Para C ++:
En caso de utilizar caracteres / números de teclado, una solución más fácil sería:
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;
}
Puede usar la función ord()
en Python para eso.
Por ejemplo, si desea activar la tecla ''a'', presione de la siguiente manera:
if cv2.waitKey(33) == ord(''a''):
print "pressed a"
Vea un código de ejemplo aquí: Dibujo Histograma
ACTUALIZAR:
Para encontrar el valor de la clave para cualquier tecla es imprimir el valor de la clave con un simple script de la siguiente manera:
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 este código, obtuve los siguientes valores:
Upkey : 2490368
DownKey : 2621440
LeftKey : 2424832
RightKey: 2555904
Space : 32
Delete : 3014656
...... # Continue yourself :)