Auteurs :

Eric MATHIEU
Eric Rigaud

Archive du projet
cliquer ici ...

Le sujet

Le sujet de ce projet Internet était de réaliser une Web Cam, autrement un dit un mini serveur dédié à fournir des images provenant d'une caméra. Les caméras utilisées pourraient être soit les caméras des SiliconGraphics (Indy Cam), soit des quick-Cam pour PC.

La prise d'images

Elle a constitué notre premier problème, puisqu'elle met en jeu une caméra (si, si !). Hors nous n'avons pas trouvé de Quick Cam pour PC disponible, ce qui nous a contraint à utiliser les Indy-Cam des SiliconGraphics.

Sur ces machines, la prise d'images par programme s'effectue exclusivement par l'intermediaire d'une bibliothèque C. Nous avons donc écrit une petite routine C (webcam.c) permettant de réaliser une capture.

Ce programme prend en argument le facteur de zoom, compresse l'image en JPG puis écrit l'image sur la sortie standard. Ce flux de données sera traité par le serveur.

La bibliothèque offre également plusieurs fonctions de réglage de la caméra, comme la saturation, la brillance, etc. Cependant, parmi ces fonctions, seul l'accès au zoom est disponible sur les Indy.

C'est donc le seul réglage que nous avons pu intégrer dans notre routine. La capture d'image peut donc se faire avec 4 facteurs d'échelle différents.

  • 1/1 640x480
  • 1/2 320x240
  • 1/4 160x120
  • 1/8 80x60

Le serveur en java

Le serveur de gestion de la WebCam est un serveur HTTP écrit en Java (jhttp.java). Il a un fonctionnement classique lorsqu'il reçoit une requête GET avec un nom de fichier, il renvoie une réponse suivant la norme HTTP avec le contenu du fichier. Par contre si la ressource demandée finit par un '/' c'est que le client désire un snap shot de la caméra. Dans ce cas, le serveur analyse la requête, et vérifie si des indications sur la taille de l'image ont été transmises : '?z=x' où x représente la taille désirée. Si ce n'est pas le cas il considère que la taille par défaut (320x200) correspondant à un zoom de 1 a été demandée.

Un objet camera est créé, il appelle la fonction SnapShot qui lui renvoie un tableau d'octets contenant l'image. Il renvoie donc ce tableau au client en rajoutant l'entête de réponse HTTP.

Le serveur est MultiConnection, en effet il crée un thread à chaque connexion.

 

L'objet Camera.

L'objet Camera gère la récupération d'un snap Shot. Pour cela il exécute le programme Webcam écrit en langage C qui effectue un snap shot et renvoie l'image sur la sortie standard. Ceci permet au programme java de la récupérer avec la fonction getInputStream de l'objet Process. On évite ainsi une d'écrire l'image sur le disque.

Le lancement des serveurs

Les fichiers JHTTP.class, webcam, Camera.class doivent être installés dans le répertoire où l'on désire installer le serveur. Pour lancer le serveur :

java jhttp . [Port]

L'option Port correspondant au port sur lequel le serveur va attendre les requêtes.

Pour nos fichiers de démo, les serveurs ont été lancés pour écouter sur le port 8080

Utilisation

Les images fournies par le serveur peuvent être utilisées de trois façons différentes :

  • Directement dans une page HTML
  • Grâce à la page HTML de visualisation (web_cam_index.html)
  • Par l'intermédiaire d'une applet qui fournit des images en continu

Dans une page HTML

Il suffit d'indiquer l'adresse d'un serveur en marche comme source d'une image :

<IMG SRC="http://thulium.essi.fr:8080">

La page HTML de visualisation

C'est la page d'accueil, qui permet de voir d'un seul coup d'oeil les images prises par l'ensemble des caméras de la salle des SiliconGraphics.

A chaque image est associé le nom de la station qui fournit la capture. Un click sur une image ouvre une page HTML contenant l'image dans un format agrandi.

 

 

Cette page HTML est rafraîchie toutes les 10 secondes grâce au tag META EXPIRES. De cette façon, le client reçoit une nouvelle image de la caméra toutes les 10 secondes. Les flèches permettent à l'utilisateur de se déplacer de caméra en caméra.

L'applet de visualisation

Cette applet a été réalisée pour pouvoir visualiser les images d'une caméra en flux presque continu. Pour éviter les problèmes d'affichage (deux images s'affichent en même temps), nous avons dû fixer le temps entre chaque capture à 500 ms. Cette applet est visible par l'intermédiaire du fichier : visio.html.

 

 

Cette applet permet également à l'utilisateur de régler le facteur d'échelle de l'image. La valeur 1 correspondant à la taille maximale.

Les problèmes rencontrés

La caméra

Au début nous pensions pouvoir utiliser une caméra pour PC, ce qui nous aurait permis de placer la caméra dans un lieu plus stratégique que la salle plus ou moins désertée des SiliconGraphics

Les réglages de la caméra

D'après les informations disponibles dans le man, plusieurs paramètres sont prévus pour régler les images prises par les caméras. Nous avions donc réalisé une interface en swing pour effectuer ces différents réglages (hue, saturation, zoom, brigtness, etc.). Nous avions également étudié les moyens disponibles pour que cette interface soit visible depuis un browser. Ce travail n'a pas pu être utilisé, car seul le réglage du zoom fonctionne sur les Indy cam…

Lien C-Java

Nous avons choisi d'utiliser le langage java pour réaliser notre serveur HTTP. Hors le seul moyen de faire des captures d'images est un programme en C…Nous avons eu du mal à faire passer un flux de données entre un programme C et notre serveur en java.