begin process at 2008 07 19 16:48:16
1 212 905 membres
227 nouveaux aujourd'hui
14 165 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

RÉCUPÉRER LES IMAGES D’UNE CAMERA IP TRANSMETTANT UN FLUX MJPEG


Information sur la source

Catégorie :Multimédia Classé sous : camera, ip, mjpeg Niveau : Débutant Date de création : 11/03/2006 Vu : 13 955

Note :
8,5 / 10 - par 2 personnes
8,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (15)
Ajouter un commentaire et/ou une note

Description

Récupérer les images d’une camera IP ( une DLINK DCS-900) transmettant un flux MJPEG (et non MPEG), transformation en image bitmap puis affichage.
Cette base me sert en robotique mobile (simple vision à distance) et pour différents projet (reconnaissance des formes, d’iris etc..) avec traitement.
Elle utilise la librairie PLIB ( plib.net plib.org) pour le transfert entre la camera (donc facilement  migrable sous linux), par contre elle utilise les fonctions windows pour la décompression JPEG ( mais on doit pouvoir facilement utiliser la librairie JPEG de ijg.org )

Source

  • /******************************************************************
  • * recuperation d'un flux Mjpeg venant d'une camera IP (DCS-900) *
  • * 320x200 *
  • * ouvre une connexion tcp client, envoi une requete http, traite *
  • * le flux reçu, extrait les images jpeg, les convertit, et *
  • * affiche le resultat *
  • ******************************************************************
  • * Copyright 2006 Grimal sylvain *
  • * utilisation libre pour application non commerciale *
  • ******************************************************************
  • * linker avec: net ul (plib) libsock32 libgdi32 libuser32 *
  • * libole32 liboleaut32 libolepro32 libuuid (.a ou .lib selon *
  • * compilateur) *
  • ******************************************************************/
  • #include <windows.h>
  • #include <olectl.h>
  • #include "include/netsocket.h" // librarie PLIB voir plib.net ou plib.org
  • #define TCP true
  • #define UDP false
  • #define longMaxJpeg 16384 // longueur maximale d'une image jpeg reçue (suffisant pour du 320x200)
  • unsigned char image[longMaxJpeg];
  • HWND hWmain;
  • netSocket *sockr;
  • // DC d'affichage
  • HDC hdcSortie;
  • // Bitmap après convertion du jpeg
  • HBITMAP hbmp;
  • /*******************************************************
  • * convertion d'une image Jpeg en bitmap *
  • * utilisation ole de windows cf msdn *
  • *******************************************************/
  • HBITMAP convertJpegBmp(LPBYTE pmem, DWORD nSize)
  • {
  • HRESULT hr;
  • CoInitialize(0);
  • HBITMAP hbmp_dst = 0;
  • // copie image jpeg dans global
  • HGLOBAL hgbl =(HGLOBAL)GlobalAlloc(GMEM_FIXED, nSize);
  • memcpy(hgbl, pmem, nSize);
  • // création du stream d'échange
  • IStream* stream = 0;
  • // image jpeg dans global dans stream
  • hr = CreateStreamOnHGlobal(hgbl, TRUE, &stream);
  • if(!SUCCEEDED(hr) || !stream) { // si erreur libération des objets déja crées
  • GlobalFree(hgbl);
  • CoUninitialize();
  • } else {
  • // création d'une 'picture'
  • IPicture* picture = 0;
  • // conversion stream vers picture
  • hr = OleLoadPicture(stream, nSize, 0, IID_IPicture, (void**)&picture);
  • if(!SUCCEEDED(hr) || !picture) { // si erreur libération des objets déja crées
  • stream->Release();
  • GlobalFree(hgbl);
  • CoUninitialize();
  • } else {
  • // recuperation du handle de la 'picture'
  • HBITMAP hbmp_src;
  • picture->get_Handle((OLE_HANDLE *)&hbmp_src);
  • // recuperation du handle du bitmap de la 'picture'
  • BITMAP bmp;
  • GetObject(hbmp_src, sizeof bmp, &bmp);
  • // bmp est le bitmap resultant mais son pointeur vers le contenu pointe vers le contenu de 'picture'
  • // comme on va dechargé la 'picture' on copie dans une autre zone memoire
  • hbmp_dst = (HBITMAP)CopyImage(hbmp_src, IMAGE_BITMAP, 0, 0, 0);
  • picture->Release();
  • stream->Release();
  • GlobalFree(hgbl);
  • CoUninitialize();
  • }
  • }
  • return hbmp_dst;
  • }
  • /****************************************************
  • * affiche une image jpeg contenue dans le tableau *
  • * image[52 ou 53 à longueur-5] *
  • ****************************************************/
  • int afficheImage(HWND hwnd, DWORD longueur)
  • {
  • HDC hdc;
  • DWORD debut;
  • // recherche debut variable selon texte indication taille image
  • debut=50; // normalement debut=52 si taille<10Ko et 53 si >
  • while (!((image[debut]==0xFF) & (image[debut+1]==0xD8)) & (debut<54)) {
  • debut ++;
  • }
  • // test entete et fin fichier JPEG
  • if ((image[debut]==0xFF) & (image[debut+1]==0xD8) &(image[longueur-6]==0xFF)&(image[longueur-5]==0xD9)) {
  • // conversion de l'image JPEG en Bitmap (ole Windows)
  • hbmp = convertJpegBmp((LPBYTE) &image[debut], longueur-debut-4);
  • // et affichage (GDI windows)
  • hdc = GetDC(hwnd);
  • SelectObject(hdcSortie, hbmp);
  • BitBlt(hdc, 0, 0, 320, 240, hdcSortie, 0, 0, SRCCOPY);
  • ReleaseDC(hwnd,hdc);
  • // et destruction du bitmap
  • DeleteObject(hbmp);
  • }
  • }
  • /***************************************************************
  • * Ouverture d'un socket TCP IP Plib port de sortie *
  • * geré automatiquement par plib non contrôlable mais avantage *
  • * gestion automatique si lancement de plusieurs applications *
  • ****************************************************************/
  • netSocket* OpenTcpMjpegParser(char* ip,unsigned int port)
  • {
  • netSocket *sockr;
  • netInit();
  • sockr= new netSocket();
  • sockr->open(TCP);
  • sockr->connect(ip,port);
  • return sockr;
  • }
  • /***************************************************************
  • * Fermeture du socket TCP IP *
  • ****************************************************************/
  • int CloseTcpMjpegParser(netSocket *sockr)
  • {
  • sockr->close();
  • }
  • /****************************************************************
  • * routine principale: ouvre une connection TCP/IP entre l'hote *
  • * (le client) et la camera (le serveur), envoi la demande http *
  • * *
  • *****************************************************************/
  • DWORD WINAPI TcpMjpegParser( void *param)
  • {
  • char rbuffer[2048];
  • char limiteImage[19]="--video boundary--"; // limite entre deux images sur dcs-900
  • int len;
  • DWORD pointeur=0;
  • DWORD i;
  • DWORD n;
  • bool flag;
  • //dc compatible avec mode d'affichage
  • hdcSortie = CreateCompatibleDC(0);
  • // ouverture du socket et envoi de la demande http GET
  • // mettre l'adresse de la camera
  • sockr=OpenTcpMjpegParser("172.16.186.51",80);
  • // requete http à envoyer à la camera pour recevoir le flux MJPEG à adapter à votre camera
  • // utiliser un sniffer lors d'une connexion avex IE par exemple
  • const char* s = netFormat ("GET /VIDEO.CGI HTTP/1.0\r\nUser-Agent: user\r\nAuthorization: Basic YWRtaW46REVVU1Q=\r\n\r\n") ;
  • sockr->send ( s, strlen(s) ) ;
  • /****************************************************************
  • * traitement des informations reçues dans le buffer. Attention *
  • * un buffer trop petit entraine la perte de TOUTES les infos *
  • * trouve la frontiere entre deux images JPEG *
  • *****************************************************************/
  • while(true) // a faire fin du thread
  • {
  • len=sockr->recv(rbuffer,2048,0);
  • // si on a reçue quelque chose
  • if (len>=0) {
  • // traitement un à un des octets reçus
  • for (i=0;i<len;i++) {
  • image[pointeur++]=rbuffer[i];
  • // on ne fait rien tant que l'on à pas reçu au moins 18 octets
  • if (pointeur>18) {
  • // test limite de l'image dans le flux
  • flag=true;
  • for (n=0;n<18;n++)
  • if (image[pointeur-18+n]==limiteImage[n])
  • flag=flag&true;
  • else
  • flag=false;
  • if (flag) {
  • afficheImage(hWmain, pointeur-18); // 18 pour suppression de la frontiere
  • Sleep(50) ;
  • pointeur=0;
  • }
  • }
  • } // fin de boucle for lecture du buffer
  • }
  • }
  • CloseTcpMjpegParser(sockr);
  • return 0;
  • }
  • /* Declare Windows procedure */
  • LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT mssg, WPARAM wParam, LPARAM lParam)
  • {
  • switch(mssg)
  • {
  • case WM_DESTROY:
  • DeleteObject(hbmp);
  • DeleteDC(hdcSortie);
  • PostQuitMessage(0);
  • return 0;
  • }
  • return DefWindowProc(hwnd, mssg, wParam, lParam);
  • }
  • /* Make the class name into a global variable */
  • char szClassName[ ] = "WindowsApp";
  • int WINAPI WinMain (HINSTANCE hThisInstance,
  • HINSTANCE hPrevInstance,
  • LPSTR lpszArgument,
  • int nFunsterStil)
  • {
  • // classique programmation de gestion windows (generé par dev c++)
  • MSG messages; /* Here messages to the application are saved */
  • WNDCLASSEX wincl; /* Data structure for the windowclass */
  • /* The Window structure */
  • wincl.hInstance = hThisInstance;
  • wincl.lpszClassName = szClassName;
  • wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
  • wincl.style = CS_DBLCLKS; /* Catch double-clicks */
  • wincl.cbSize = sizeof (WNDCLASSEX);
  • /* Use default icon and mouse-pointer */
  • wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
  • wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
  • wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
  • wincl.lpszMenuName = NULL; /* No menu */
  • wincl.cbClsExtra = 0; /* No extra bytes after the window class */
  • wincl.cbWndExtra = 0; /* structure or the window instance */
  • /* Use Windows's default color as the background of the window */
  • wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
  • /* Register the window class, and if it fails quit the program */
  • if (!RegisterClassEx (&wincl))
  • return 0;
  • /* The class is registered, let's create the program*/
  • HWND hWnd;
  • hWnd = CreateWindowEx (
  • 0, /* Extended possibilites for variation */
  • szClassName, /* Classname */
  • "Vision hexapode", /* Title Text */
  • WS_OVERLAPPEDWINDOW, /* default window */
  • CW_USEDEFAULT, /* Windows decides the position */
  • CW_USEDEFAULT, /* where the window ends up on the screen */
  • 328, /* The programs width */
  • 270, /* and height in pixels */
  • HWND_DESKTOP, /* The window is a child-window to desktop */
  • NULL, /* No menu */
  • hThisInstance, /* Program Instance handler */
  • NULL /* No Window Creation data */
  • );
  • // pas très propre: handle de la fentre commun à tout le programme
  • hWmain=hWnd;
  • /* Make the window visible on the screen */
  • ShowWindow (hWmain, nFunsterStil);
  • //création du thread (API Windows) de recuperation et d'affichage
  • DWORD len=0;
  • DWORD total=0;
  • DWORD ThreadId;
  • HANDLE hThread ;
  • DWORD threadID;
  • hThread=CreateThread( NULL, 0, TcpMjpegParser, NULL, NULL , &ThreadId);
  • /* Run the message loop. It will run until GetMessage() returns 0 */
  • while (GetMessage (&messages, NULL, 0, 0))
  • {
  • /* Translate virtual-key messages into character messages */
  • TranslateMessage(&messages);
  • /* Send message to WindowProcedure */
  • DispatchMessage(&messages);
  • }
  • /* The program return-value is 0 - The value that PostQuitMessage() gave */
  • return messages.wParam;
  • }
