2011-03-07 32 views
64

¿Qué ocurre durante la ejecución de cvWaitKey()? ¿Cuáles son algunos casos de uso típicos? Lo vi en OpenCV referencia, pero la documentación no está clara en su propósito exacto.¿Qué hace la función cvWaitKey() de OpenCV?

+2

lo que don' ¿Lo entiendes o qué crees que hace? La referencia de la documentación de OpenCV me parece muy clara ... –

+6

@ user588855 Es importante para todos nosotros que revise sus preguntas y acepte algunas respuestas, incluido esto. – karlphillip

+4

Para el registro, 'cvWaitKey()' ahora es una función C en desuso. 'waitKey()' es el equivalente moderno de C++. – StockB

Respuesta

10

cvWaitKey(0) detiene su programa hasta que presione un botón.

cvWaitKey(10) no detiene su programa, pero se despierta y alerta para finalizar su programa cuando presiona un botón. Se usa en bucles porque cvWaitkey no detiene el bucle.

El uso normal

char k; 

k=cvWaitKey(0); 

if(k == 'ESC') 

con k se puede ver lo que se ha pulsado la tecla.

+5

También algo más importante: es el ciclo de mensajes de openCV. No verá ningún dato nuevo en cvNamedWindow a menos que llame a cvWaitKey() en el bucle –

+10

-1 de mi parte para hacer una comparación ** char? = Multichar **. Esto es simplemente incorrecto Use el carácter imprimible (que en este caso no es posible ya que ESC es un carácter no imprimible, pero en el caso de usar la tecla Q puede hacer una comparación? = 'Q') o elija una de las representaciones numéricas. El ASCII admite varios sistemas numéricos: hexadecimal (0x1b), decimal (27) y octal (033). Todos los listados representan la tecla ESC. – rbaleksandar

5
/* Assuming this is a while loop -> e.g. video stream where img is obtained from say web camera.*/  
cvShowImage("Window",img); 

/* A small interval of 10 milliseconds. This may be necessary to display the image correctly */ 
cvWaitKey(10); 

/* to wait until user feeds keyboard input replace with cvWaitKey(0); */ 
16

Llanura simplemente, cvWaitKey() duerme durante X milisegundos, a la espera de cualquier tecla que se presione.

int cvWaitKey(int X); 

Si se presiona una tecla, esta función devuelve el código de clave ASCII. O devuelve -1 si no se presionó ninguna tecla durante ese tiempo.

+3

Esa no es toda la historia. En la práctica, incluso si no le importa la entrada del teclado, llamar a esta función puede ser esencial para algunas aplicaciones OpenCV. Hay algo de [más información aquí] (http://opencv.willowgarage.com/wiki/documentation/c/highgui/WaitKey). –

116

cvWaitKey(x)/cv::waitKey(x) hace dos cosas:

  1. espera a x milisegundos para una pulsación de tecla en una ventana OpenCV (es decir, creado a partir de cv::imshow()). Tenga en cuenta que no escucha en stdin para la entrada de la consola. Si se presionó una tecla durante ese tiempo, devuelve el código ASCII de la clave. De lo contrario, devuelve -1. (Si x es cero, se espera indefinidamente para la pulsación de tecla.)
  2. Maneja los eventos de ventanas, como crear ventanas con cv::namedWindow(), o mostrar imágenes con cv::imshow().

Un error común para los recién llegados OpenCV es llamar cv::imshow() en un bucle a través de fotogramas de vídeo, sin el seguimiento de cada sorteo con cv::waitKey(30). En este caso, no aparece nada en la pantalla, ya que highgui nunca tiene tiempo para procesar las solicitudes de sorteo de cv::imshow().

+1

1+ para una respuesta simple y completa. – qwerty9967

4

El cvWaitKey simplemente proporciona algo de retraso. Por ejemplo:

char c = cvWaitKey(33); 
if(c == 27) break; 

Este código era parte de mi código en el que se cargaba un video en openCV y se generaban los marcos. El número 33 en el código significa que después de 33ms, se mostraría un nuevo marco. Por lo tanto, fue un intervalo de tiempo o deli de 33ms entre cada cuadro que se muestra en la pantalla. Espero que esto ayude.

1

cvWaitKey(milliseconds) simplemente espere los milisegundos proporcionados como un parámetro para una próxima pulsación de tecla del teclado.

Ojos humanos que no pueden ver la cosa en movimiento en menos de 1/10 de segundo, por lo que usamos esto para mantener el mismo cuadro de imagen durante un tiempo en la pantalla. Tan pronto como se presiona la tecla del teclado, se realizará la siguiente operación.

En pocas palabras cvWaitKey(milliseconds) espere para presionar la tecla o millisecond tiempo proporcionado.

+1

"Los ojos humanos no pueden ver la cosa moviéndose en menos de 1/10 de segundo, así que usamos esto para mantener el mismo cuadro de imagen durante un tiempo en la pantalla. Tan pronto como se presione la tecla del teclado, se realizará la siguiente operación" ¿Esto realmente importa a la pregunta? – quantum

8

Nota para cualquier persona que pueda haber tenido problemas con la función cvWaitKey(). Si descubre que cvWaitKey(x) no está esperando, asegúrese de que realmente tiene una ventana abierta (es decir, cvNamedWindow(...)). Ponga la declaración cvNamedWindow(...) ANTES de cualquier llamada a la función cvWaitKey().

+0

Bienvenido en SO, es un buen lugar para publicar información como lo hizo. Por lo general, cuando publica una respuesta debe traer nueva información a la pregunta, por lo que no crea una publicación redundante. Cual fue el caso para tu publicación. Si tiene un comentario más pequeño, también podría comentar la pregunta más adelante (cuando obtenga más Rep). Si aún no lo ha leído, le sugiero que consulte las preguntas frecuentes: http://stackoverflow.com/faq. Saludos – ForceMagic

6

. argumento de 0 se interpreta como infinite

. Para arrastrar las ventanas highGUI, debe llamar continuamente a la función cv::waitKey(). por ejemplo, para imágenes estáticas:

cv::imshow("winname", img);

while(cv::waitKey(1) != 27); // 27 = ascii value of ESC

-1

esperas milisegundos para comprobar si se pulsa la tecla, si se presiona en ese intervalo devolver su valor ASCII, de lo contrario, aún -1

Cuestiones relacionadas