Una vez obtenemos en la aplicación toda la información descendente de la cámara a la aplicación, ya sólo falta la comunicación ascendente, que en este caso será únicamente para ordenar los movimientos y los ajustes del zoom pertinentes a la cámara.
Para el envío de comandos a la cámara se utiliza la función:
SNC::SendCGICommand(sncHandle, "POST", "/command/ptzf.cgi",
"RelativePanTilt=FFD8,0000,24", sResponse, sizeof(sResponse), &ret_len);
A través de esta función y configurando correctamente la cadena de caracteres que en ella se coloca como cuarto argumento, se puede conseguir cualquier tipo de movimiento de la cámara o cualquier ajuste del zoom.
Se podrán realizar movimientos tanto relativos a la posición actual como absolutos en cualquiera de los ejes de la cámara y ajustar el zoom, también de manera relativa a la posición actual o absoluta. Para ello utilizaremos los siguientes comandos:
RelativePanTilt: realiza el movimiento relativo en horizontal y vertical. Es usado en los movimientos realizados por los botones de movimiento de la interfaz gráfica, y en la ordenación de movimientos desde el módulo de seguimiento automático.
AbsolutePanTilt: realiza el movimiento hacia una posición definida en las coordenadas que acompañan al comando. Este comando se usa al pulsar cualquier botón de posición predeterminada.
RelativeZoom: realiza el ajuste del zoom desde la posición en la que se encuentra, y dependiendo de la magnitud introducida aumentará el zoom o lo disminuirá. Si se aumenta lo suficiente el zoom, pasará de ser un zoom óptico a ser un zoom digital sobre la imagen capturada. Este comando es utilizado por los botones de ajuste del zoom de la interfaz gráfica.
AbsoluteZoom: realiza el ajuste del zoom haciendo que se coloque en una posición determinada por la magnitud que lo acompaña. Se utiliza al colocar la cámara en las posiciones predeterminadas ya que requieren también un zoom sobre la zona. En el caso del comando RelativePanTilt, las magnitudes que lo acompañan significan la cantidad de movimiento que realizan en cada eje y la velocidad a la que se va a realizar. Dichas magnitudes están representadas en hexadecimal:
Pan: es la primera magnitud que acompaña al comando y significa la cantidad de movimiento que realiza en horizontal desde la posición actual. Si se introduce un número positivo, 0028h, se moverá una magnitud de 40 hacia la derecha, si se introduce un número negativo, FFD8h, se moverá una magnitud de 40 hacia la izquierda.
Tilt: es la segunda magnitud que acompaña al comando y significa la cantidad de movimiento que realiza en vertical desde la posición actual. Si se introduce un número positivo, 0028h, se moverá una magnitud de 40 hacia arriba, si se introduce un número negativo, FFD8h, se moverá una magnitud de 40 hacia abajo.
Speed: es la tercera magnitud que acompaña al comando y significa la velocidad a la que realizará el movimiento la cámara. Está representada en hexadecimal y
puede oscilar entre 00h y 24h, siendo 00h la menor velocidad y 24h la máxima velocidad de movimiento.
En el caso del comando AbsolutePanTilt, las magnitudes que lo acompañan significan la posición final de la cámara a la que se quiere desplazar la misma. Dichas magnitudes están representadas en hexadecimal:
Pan: es la primera magnitud que acompaña al comando y es la coordenada horizontal a la que se va a mover la cámara. Las coordenadas horizontales que se pueden introducir varían entre F670h, que corresponde a una rotación de 170º hacia la izquierda, y 0990h que corresponde a una rotación de 170º hacia la derecha, pasando por 0000h que es la posición de referencia de la cámara, tal y como se muestra en la Figura 4-4.
Figura 4-4: vista superior de la cámara. Rango de los ángulos horizontales que puede tomar la cámara.
Tilt: es la segunda magnitud que acompaña al comando y es la coordenada vertical a la que se va a mover la cámara. Las coordenadas verticales que se pueden introducir varían entre FCC4h, que corresponde a una rotación de 57,5º hacia abajo, y 033Ch que corresponde a una rotación de 57,5º hacia arriba, pasando por 0000h que es la posición de referencia de la cámara, tal y como se muestra en la Figura 4-5.
Figura 4-5: Vista lateral de la cámara. Rango de los ángulos verticales que puede tomar la cámara.
Speed: es la tercera magnitud que acompaña al comando y significa la velocidad a la que realizará el movimiento la cámara. Está representada en hexadecimal y puede oscilar entre ‘00’ y ‘24’, siendo ‘00’ la menor velocidad y ‘24’ la máxima velocidad de movimiento.
Hay que decir que las posiciones absolutas no siempre serán las mismas en distintas cámaras, dependerán de la colocación que tenga cada una de ellas, por ejemplo, el punto de referencia horizontal, 0000h, no siempre estará enfocando justamente al centro de la pizarra. Es por ello que para cada aula habrá que hacer una pre-configuración de las posiciones predeterminadas.
En el caso del comando AbsoluteZoom, la magnitud que lo acompaña significa la posición final del zoom de la cámara. Dicha magnitud está representada en hexadecimal y puede variar entre 0000h y 4000h pasando por los valores indicados en la Tabla 4-1 para obtener
un zoom óptico, aunque si seguimos aumentando la magnitud pasaremos a tener un zoom digital. No es necesario introducir exactamente los valores que se muestran ya que si introducimos un valor intermedio tendremos un zoom intermedio entre las Zoom Ratio.
5 Subsistema de Seguimiento Activo
El subsistema de seguimiento activo desarrollado en este proyecto se basa en la localización de la cara del profesor en la imagen completa usando los puntos obtenidos mediante el algoritmo SURF. Para complementar esta localización se utiliza un algoritmo secundario que funciona en paralelo, utilizando el histograma de color de la cara del profesor para la localización en la imagen completa. En las distintas secciones de este capítulo se describirán tanto el esquema como el funcionamiento interno de cada uno de los algoritmos, y cómo llegar a generar el movimiento necesario de la cámara para mantener enfocado al profesor.