/******************************************************************
 * recuperation d'un flux Mjpeg venant d'une camera IP (DCS-900)  *
 * 320x200                                                        *
 * ouvre une connexion tcp client, envoi une requete http, traite *
 * le flux reçu, extrait les images jpeg, les convertit, et       *
 * affiche le resultat                                            *
 ******************************************************************
 * Copyright 2006 Grimal sylvain                                  *
 * utilisation libre pour application non commerciale             *
 ******************************************************************
 * linker avec: net ul (plib) libsock32 libgdi32 libuser32        *
 * libole32 liboleaut32 libolepro32 libuuid (.a ou .lib selon     *
 * compilateur)                                                   *
 ******************************************************************/

#include <windows.h>
#include <olectl.h>
#include "include/netsocket.h" // librarie PLIB voir plib.net ou plib.org

#define  TCP true
#define  UDP false
#define longMaxJpeg 16384 // longueur maximale d'une image jpeg reçue (suffisant pour du 320x200)

unsigned char image[longMaxJpeg];

HWND hWmain;
netSocket *sockr; 

// DC d'affichage
HDC hdcSortie;
// Bitmap après convertion du jpeg
HBITMAP hbmp;

/*******************************************************
 *  convertion d'une image Jpeg en bitmap              *
 *    utilisation ole de windows  cf msdn              *
 *******************************************************/
