IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

afficher les images d'une cam�ra via http sous bcb c++6


Sujet :

C++Builder

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2011
    Messages
    19
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 19
    Par d�faut afficher les images d'une cam�ra via http sous bcb c++6
    Bonjour � tous,

    Je suis actuellement en train de faire un programme dans le cadre de ma formation et je suis incapable de r�soudre un probl�me de r�cup�ration des images via une cam�ra ip.

    J'utilise un "client socket" afin d'envoyer les trames HTTP correspondant aux screenshot et dans l'ev�nement OnRead du socket je traite la r�cup�ration du fichier (image).

    N�anmoins, lorsque je fais cela en boucle (afin de r�cup�rer les images continuellement et s�quentiellement), l'image que je re�ois est parfois compl�tement abim�e et d�form�e. Je rafraichi l'image avec un timer...

    Je ne sais absolument pas pourquoi �a me fait cela, si vous avez une solution svp aidez moi.

    Voici quelques bout de codes correspondant � ce que j'ai fait:

    J'active le timer toutes les N ms:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
      Soc->Active = true;
    }
    Dans le "OnWrite" du Socket:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    void __fastcall TForm1::SocWrite(TObject *Sender, TCustomWinSocket *Socket)
    {
            Soc->Socket->SendText("GET /cgi-bin/video.jpg?size=2 HTTP/1.0 \r\n\r\n");
    }
    Dans le "OnRead":
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void __fastcall TForm1::SocRead(TObject *Sender, TCustomWinSocket *Socket)
    {
            char buffer[102000]; // buffer de recuperation des paquets venant du serveur
     
            int nbLu = Socket->ReceiveBuf(buffer, 102000 );  // lire les paquets
            pStream->Write(buffer, nbLu);       // transferer dans le stream
                                                  // pour traitement ulterieur
    }
    Dans le "OnDisconnect":
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    void __fastcall TForm1::SocDisconnect(TObject *Sender,
          TCustomWinSocket *Socket)
    {
        i = 0, j = 0;
        int comp;
        unsigned char var[4], var2[4]="ÿØÿÀ", tab;      // À ou þ
     
        pStream->Position = 0;    // pos = 0
        while(pStream->Read(var,4)){
            i+=4;
            comp = strncmp(var,var2,4);
            if(comp == 0) break;
        }
        i-=4;
        pStream->Position = i;
        pStream->Read(var,4);
        pStream->Position = 0;
        while(pStream->Read(&tab,2)){
            j+=2;
            if(!strncmp(&tab,"ÿ",2)){
              pStream->Read(&tab,2);
              j+=2;
              if(!strncmp(&tab,"Ù",1)){
                break;                  //si on a FFD9 on quitte
              }
            }
        }
        tailleImage = j - i;
     
        DisplayImage();   //traite et affiche l'image
        CleanUp();
        btConnect->Caption = "Connecter";
    }
    Et enfin voici la fonction "DisplayImage()":
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    void __fastcall TForm1::DisplayImage()
    {
      unsigned char buf[40000] = "";
     
      try
      {
        pFluxImage->Position = 0;
        pStream->Position = i;  // debut code jpeg après le Header dans le stream
        pStream->Read(buf, tailleImage);
        pFluxImage->Write(buf, tailleImage);
        pFluxImage->Position = 0;
        jp->LoadFromStream(pFluxImage);     // charger le jpeg converti en bitmap
     
        Image1->Picture->Assign(jp); // afficher l'image
     
      }
      catch (...)
      {
        MessageBeep(0);
      }
     
      pFluxImage->Position = 0;
    }
    Ces instructions sont effectu�es s�quentiellement. Si vous trouvez une erreur ou quelque chose qui pourrai m'aider � r�soudre mon probl�me svp n'h�sitez pas, je suis tr�s � la bourre pour mon projet de fin d'ann�es.

    J'attends vos messages ! merci

  2. #2
    Expert �minent
    Avatar de ShaiLeTroll
    Homme Profil pro
    D�veloppeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur C++\Delphi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par d�faut
    Tu pouvais poursuivre ton premier sujet R�cup�rer une image avec un socket?

    C'est m�me surprenant que tu puisses recevoir quelque chose de coh�rent !
    Si je comprend le code tu parcours les donn�es re�ues (HTTP) jusqu'au d�but d'un fichier Image (JPEG), � partir de l� tu utilises les donn�es !

    Dans le OnRead, c'est bien, tu accumule les packets successifs, � mon avis, tu n'obtiens jamais un buffer de 102000 mais plutot 8192 au mieux

    Ta cam�ra fonctionne certe en IP (TCP\IP) mais l� clairement tu l'utilises via un protocol de niveau sup�rieur le HTTP !

    Utilise un TIdHTTP, tu r�cup�reras le stream HTTP d�j� pr�t � l'emploi !
    Je te l'ai d�j� dit !

    Je n'ai pas d'exemple � te donner dans le programme que je maintiens, les Camera AXIS (accessible via HTTP) sont fournis avec un ActiveX AxisMediaControl qui fait tout ce boulot, n'ayant pas encore fait moi m�me ce type de d�veloppement (je l'ai fait ClientSocket � ServerSocket, mais jamais ClientSocket � server HTTP embarqu�), je ne peux pas t'aider plus que la th�orie
    Aide via F1 - FAQ - Guide du d�veloppeur Delphi devant un probl�me - Pensez-y !
    Attention Troll M�chant !
    "Quand un homme a faim, mieux vaut lui apprendre � p�cher que de lui donner un poisson" Confucius
    Mieux vaut se taire et para�tre idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la m�diocrit� !

    L'exp�rience, c'est le nom que chacun donne � ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2011
    Messages
    19
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 19
    Par d�faut
    Bonjour,
    effectivement j'h�sitais � continuer sur mon sujet pr�c�dent mais �tant donn� que j'ai marqu� "r�solu" j'ai pr�f�r� faire un autre sujet..

    En fait je re�ois l'image correctement approximativement 8 fois sur 10 . Mais des fois je re�ois un peu n'importe quoi.
    Par contre pour le buffer tout d�pend des cam�ras je pense �tant donn�e que je re�ois les donn�es sous forme de paquet pouvant aller jusqu'� plus de 30 000 !
    J'ai mis 102 000 c'est effectivement un peu excessif mais vaut mieux �tre large que pas assez non?

    Le TidHttp j'ai essay� je m'y pencher un peu mais je n'�tais pas tr�s � l'aise dessus.

    A vrai dire si je pouvais recevoir toujours les bonnes images j'aurai fini cette partie de mon projet (puisque j'ai fais le reste de mon projet qui consiste � faire une d�tection de mouvement).

    Avec le TidHttp comment on envoie une requ�te? Comment on re�ois le flux contenant l'image?

    Merci encore pour ta pr�sence et ton aide !

  4. #4
    Expert �minent
    Avatar de ShaiLeTroll
    Homme Profil pro
    D�veloppeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44
    Localisation : France, Seine Saint Denis (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur C++\Delphi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par d�faut
    Tu as une m�thode Get dans le TIdHTTP qui renvoie une chaine
    Tu as la chance d'avoir BCB6 qui fourni une excellente aide dont celle sur TIdHTTP

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    procedure Get(AURL: string; const AResponseContent: TStream); overload;
    function Get(AURL: string): string; overload;
    Get is an overloaded method used to retrieve the file or data for the resource specified in AURL.

    AURL is the complete, fully-qualified location of the resource.

    AResponseContent is the TStream that is the destination for data retrieved using the specified URL .

    Use Get(AUrl) to retrieve the data from AURL and return the contents as the String result of the function.

    Use Get(AUrl, AResponseContent) to retrieve data from the URL and write the return values to the TStream specified by AResponseContent.

    Get relies on the DoRequest method to perform the HTTP transfer.
    Aide via F1 - FAQ - Guide du d�veloppeur Delphi devant un probl�me - Pensez-y !
    Attention Troll M�chant !
    "Quand un homme a faim, mieux vaut lui apprendre � p�cher que de lui donner un poisson" Confucius
    Mieux vaut se taire et para�tre idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la m�diocrit� !

    L'exp�rience, c'est le nom que chacun donne � ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2011
    Messages
    19
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 19
    Par d�faut
    Merci j'ai essay� ce que tu m'as donn� et �a fonctionne !
    Par contre en mettant les instructions dans un timer afin de rafraichir l'image, mon application est lente (lorsque je d�place ma fen�tre par exemple �a lag) .

    Est-ce qu'il y a un moyen plus optimis�?

  6. #6
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Janvier 2011
    Messages
    19
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 19
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      unsigned char buf[30000];
      pStream->Position = 0;
      IdHTTP1->Get("http://192.168.2.5/cgi-bin/video.jpg?size=2", pStream);
      int pos = pStream->Position;
      pStream->Position = 0;
      pStream->Read(buf, pos);
      pFluxImage->Write(buf, pos);
      pFluxImage->Position = 0;
      jp->LoadFromStream(pFluxImage);
      Image1->Picture->Assign(jp); // afficher l'image
      pFluxImage->Position = 0;
    C'est ce qu'il y a dans mon timer ...

Discussions similaires

  1. R�ponses: 2
    Dernier message: 19/04/2014, 15h46
  2. Afficher les image dans une Gridview
    Par nitch01 dans le forum ASP.NET
    R�ponses: 2
    Dernier message: 30/06/2011, 08h11
  3. afficher les images dans un email via outlook est possible
    Par kaayna dans le forum Webmarketing
    R�ponses: 4
    Dernier message: 23/02/2010, 21h17
  4. Rediriger les images d'une cam�ra vid�o
    Par GDMINFO dans le forum D�buter
    R�ponses: 1
    Dernier message: 08/11/2009, 18h22
  5. [JSP]Afficher les images d'une ArrayList ?
    Par Bobsinglar dans le forum Struts 2
    R�ponses: 7
    Dernier message: 08/04/2008, 18h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo