Estoy tratando de aprender OPENCV para un procesamiento de imagen que proyecto a través de tutoriales en línea.

El opencv documentación dice que waitKey() devuelve un int. Se supone que esta es el valor ASCII de la tecla pulsada. Pero la mayoría de los tutoriales en línea utilice el siguiente código que se compila y se ejecuta correctamente.

if ( (char)27==waitKey(1) ) break;

Esto sugiere que waitKey devuelve un char y no un int.
Por favor alguien puede explicar?

5 Comentarios

  1. 5

    cv::waitKey() devuelve un int. La razón char key = cv::waitKey(1) funciona es debido a las conversiones implícitas en C++. En este caso el valor de retorno de tipo int para cv::waitKey() es implícitamente convertido a char y, a continuación, asigna a key. Ver en este enlace de referencia. Las siguientes afirmaciones son equivalentes:

    char key = (char) cv::waitKey(30); //explicit cast
    char key = cv::waitKey(30);        //implicit cast

    En el caso de if ((char)27 == waitKey(1)) break;, la salida de waitKey(1) es probablemente convierte de forma implícita a char y, a continuación, en comparación con esc de caracteres ASCII (código 27). Me gustaría volver a escribir con la conversión explícita para evitar la ambigüedad.

    if ( (char)27 == (char) waitKey(1) ) break;

    La manera de ver cómo se hace a menudo en OpenCV muestra archivos cpp:

    char key = (char) cv::waitKey(30);   //explicit cast
    if (key == 27) break;                //break if `esc' key was pressed. 
    if (key == ' ') do_something();      //do_something() when space key is pressed

    El siguiente también es posible, pero el primer enfoque es mucho más limpio:

    int key = cv::waitKey(30) & 255; //key is an integer here
    if (key == 27) break;            //break when `esc' key is pressed
  2. 1

    Con Ubuntu 14.04, he tenido que utilizar cv::waitKey()%256 para obtener el correcto código ASCII.
    Usted puede imprimir el resultado de cv::waitKey() a ver si funciona correcta para usted 🙂

  3. 1

    He opencv3.2 compilado para Ubuntu 16.04. waitKey() devuelve int, de los cuales sólo char parte es útil y el resto de la int parece ser un cubo de basura. Así, en el procesamiento de vídeo en bucle una línea como esta

    if (cv::waitKey(10) > 0) break; //if key pressed then break

    rompe casi seguro, porque incluso si usted no presiona una tecla de un no-cero basura «pulse la tecla» para usted. Pero una línea como esta

    if ((char)cv::waitKey(10) > 0) break; //if key pressed then break

    funciona como se pretende y se rompe sólo si se presiona una tecla. Una lógica Similar se aplica cuando se los compara con 27. La basura en el valor de retorno puede ser un fallo en OpenCV en efecto.

  4. 0

    No importa como caracteres ASCII entre 0 y 127. Así que cualquiera de los resultados emitidos en el mismo prácticamente.

  5. 0

    Claramente, se utiliza algún tipo de 8 bits tipo de datos para representar los códigos de teclas. En una de 8 bits chamuscado tipo de datos entero, -1 podría ser representado como ocho 1s (1111 1111, complementarias código). Y en C++, tipo de datos entero generalmente es de 32 bits. Así, ocho 1s se interpretan como 255.

Dejar respuesta

Please enter your comment!
Please enter your name here