HBITMAP convertJpegBmp(LPBYTE pmem, DWORD nSize)
{
  HRESULT hr;
  CoInitialize(0);
  HBITMAP hbmp_dst = 0;
  
  // copie image jpeg dans global
  HGLOBAL hgbl =(HGLOBAL)GlobalAlloc(GMEM_FIXED, nSize);
  memcpy(hgbl, pmem, nSize);
  
  // création du stream d'échange
  IStream* stream = 0;
  // image jpeg dans global dans stream
  hr = CreateStreamOnHGlobal(hgbl, TRUE, &stream);
  if(!SUCCEEDED(hr) || !stream) { // si erreur libération des objets déja crées
    GlobalFree(hgbl);
    CoUninitialize();                    
  } else {
     // création d'une 'picture'
     IPicture* picture = 0;
     // conversion stream vers picture
     hr = OleLoadPicture(stream, nSize, 0, IID_IPicture, (void**)&picture);
     if(!SUCCEEDED(hr) || !picture) { // si erreur libération des objets déja crées
        stream->Release();
        GlobalFree(hgbl);
        CoUninitialize();
    } else {
        // recuperation du handle de la 'picture'
        HBITMAP hbmp_src;
        picture->get_Handle((OLE_HANDLE *)&hbmp_src);
  
        // recuperation du handle du bitmap de la 'picture'
        BITMAP bmp;
        GetObject(hbmp_src, sizeof bmp, &bmp);
        // bmp est le bitmap resultant mais son pointeur vers le contenu pointe vers le contenu de 'picture'
        // comme on va dechargé la 'picture' on copie dans une autre zone memoire
        hbmp_dst = (HBITMAP)CopyImage(hbmp_src, IMAGE_BITMAP, 0, 0, 0);

        picture->Release();
        stream->Release();
        GlobalFree(hgbl);
        CoUninitialize();
    }
  }
  return hbmp_dst;
}

/****************************************************
 * affiche une image jpeg contenue dans le tableau  *
 * image[52 ou 53 à longueur-5]                     *
 ****************************************************/
int afficheImage(HWND hwnd, DWORD longueur)
{
     HDC hdc;
     DWORD debut;     
     // recherche debut variable selon texte indication taille image
     debut=50; // normalement debut=52 si taille<10Ko et 53 si >
     while (!((image[debut]==0xFF) & (image[debut+1]==0xD8)) & (debut<54)) {
           debut ++;
     }
     // test entete et fin fichier JPEG 
     if ((image[debut]==0xFF) & (image[debut+1]==0xD8) &(image[longueur-6]==0xFF)&(image[longueur-5]==0xD9)) {
          // conversion de l'image JPEG en Bitmap  (ole Windows)
          hbmp = convertJpegBmp((LPBYTE) &image[debut], longueur-debut-4);     

          // et affichage (GDI windows)
          hdc = GetDC(hwnd);          
          SelectObject(hdcSortie, hbmp);
          BitBlt(hdc, 0, 0, 320, 240, hdcSortie, 0, 0, SRCCOPY);
          ReleaseDC(hwnd,hdc);
          // et destruction du bitmap 
          DeleteObject(hbmp);
     }
}


/***************************************************************
* Ouverture d'un socket TCP IP  Plib  port de sortie           *
* geré automatiquement par plib non contrôlable mais avantage  *
* gestion automatique si lancement de plusieurs applications   *
****************************************************************/
netSocket* OpenTcpMjpegParser(char* ip,unsigned int port)
{
   netSocket *sockr; 
   netInit();
   sockr= new netSocket();
   sockr->open(TCP);
   sockr->connect(ip,port);
   return sockr;
}

/***************************************************************
* Fermeture du socket TCP IP                                   *
****************************************************************/
int CloseTcpMjpegParser(netSocket *sockr)
{
   sockr->close();
}

/****************************************************************
* routine principale: ouvre une connection TCP/IP entre l'hote  *
* (le client) et la camera (le serveur), envoi la demande http  *
*                                                               *
*****************************************************************/
DWORD WINAPI TcpMjpegParser( void *param)
{  
   char rbuffer[2048];
   char limiteImage[19]="--video boundary--"; // limite entre deux images sur dcs-900
   int len;
   DWORD pointeur=0;
   DWORD i;
   DWORD n;
   bool flag;

   //dc compatible avec mode d'affichage
   hdcSortie = CreateCompatibleDC(0);
   
   // ouverture du socket et envoi de la demande http GET
   // mettre l'adresse de la camera
   sockr=OpenTcpMjpegParser("172.16.186.51",80);
   // requete http à envoyer à la camera pour recevoir le flux MJPEG à adapter à votre camera
   // utiliser un sniffer lors d'une connexion avex IE par exemple
   const char* s = netFormat ("GET /VIDEO.CGI HTTP/1.0\r\nUser-Agent: user\r\nAuthorization: Basic YWRtaW46REVVU1Q=\r\n\r\n") ;
   sockr->send ( s, strlen(s) ) ;

   /****************************************************************
   * traitement des informations reçues dans le buffer. Attention  *
   * un buffer trop petit entraine la perte de TOUTES les infos    *
   * trouve la frontiere entre deux images JPEG                    *
   *****************************************************************/

   while(true)  // a faire fin du thread
   {

     len=sockr->recv(rbuffer,2048,0);

     // si on a reçue quelque chose
     if (len>=0) {
       // traitement un à un des octets reçus          
       for (i=0;i<len;i++) {
            image[pointeur++]=rbuffer[i];
            // on ne fait rien tant que l'on à pas reçu au moins 18 octets
            if (pointeur>18) {
               // test limite de l'image dans le flux
               flag=true;    
               for (n=0;n<18;n++) 
                   if (image[pointeur-18+n]==limiteImage[n])
                      flag=flag&true;
                   else
                      flag=false;

                 if (flag) { 
                    afficheImage(hWmain, pointeur-18);  // 18 pour suppression de la frontiere
                    Sleep(50) ;
                    pointeur=0;
                 }
            }
       }   // fin de boucle for lecture du buffer
     }
   }
   CloseTcpMjpegParser(sockr);
   return 0;
}


/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT mssg, WPARAM wParam, LPARAM lParam)

{
  switch(mssg)
  {    
  case WM_DESTROY:
    DeleteObject(hbmp);
    DeleteDC(hdcSortie);
    PostQuitMessage(0);
    return 0;
  }
  return DefWindowProc(hwnd, mssg, wParam, lParam);
}



