Bonjour à tous,
Je suis bloqué depuis 3 4 jours sur un problème qui commence à m'inquiéter...
Je vais tenter de décrire au mieux mon problème, et ma requête.
Ne vous faites pas de soucis, la compréhension de ce post est aisée.
Je dois développer une application permettant de détecter les mouvements du flux vidéo d'une Caméra sur IP.
Voici le principe que j'applique, que j'ai rédigé sous word (je le mets en citation pour mieux le distinguer) :
Citation :
Pour détecter un mouvement, il suffit de comparer les couleurs des pixels de limage actuelle avec les couleurs des pixels de limage précédente (limage précédente étant à X secondes avant, X étant réglé par le développeur).
Si la couleur du pixel ne fait pas partie de lintervalle [CouleurRef 100000, CouleurRef + 100000], alors cela incrémente le compteur derreur.
Si le rapport entre le nombre derreurs et le nombre de pixels présents dans limage, est supérieur à Y% (Y étant paramétrable), alors on considère quil y a eu un mouvement.
Sil y a eu détection de mouvement, alors on prend une image Z secondes après la détection de ce mouvement. Z étant également paramétrable.
|
Bref, pour réaliser ceci, j'ai choisi une méthode qui me semble réalisable, bien que ce ne soit pas forcément la plus logique :
Tout d'abord, lorsque l'utilisateur clique sur Activer la détection de mouvement, je stocke l'image au moment où il clique et celle ci fera office d'image de référence ou d'origine. Les autres images que je vais capturer seront comparées à celle ci.
Puis, selon l'interval que l'utilisateur choisit, toutes les X secondes, je compare l'image d'origine avec ces nouvelles images.
Exemple : sur 30s, si l'utilisateur choisit un interval de 2s pour la comparaison d'image, il y aura une image de référence stockée et 15 images (30/2) à comparer avec cette image de référence. (Par défaut, je change l'image d'origine toutes les 60s).
Voici comment je procède pour réaliser ceci :
J'ai plusieurs fichiers :
- detection_mouvements.php : fichier principale où je vais appeler mes autres fichiers qui vont suivre.
- fonc_detection_img_origine.php : fichier qui permet de récupérer et stocker une image d'origine.
- fonc_detection_img_temp.php : fichier qui permet de récupérer et stocker une image temporaire.
- fonc_detection_traitement.php : fichier où l'algorithme de comparaison des deux fichiers s'exécute.
J'ai deux iframes :
Code :
- <iframe src="fonc_detection_img_origine.php" width="500" height="500" name="zone_img_origine" frameborder="0" id="zone_img_origine"></iframe>
- <iframe src="fonc_detection_img_temp.php" width="500" height="500" name="zone_img_temp" frameborder="0" id="zone_img_temp"></iframe>
|
Pour rappeler ces deux iframes qui appellent les deux fonctions permettant de stocker les images, j'ai deux fonctions Javascript :
Code :
- function Rafraichir_image_temp() {
- setTimeout("Rafraichir_image_temp()",5000);
- document.frames["zone_img_temp"].location.reload();
- }
- function Rafraichir_image_origine() {
- setTimeout("Rafraichir_image_origine()",60000);
- document.frames["zone_img_origine"].location.reload();
- }
|
J'espère que jusque là, vous comprenez.
Concrètement, je passe par des iframes pour m'éviter de rappeler toute la page d'origine [b]detection_mouvements.php qui elle appelle la fonction permettant de récupérer le flux vidéo de la caméra.
Si je ne passe pas par des iframes, ça rafraichit toute la page, et ça rame de trop.
Voici le code de mon fichier fonc_detection_img_temp.php :
Code :
- <?php
- function creation_image_origine()
- {
- $aujourdhui = date('Y-m-d'); // Format AAAA-MM-JJ
- $heure = date('G-i-s'); // Format HH-MN-SS
- // Nom donné à l'image
- $new_nom = 'temp_'.$aujourdhui.'_'.$heure;
- // Chemin où sera placée temporairement l'image
- $chemin_temp = 'camera/images/detection/temp_detection/'.$new_nom.'jpg';
- // Copie de l'image dans un répertoire temporaire
- if (!copy ("http://admin:admin@192.168.0.99/cgi-bin/video.jpg", 'camera/images/detection/temp_detection/origine_'.$new_nom.'.jpg'))
- echo "<b><center>Problème au niveau du stockage temporaire de la photo !</center></b>";
- $nom_complet = 'camera/images/detection/temp_detection/origine_'.$new_nom.'.jpg';
- return ($nom_complet);
- }
- // Appel de la fonction qui stocke l'image et retourne son nom complet
- $nom_complet_img_origine = creation_image_origine();
- // Récupération de la taille (Largeur, Hauteur & co) de l'image à comparer
- $_SESSION['taille'] = getimagesize($nom_complet_img_origine);
- // Création de l'image avec la fonction ImageCreateFromJpeg de la librairie GD
- $_SESSION['image_origine'] = ImageCreateFromJpeg($nom_complet_img_origine);
- if (isset($_SESSION['appel']))
- {
- if (($_SESSION['appel']) == 1)
- {
- $_SESSION['appel'] = 0;
- }
- else
- {
- include_once ('fonc_detection_img_temp.php');
- $_SESSION['appel'] = 0;
- }
- }
- else
- {
- include_once ('fonc_detection_img_temp.php');
- $_SESSION['appel'] = 0;
- }
- ?>
|
Voici le code de mon fichier fonc_detection_img_temp.php :
Code :
- <?php
- function creation_image_temp()
- {
- $aujourdhui = date('Y-m-d'); // Format AAAA-MM-JJ
- $heure = date('G-i-s'); // Format HH-MN-SS
- // Nom donné à l'image
- $new_nom = 'temp_'.$aujourdhui.'_'.$heure;
- // Chemin où sera placée temporairement l'image
- $chemin_temp = 'camera/images/detection/temp_detection/'.$new_nom.'jpg';
- // Copie de l'image dans un répertoire temporaire
- if (!copy ("http://admin:admin@192.168.0.99/cgi-bin/video.jpg", 'camera/images/detection/temp_detection/'.$new_nom.'.jpg'))
- echo "<b><center>Problème au niveau du stockage temporaire de la photo !</center></b>";
- $nom_complet = 'camera/images/detection/temp_detection/'.$new_nom.'.jpg';
- return ($nom_complet);
- }
- // Mêmes opérations qu'avec l'image à comparer ($nom_complet_img_origine)
- $nom_complet_img_temp = creation_image_temp();
- $_SESSION['image_temp'] = ImageCreateFromJpeg($nom_complet_img_temp);
- $_SESSION['appel'] = 1;
- include_once ('fonc_detection_img_origine.php');
- include_once ('fonc_detection_traitement.php');
- traitement();
- ?>
|
Voici le code de mon fichier fonc_detection_traitement.php :
Code :
- <?php
- function traitement()
- {
- $erreur = 0;
- $x = 0;
- $y = 0;
- // Récupération de la taille OK
- $laTaille = $_SESSION['taille'];
- // Récupération de l'image créée par createImageFromJpeg OK
- $img_origine = $_SESSION['image_origine'];
- $img_temp = $_SESSION['image_temp'];
- echo "SESSION = <br />";
- foreach($_SESSION AS $key=>$val) {
- echo "$key = $val<br />";
- }
- $temp1 = microtime();
- for ($x=0; $x<$laTaille[0]; $x = $x+1)
- {
- for ($y=0; $y<$laTaille[1]; $y = $y+1)
- {
- $couleur_img_origine = imagecolorat($img_origine, $x, $y);
- $couleur_img_temp = imagecolorat($img_temp, $x, $y);
- if (($couleur_img_temp > $couleur_img_origine + 500000) || ($couleur_img_temp < $couleur_img_origine - 500000))
- {
- $erreur++;
- }
- }
- }
- $temp2 = microtime();
- // Calcul du temps d'execution pour la comparaison des deux images (double boucle "FOR" imbriquée)
- $temp_execution = $temp2 - $temp1;
- echo "<br><center><b>Temps d'exécution total :</b> $temp_execution</center><br>";
- echo "<center><b>Nombre total d'erreurs :</b> $erreur</center><br>";
- }
- ?>
|
Bref, le gros problème, c'est que lorsque j'appelle l'iframe contenant le fichier permettant de créer une image d'origine, ça marche.
Mais lorsque j'appelle l'iframe contenant le fichier permettant de créer une image temporaire, ça ne marche pas, car ça n'arrive pas à trouver l'image d'origine. Donc forcément, lors de l'appel du traitement, ça compare l'image temporaire à rien du tout.
Il m'est impossible de récupérer l'image d'origine et de la stocker quelque part.
J'ai beau essayer avec des variables de Session, des $GLOBALS, rien n'y fait.
Ci dessous, un screen shot de mon appli :
Merci bien, vous verrez, ce n'est pas si compliqué que ça .
Bonne lecture et réflexion.
Thanks.
Fiiies.
Message édité par Fiiies1 le 04-05-2005 à 13:42:37