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 :

C++ Builder et capture vidéo sur une application minimisée


Sujet :

C++Builder

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 6
    Points
    6
    Par défaut C++ Builder et capture vidéo sur une application minimisée
    Bonjour à toutes et à tous,

    je sais qu'il existe plein de topics au sujet de la capture webcam en builder mais là ils 'sagit d'un problème bien spécifique :

    Contexte : capture vidéo avec les fonctions VCL (capCreateCaptureWindow, etc) dans une application windows.

    Problème : Lorsque l'application est réduite dans la barre des tâches ou dans le system-tray, le tableau de byte retournée par la fonction GetDIBits est remplis de 0 (couleurs noir). Pourtant, lorsque l'application est restorée ça fonctionne.

    Aurriez-vous une idée?

    Merci

  2. #2
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Faudrait-il plus de détails?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    Par défaut
    Salut

    Postes ton code , je regarderai çà ce midi

    ++

  4. #4
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci,

    La création de la capture window :
    Hwnd=capCreateCaptureWindow("Capture Window",WS_CHILD | WS_VISIBLE,2,2,
    WIDTH,HEIGHT,WebcamView->Handle,1) ;
    WebcamView étant une ScrollBox

    voici le code que j'utilise dans un thread pour éviter de figer l'application :

    int i, j,k,l; // Bcl
    int R, G, B ,color; // Recupère des infos
    long activPixels; //noombre de pixel considéré comme différents
    HDC hDC_tmp ; // Pour récupérer les pixels
    HDC hdc, memdc; // DC
    void *pBits ; // Tbl de pixel
    char theTime[TIME_LENGTH]; // Tbl de pixel
    HBITMAP hbmp ; // Image
    HGDIOBJ hret ; // Pour récupérer l'image
    hdc = Form1->HDCVideo ; // Va avec le hWnd
    LPBYTE lpBits ;

    while(true)
    {
    lpBits = new BYTE[4*WIDTH*HEIGHT];
    activPixels = 0;
    // C'est marqué
    memdc = CreateCompatibleDC(hdc);
    if(!(memdc))
    {
    return ;
    }

    // Création du bitmap
    hbmp = CreateDIBSection(hdc, &(Form1->bmpinfo), DIB_PAL_COLORS, &pBits, NULL, 0) ;

    // En cas d'erreur
    if(!hbmp)
    { // Fait le ménage
    DeleteObject(hbmp) ;
    DeleteDC(memdc) ;
    free(pBits) ;
    return ;
    }

    // Sélectionne le mendc avec l'image
    hret = SelectObject(memdc, hbmp) ;
    if(!hret || (hret == HGDI_ERROR))
    {
    // Fait le ménage
    DeleteObject(hbmp) ;
    DeleteDC(memdc) ;
    free(pBits) ;
    return ;
    }

    // Colle l'image
    if(!BitBlt(memdc, 0, 0, WIDTH, HEIGHT, hdc, 0, 0, SRCCOPY))
    {
    // Fait le ménage
    DeleteObject(hbmp) ;
    DeleteDC(memdc) ;
    free(pBits) ;
    Form1->Caption = "ERROR 3";
    Application->Restore();
    return ;
    }

    // Récupère le DC
    hDC_tmp = GetDC(NULL) ;

    // Récupère les pixels
    GetDIBits(hDC_tmp, hbmp, 0, HEIGHT, lpBits, &(Form1->bmpinfo), DIB_RGB_COLORS) ;


    ReleaseDC(NULL, hDC_tmp) ;

    Form1->streamBitmap->Canvas->Lock();
    Form1->motionBitmap->Canvas->Lock();
    // Parcoure les pixels et les stocke dans un tbl
    for(i=0; i<HEIGHT; i++)
    {
    k=4*WIDTH*(HEIGHT-1-i);
    for(j=0; j<WIDTH; j++)
    {
    // Récupère chaque coef du RGB
    l=k+4*j ;
    // Calcul la couleur
    R = lpBits[l+2];
    G = lpBits[l+1];
    B = lpBits[l] ;
    color = (R + 256* G + 65536 * B);
    Form1->streamBitmap->Canvas->Pixels[j][i]=(TColor)color;
    G=(R+G+B)/3;
    color = abs(G - lastGrey[j][i]);
    if(color>10)
    {
    activPixels++;
    }
    lastGrey[j][i] = G;
    B= 65792;
    B = (Form1->detected)?B/256:B;
    B = (Form1->protectionActived)?B/256:B;

    Form1->motionBitmap->Canvas->Pixels[j][i]=(TColor)color*B;
    }
    }

    Form1->MotionPicture->Canvas->Lock();
    Form1->MotionPicture->Canvas->Draw(0,0,Form1->motionBitmap);
    Form1->motionBitmap->Canvas->Unlock();
    Form1->MotionPicture->Canvas->Unlock();
    //création de la date et de l'heure pour l'affichage
    createStringTime(theTime);
    Form1->streamBitmap->Canvas->Font->Color = Form1->ColorBoxTime->Selected;
    Form1->streamBitmap->Canvas->Brush->Color = Form1->ColorBoxTimeBG->Selected;
    switch(Form1->ComboBoxTime->ItemIndex)
    {
    case 0:
    case 2: i = 118;
    break;
    case 1:
    case 3: i = 132;
    break;
    case 4:
    case 6: i = 120;
    break;
    case 5:
    case 7: i = 134;
    break;
    case 8:
    case 10: i = 106;
    break;
    case 9:
    case 11: i = 120;
    break;
    default: break;

    }

    Form1->streamBitmap->Canvas->TextOutA(WIDTH - i ,HEIGHT - 15,theTime);

    //détection
    motionDetection(activPixels *100/( WIDTH * HEIGHT));
    if(Form1->detected)
    {
    Form1->streamBitmap->Canvas->Brush->Color = ( Form1->protectionActived )?clRed:clBlack;
    Form1->streamBitmap->Canvas->Font->Color = ( Form1->protectionActived )?clBlack:clYellow;
    Form1->streamBitmap->Canvas->TextOutA(2,2,(( Form1->protectionActived )?" Alert intrusion! ":" Motion Detected "));
    }
    //affichage de l'image de streaming
    Form1->StreamPicture->Canvas->Lock();
    Form1->StreamPicture->Canvas->Draw(0,0,Form1->streamBitmap);
    Form1->streamBitmap->Canvas->Unlock();
    Form1->StreamPicture->Canvas->Unlock();

    // Fait le ménage
    DeleteObject(hbmp) ;
    DeleteDC(memdc) ;
    free(lpBits) ;
    this->Suspend();
    }
    En te remerciant.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    Par défaut
    Salut

    Je viens de regarder mais il y a tellemnt d objets et de variables non definis qu il faut y aller au pifometre

    T aurais pas un morceau plus precis ?

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    Par défaut
    J ai bricolé un code qui ressemble au tien et qui m enregistre des bitmaps toutes les secondes grâce à un timer et j ai le même résultat que toi lorsque je minimise

    En fait pas vraiment , j ai une partie de mon bureau et de nouveau la capture au rétablissement de la fenêtre

    Je pense que c est le fait d utiliser la propriété canvas qui pose problème , il faudrait pouvoir recueillir les données envoyées par la webcam plus tôt


    Il y a directx à regarder et également WIA

  7. #7
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Donc ce serait l'utilisation du dib qui casserait les pied en fait....

    Pour ce qui est des variables, elles sont déclarées dans le .h pour pouvoir les utiliser autre part

    Merci pour ton aide, je considère pour l'instant le problème comme réssolut mais je fermerais un peu plus tard dès fois que j'aurrais une question sur le sujet (genre une semaine ou deux)

  8. #8
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Je note ici la solution retenue :

    1)Forcer l'état restoré de l'application

    2) Changer la position du form . Typiquement Top = -4000 pour cacher le form

    3) Utilisation de ShowWindow pour utiliser les style SW_SHOW et SW_HIDE

    Et....

    Bah ça marche quoi ^^

    En tout cas merci pour ton avis éclairé qui m'a permis de voir d'où venait le problème.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Besoin de conseils sur une application
    Par Jim_Nastiq dans le forum Langage
    Réponses: 12
    Dernier message: 12/04/2006, 12h43
  2. Limites d'access sur une application WEB
    Par titou250 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 07/04/2006, 02h35
  3. Reception évenement sur une Application Console
    Par anisb dans le forum Langage
    Réponses: 3
    Dernier message: 03/02/2006, 19h29
  4. Focus sur une application Windows
    Par mixi dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/10/2004, 19h57
  5. Capture vidéo d'une application OPENGL
    Par Mathieu.J dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 10/06/2004, 21h29

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