/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    // classique programmation de gestion windows (generé par dev c++)
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    HWND hWnd;

    hWnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "Vision hexapode",       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           328,                 /* The programs width */
           270,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
     // pas très propre: handle de la fentre commun à tout le programme 
      hWmain=hWnd;
      
    /* Make the window visible on the screen */
    ShowWindow (hWmain, nFunsterStil);


 
   //création du thread (API Windows) de recuperation et d'affichage
   DWORD len=0;
   DWORD total=0;
   DWORD ThreadId;
   HANDLE hThread  ;
   DWORD threadID;
   hThread=CreateThread( NULL, 0, TcpMjpegParser, NULL, NULL , &ThreadId);  
   
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {    
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
 
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}
  • signaler à un administrateur
    Commentaire de poldere le 12/03/2006 14:28:21

    Salut! Tiens ! Tu travaille sur un robot ? Moi aussi. A l'occasion on pourra avoir un contact pour échange vocal. De mon coté je suis en VB , win XP et cam USB ( un peu différent n'est ce pas lol ). A  plus . . .

  • signaler à un administrateur
    Commentaire de aerith le 14/03/2006 11:11:32

    J'ai commencer un algo de traitement d'image (il en est a la recherche de lignes complexes), sont but seras la vision binoculaire, en C+SDL...
    Si tu arrive a me motivé je veux bien le continuer...

    Je doit modifier cette recherche de ligne pour la rendre plus sensible, avec une notion d'intervale.

    Je dev portable...

  • signaler à un administrateur
    Commentaire de poldere le 14/03/2006 11:16:58

    concernat la vision binoculaire . . . . tu connait ce site http://www.fuzzgun.btinternet.co.uk/rodney/rodney.htm . Si ça peut t'aider il y a un bon projet et de bonnes sources.

  • signaler à un administrateur
    Commentaire de turnerom le 10/04/2006 16:45:20

    Salut
    dans ton code, tu déclare
    #define longMaxJpeg 16384 // longueur maximale d'une image jpeg reçue (suffisant pour du 320x200)
    Comment tu trouve ton 16384, comment le caluler ? car moi j'utilise du 320x240.
    Merci

  • signaler à un administrateur
    Commentaire de turnerom le 18/04/2006 11:10:10

    Pour que ca marche il faut aussi linker avec libws2_32.a et libwsock32.a.

  • signaler à un administrateur
    Commentaire de hugo_cpp le 12/05/2006 16:53:03

    Slt,
    Merci pour ton code, il est plutôt bien fait et surtout il marche!! Je l'ai adapter pour ma camera (Sony SNC-P1) car elle peut délivrer soit des MJPEG, soit du MPEG4. J'aimerai maintenant récupérer le flux MPEG4, pense-tu que c'est possible à partir de ton code? J'ai pas encore eu trop le temps de me pencher dessus mais si je trouve je te previens.
    A+

  • signaler à un administrateur
    Commentaire de sarkosichon le 09/06/2006 12:07:20

    salut!
    Merci pour ton code mais je n'arrive pas à le compiler. je ne trouve pas la lib plib. j'ai trouvé netSocket.h mais il me manque toujours des fichiers d'en tete. si tu peu m'aiguillé ou ziper ton repertoire include et le mettre sur le site ca serai bien sympa de ta part.
    merci d'avance.

  • signaler à un administrateur
    Commentaire de poseidon162 le 07/07/2006 15:04:37

    Salut a tous.

    Deja bien ton code.
    Moi je travailles avec une DCS-6620G mais je dois recuperer le flux video afin de l'afficher dans une frame.
    Alors j'arrive a controler la camera au niveau rotation par contre impossible de recuperer le flux.
    J'utilise ethereal pour recuperer la requete a envoyer mais lorsque je l'envoie j'ai une exception : "Le serveur a renvoyé une réponse non valide ou non reconnue".
    Pourtant j'envoi la même requête qu'IE.

    voila le code correspondant.

    char *l_strHeaders2 = "User-Agent: VVTK (ver=40)\r\nAccept: */*\r\nHost: 10.226.144.238\r\n\r\n";
    char *l_strObject2 = "/cgi-bin/downstream.cgi?SID=0";
    m_pconnection = m_session.GetHttpConnection(l_strServeur, port , "VVTK (ver=40)");
    m_pfile = m_pconnection->OpenRequest(CHttpConnection::HTTP_VERB_GET , l_strObject2,NULL , 1 , NULL , "HTTP/1.0");
    if(m_pfile != NULL)
    {
    try
    {
    m_pfile->AddRequestHeaders(l_strHeaders2);
    m_pfile->SendRequest(NULL,0,NULL,0);
    }
    catch(CInternetException *e)
    {
    char error[255];
    e->GetErrorMessage(error,255);
    }
    catch(CException  *e)
    {
    char error[255];
    e->GetErrorMessage(error,255);
    }
    }

    et voila la requete envoyé par IE vu par ethereal :
    GET /cgi-bin/downstream.cgi?SID=0 HTTP/1.0

    User-Agent: VVTK (ver=40)

    Accept: */*

    Host: 10.226.144.238

    et voila la mienne :

    GET /cgi-bin/downstream.cgi?SID=0 HTTP/1.1

    User-Agent: VVTK (ver=40)

    Accept: */*

    Host: 10.226.144.238



    alors je me dit que c a cause du HTTP/1.1 mais il me le met par defaut et je ne sais comment le passer en 1.0.

    Si quelqu'un a une idée je vous serez vraiment reconnaissant.

    Merci d'avance

  • signaler à un administrateur
    Commentaire de je7ch le 14/12/2006 20:55:18

    salut
    j'arrive à compiler votre code mais il ne veut pas s'executer.Bon il m'affiche le message suivant "fatal error C1010: unexpected end of file while looking for precompiled header directive
    Error executing cl.exe."
    j'ai besoin de votre aide s.v.p .C'est tres important.
    merci

  • signaler à un administrateur
    Commentaire de isetcom le 14/12/2006 21:19:52

    salut
    je suis un etudiant en informatique je suis entrient de travailler sur la videsurveillance ip. ce pendant j'ai un probleme avec la compilation de votre code il ne genére pas .exe si vous pouvez m'aidé je serais tres reconéssant. c'est tres urgent svp.
    voila mon e-mail:mekki.ben-younes@laposte.net
    merci d'avance..

  • signaler à un administrateur
    Commentaire de Nylsax le 29/01/2007 11:14:04

    Salut je voudrai comprendre cette ligne de programme :
    const char* s = netFormat ("GET /VIDEO.CGI HTTP/1.0\r\nUser-Agent: user\r\nAuthorization: Basic YWRtaW46REVVU1Q=\r\n\r\n") ;
    Je sais pas comment tu apel ? netFormat ? d'ou il vient ?
    Merci.

  • signaler à un administrateur
    Commentaire de 4u4me4us le 05/03/2007 11:53:05

    Salut,
    J'arrive pas a compiler tu peu me donner la lib netsoket STP

  • signaler à un administrateur
    Commentaire de kalidor86 le 14/08/2007 11:58:23

    Salut à vous,

    j'ai un problème avec la fonction netInit() à la compliation il me met une error comme quoi elle a besoin d'arguments (elle est appelée avec des arguments dans  netSocket.h)
    Or si je modifie la fonction dans le .h en lui virant les arguments , il la reconnait plus quand il doit aller la chercher dans la lib et me fait une erreur du type lnk2019.

    Comme vous arruvez à le compiler je comprend pas d'où vient mon erreur.
    pour info ,j'utilise Visual C++

    Merci d'avance pour votre aide :)

  • signaler à un administrateur
    Commentaire de Crepuscule3 le 24/11/2007 09:07:28

    Bonjour à tous,

       je travaille actuellement sur une camera axis 207MW. Je souhaiterais faire un traitement d'image temps réel sur le flux MJPEG ou MPEG4 provenant de cette camera IP, dans le but de ne visualiser que les contours des objets filmés. Je possède actuellement un programme provenant de chez axis me permettant de relever le flux MJPEG. J'arrive donc à le visualiser mais je n'arrive toujours pas à trouver comment faire un traitement vidéo dessus (pour cela il me faudrait un accès aux pixels). Par ailleurs, je préciserai que les commandes utilisées pour afficher la vidéo sont des fonctions "InvokeHelper" de ActiveX ou DirectX je ne sais plus.
       Si l'un d'entre vous a réussit à faire un traitement d'image sur un flux MJPEG, ou si quelqu'un a réussit à faire marcher le programme de cette page web, ou encore si quelqu'un sait comment utiliser le programme de chez axis, pourriez vous me donner un coup de main? Je galère vraiment depuis quelque temps.

    Cordialement

    Crepuscule3

  • signaler à un administrateur
    Commentaire de SebLinck le 03/06/2008 11:17:08

    Salut,
    je travail sur une Axis 210, il est possible d'utiliser la même méthode que propose GSDevelop, mais il faut changer légèrement la requête ( ça va sans dire ).

    "GET /axis-cgi/mjpg/video.cgi?resolution="320x240"&fps="25" HTTP/1.1\r\nUser-Agent: HttpClient\r\nHost:"192.168.10.50"\r\nConnection:Keep-Alive\r\nCache-Control:no-cache\r\n\r\n"

    Voilà, sinon il est très facile de récupérer un flux M-jpeg en utilisant l'exemple AXIS,
    mais comme le souligne Crepuscule3, il est assez difficile de faire un traitement derrière.
    En revanche, la méthode fournis par AXIS est très bonne pour un enrgistrement de flux...

Ajouter un commentaire

Pub



Appels d'offres

Dessins techniques
Budget : 60€
Animation Flash - Doma...
Budget : 370€
Application flash medi...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS