Analyser le flux d'une caméra IP

Analyser le flux d'une caméra IP - Traitement Vidéo - Video & Son

Marsh Posté le 28-07-2006 à 11:14:56    

Bonjour à tous,
j'espère poster dans la bonne section, mais après y avoir réfléchi elle me semble la plus appropriée.
 
Voici mon problème en quelques mots : je voudrais faire un programme qui analyse directement le flux vidéo provenant d'une caméra IP. Le problème étant que les SDK fournis avec les caméras permettent généralement de visualiser les images ou de les enregistrer, mais pas d'accéder directement au tableau de pixels en mémoire.
Etant peu familier des caméras IP (jusqu'à présent mes flux provenaient de cartes d'acquisition analogiques), je me demande encore s'il y a des protocoles standards pour transmettre les flux d'images, et s'il existe des librairies qui permettent d'intégrer ces fonctions dans un programme.
 
Quelques détails supplémentaires :
- mon programme est en C/C++
- c'est développé sous Windows(XP), mais le code n'est pas lié à l'OS pour l'instant (ce serait bien qu'il reste indépendant, mais je suis prêt à faire des concessions)
- pour l'instant aucun choix n'a été fait quant à la marque des caméras... s'il n'est pas possible de trouver une solution "universelle" qui fonctionne avec toutes les marques, on m'a parlé des caméras Axis, je ne sais pas ce que ça vaut.
 
Voilà, s'il y a quelqu'un qui saurait m'éclairer sur les différents outils existants pour ces caméras, je lui serais bien reconnaissant.
Merci à tous.
 
Alx

Reply

Marsh Posté le 28-07-2006 à 11:14:56   

Reply

Marsh Posté le 28-07-2006 à 12:25:51    

sous windows, tu pourrais utiliser DirectX ( DirectShow ) pour récupérer le flux si le pilote de la camera est compatible BDA, il me semble.  Renseignes toi sur "BDA" , "directshow" et les cameras IP sur Google...  

Reply

Marsh Posté le 28-07-2006 à 14:59:13    

Merci du tuyau, je vais regarder ça...
 
Pour info j'ai également vu un bout de code sur cppfrance qui m'aurait bien arrangé ( http://www.cppfrance.com/codes/REC [...] 36494.aspx ), sauf qu'il y est fait mention d'une librairie PLIB que je n'arrive pas à identifier. Sinon ça correspond bien à ce que je voudrais faire.
 
J'ai vu aussi sur http://www.zoneminder.com/ un soft open source qui devrait gérer des tas de formats différents, mais c'est "linux only" visiblement.  :pfff:  
 
Enfin bon, en attendant je poursuis ma quête...

Reply

Marsh Posté le 24-08-2006 à 10:33:29    

Petite mise à jour (parce que c'est énervant quand sur les forums le mec qui a posé la question ne prévient jamais quand il a trouvé la réponse ;) ):
j'ai commencé à travailler sur une caméra elphel (modèle 333 quelque chose), qui part des bases des caméras Axis. Elle émet un flux rtsp qui me semble tout à fait standard.
J'ai réussi à visualiser et enregistrer les flux vidéo grâce aux softs mplayer et mencoder (pour ceux qui se frottent à cette caméra, il ne faut pas oublier d'activer le streamer dans les options pour avoir un flux continu, j'ai perdu une journée à cause de ça... et les contrôles de caméra ne sont accessibles que via Firefox, ça ne marche pas avec IE, Opera ou Netscape).
 
Pour intégrer la gestion des flux directement à un soft, il semblerait que la librairie liveMedia qui est livrée avec devrait faire l'affaire (j'ai testé la connexion à la caméra, mais pas encore le décodage du flux).
 
J'ai cependant un petit problème avec les fichiers vidéo que j'ai enregistrés : ils sont normalement au format MJPEG, j'arrive à les visualiser et à les faire analyser par mes programmes sur le poste qui les a encodés, mais sur un second poste j'arrive seulement à les visualiser (media player et media player classic), mais pas à les faire ouvrir par ma librairie de traitement (librairie highgui d'OpenCV).
Je soupçonne que c'est une histoire de filtres/codecs qui ne sont pas les mêmes entre les deux machines, mais je me demande bien où on peut voir la liste de ce qui est installé et de ce qui est utilisé, pour que je puisse les comparer ?
 
Enfin, affaire à suivre... (mais si quelqu'un a une idée, je suis preneur :) ).

Reply

Marsh Posté le 20-10-2007 à 20:06:30    

Bonjour,
 
   je suis en master électronique et je suis sur le même genre de projet. Je dois embarquer une camera IP (il me semble que c'est une AXIS), recevoir la vidéo sur un PC à distance via le réseau wifi et faire un traitement vidéo dessus. Tout du moins, c'est la solution que mon groupe et moi avons choisit de faire. Pour ce qui est du traitement vidéo je me sent assez à l'aise, mais pour ce qui est de la transmission vidéo... c'est la première fois que j'ai à faire à cela et je n'ai rien trouvé d'intéressant à part le fameux code sur code-source.fr. cela tombe bien, je travaille justement en C++ sous visual studio 2005.  
    Apparement, tu as déjà réussis ce que je cherche à faire. Serait-il possible de me mettre sur la piste (sachant que je n'ai que des notions de base en C++) ou de me faire parvenir ton code source?
 
Cordialement.
 
Julien Cordier
 
 
 

Alx77 a écrit :

Petite mise à jour (parce que c'est énervant quand sur les forums le mec qui a posé la question ne prévient jamais quand il a trouvé la réponse ;) ):
j'ai commencé à travailler sur une caméra elphel (modèle 333 quelque chose), qui part des bases des caméras Axis. Elle émet un flux rtsp qui me semble tout à fait standard.
J'ai réussi à visualiser et enregistrer les flux vidéo grâce aux softs mplayer et mencoder (pour ceux qui se frottent à cette caméra, il ne faut pas oublier d'activer le streamer dans les options pour avoir un flux continu, j'ai perdu une journée à cause de ça... et les contrôles de caméra ne sont accessibles que via Firefox, ça ne marche pas avec IE, Opera ou Netscape).
 
Pour intégrer la gestion des flux directement à un soft, il semblerait que la librairie liveMedia qui est livrée avec devrait faire l'affaire (j'ai testé la connexion à la caméra, mais pas encore le décodage du flux).
 
J'ai cependant un petit problème avec les fichiers vidéo que j'ai enregistrés : ils sont normalement au format MJPEG, j'arrive à les visualiser et à les faire analyser par mes programmes sur le poste qui les a encodés, mais sur un second poste j'arrive seulement à les visualiser (media player et media player classic), mais pas à les faire ouvrir par ma librairie de traitement (librairie highgui d'OpenCV).
Je soupçonne que c'est une histoire de filtres/codecs qui ne sont pas les mêmes entre les deux machines, mais je me demande bien où on peut voir la liste de ce qui est installé et de ce qui est utilisé, pour que je puisse les comparer ?
 
Enfin, affaire à suivre... (mais si quelqu'un a une idée, je suis preneur :) ).


Reply

Marsh Posté le 22-10-2007 à 12:12:58    

Bonjour,
hé bien heureusement qu'il y a les alertes mail, parce qu'il ne date pas d'hier ce sujet. :)
 
La piste de la bibliothèque "livemedia" que j'évoquais plus haut fonctionnait bien en mode RTSP de la caméra, mais pour les caméras Axis il s'est avéré bien plus simple et efficace d'utiliser le protocole HTTP directement. Je ne peux malheureusement pas te donner le code pour des raisons de confidentialité, mais voici une petite explication rédigée par la personne qui a fait notre composant de connexion à ces caméras :
 

Citation :


• Connexion Http / Lecture du flux
 
On se connecte par socket sur l’ip de la camera avec le port 80 (port http).
Pour recevoir le flux mjpeg, il suffit de faire la requête suivante
 
GET [/mjpg/video.mjpg] HTTP/1.0
Host: [192.168.0.211]
[Authorization: Basic xxxxyyyxxxyyy]
 
Il faut adapter les informations entre crochets à la camera courante. La partie concernant l’autentification est optionelle (si la camera est protégée par un login/mot de passe). La partie non lisible suivante « Basic » est un encodage en Base64 du login et du mot de passe séparés par « : »
 
• Contenu du flux
 
Le flux Mjpeg à travers Http est une suite d’image Jpeg séparées par des entêtes.
Techniquement, la fin d’une entête peut être repérée par le caractère 0xFF, l’image commençant tout de suite après.
Chaque entête contient la taille de l’image, de façon non standardisée. Dans les cameras testées, elle était présente suivant les façons suivantes :  
Content-Length: 32768
DataLen: 32768
 
Pour chaque image on cherchera donc la taille X de l’image dans l’entête, puis on iras à la fin de l’entête, puis on lira les X octets de l’image.
On obtient donc l’image Jpeg stockée dans un buffer. Il suffit ensuite de la décompresser pour obtenir une image RGB brute.


 
J'espère que ces informations te satisferont. :)

Reply

Marsh Posté le 26-11-2007 à 13:09:19    

Bonjour,
 
   merci pour le coup de main. J'ai suivi la piste pour le projet et cela avance plutôt bien. J'ai développé un programme en C++ qui permet de faire le traitement vidéo que je souhaite (détection de contours, mais à partir d'une webcam), et je possède un deuxième programme en C++, provenant de chez axis, permettant de receuillir le flux MPJEG de la camera que l'on utilise (AXIS 207MW). Ce programme s'appelle (MJPEGUnicast). Il fonctionne très bien, et maintenant nous arrivons à receuillir le flux de cette camera. Le problème que je rencontre actuellement est que j'éssais d'adapter mon traitement vidéo (fait dans mon premier programme sur la webcam) à l'autre programme de chez axis. Das le programme d'AXIS, ils n'utilisent que des commandes ActiveX ne m'aidant pas du tout à avoir accès aux pixels (ils utilisent des fonctions comme InvokeHelper()).
Cela fait plus d'une semaine que j'essais toutes sortes de manips allant même jusqu'à utiliser des snopshot donné dans le programme (qui permet d'enregistrer une image jpeg dans un fichier C:\Snapshot.jpg) afin de convertir ensuite en bitmap et faire mon traitement dessus et ensuite réinjecter dans la vidéo. Mais en vain, je n'arrive pas à avoir accès au flux.
Je passe mon temps sur www.codes-sources.com, mais je ne trouve pas d'exemple de codes compatible avec MS VC++.
Aurais-tu une recommandations?  
 
Cordialement
 
Crepuscule3
 
 

Alx77 a écrit :

Bonjour,
hé bien heureusement qu'il y a les alertes mail, parce qu'il ne date pas d'hier ce sujet. :)
 
La piste de la bibliothèque "livemedia" que j'évoquais plus haut fonctionnait bien en mode RTSP de la caméra, mais pour les caméras Axis il s'est avéré bien plus simple et efficace d'utiliser le protocole HTTP directement. Je ne peux malheureusement pas te donner le code pour des raisons de confidentialité, mais voici une petite explication rédigée par la personne qui a fait notre composant de connexion à ces caméras :
 

Citation :


• Connexion Http / Lecture du flux
 
On se connecte par socket sur l’ip de la camera avec le port 80 (port http).
Pour recevoir le flux mjpeg, il suffit de faire la requête suivante
 
GET [/mjpg/video.mjpg] HTTP/1.0
Host: [192.168.0.211]
[Authorization: Basic xxxxyyyxxxyyy]
 
Il faut adapter les informations entre crochets à la camera courante. La partie concernant l’autentification est optionelle (si la camera est protégée par un login/mot de passe). La partie non lisible suivante « Basic » est un encodage en Base64 du login et du mot de passe séparés par « : »
 
• Contenu du flux
 
Le flux Mjpeg à travers Http est une suite d’image Jpeg séparées par des entêtes.
Techniquement, la fin d’une entête peut être repérée par le caractère 0xFF, l’image commençant tout de suite après.
Chaque entête contient la taille de l’image, de façon non standardisée. Dans les cameras testées, elle était présente suivant les façons suivantes :  
Content-Length: 32768
DataLen: 32768
 
Pour chaque image on cherchera donc la taille X de l’image dans l’entête, puis on iras à la fin de l’entête, puis on lira les X octets de l’image.
On obtient donc l’image Jpeg stockée dans un buffer. Il suffit ensuite de la décompresser pour obtenir une image RGB brute.


 
J'espère que ces informations te satisferont. :)


Reply

Marsh Posté le 23-12-2008 à 11:51:30    

Bonjour bonjour
 
Je fais remonter ces posts car j'ai enfin trouvé ce que je cherchais. Je suis étudiant et comme vous j'essaye de récupérer le flux mjpeg d'une caméra IP Lynksys indépendamment du soft de la caméra (pour un traitement futur). Je cherche à faire ça en C++ avec visual c++ si possible. J'ai lu les conseils de Alx77 et je pense que cela va bien m'aider. Mais vu que maintenant vous devriez avoir terminé votre projet, peut être auriez vous des conseils à me donner sur la façon de procéder, les bibliothèques à utiliser surtout. merci bcp!
 
 
 
 
 

Crepuscule3 a écrit :

Bonjour,
 
   merci pour le coup de main. J'ai suivi la piste pour le projet et cela avance plutôt bien. J'ai développé un programme en C++ qui permet de faire le traitement vidéo que je souhaite (détection de contours, mais à partir d'une webcam), et je possède un deuxième programme en C++, provenant de chez axis, permettant de receuillir le flux MPJEG de la camera que l'on utilise (AXIS 207MW). Ce programme s'appelle (MJPEGUnicast). Il fonctionne très bien, et maintenant nous arrivons à receuillir le flux de cette camera. Le problème que je rencontre actuellement est que j'éssais d'adapter mon traitement vidéo (fait dans mon premier programme sur la webcam) à l'autre programme de chez axis. Das le programme d'AXIS, ils n'utilisent que des commandes ActiveX ne m'aidant pas du tout à avoir accès aux pixels (ils utilisent des fonctions comme InvokeHelper()).
Cela fait plus d'une semaine que j'essais toutes sortes de manips allant même jusqu'à utiliser des snopshot donné dans le programme (qui permet d'enregistrer une image jpeg dans un fichier C:\Snapshot.jpg) afin de convertir ensuite en bitmap et faire mon traitement dessus et ensuite réinjecter dans la vidéo. Mais en vain, je n'arrive pas à avoir accès au flux.
Je passe mon temps sur www.codes-sources.com, mais je ne trouve pas d'exemple de codes compatible avec MS VC++.
Aurais-tu une recommandations?  
 
Cordialement
 
Crepuscule3
 
 


Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed