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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    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
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    Par défaut
    Faudrait-il plus de détails?

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

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

    Postes ton code , je regarderai çà ce midi

    ++

  4. #4
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 10
    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 émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    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 émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    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

+ 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