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 :

detection de mouvement


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 63
    Par défaut detection de mouvement
    Bonjour;
    j'essaye de réaliser une application en temps réel sous builder c++ 6 de detection de mouvement, j'utilise pour ça une webcam. mon probleme est le temps important de traitement, ce qui influt négativement sur l'efficacité de mon application. y a quelque chose qui me manque mais je ne sais pas quoi exactement?? peut etre qu'il me faut une optimisation de mon code, ca peut etre le probleme majeur??? je vous informe que j'utilise le composant Timer.
    alors qu"est ce que vous voyez???

  2. #2
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    BOnjour
    peux tu nous informer plus précisément sur la procédure suivie pour faire de la détection de mouvement à partir d'une webCam
    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Comme tout n'est pas supposé se mettre en mouvement au même moment (sauf si quelqu'un vole la webcam ), il suffit de comparer l'état de certains pixels par raport à ceux d'une image au repos.
    On peut très bien séquencer ce test sur l'ensemble des pixels, de trame en trame, pour obtenir un test sur l'ensemble des pixels toutes les n trames, ce qui peut éventuellement être suffisant. En fait, c'est ainsi que fonctionne la vision humaine, avec son propre protocole de séquencement.
    Tout dépend de la vélocité du mouvement, donc que cherche t-on à détecter ?

    A plus !

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 63
    Par défaut
    merci d'avance;
    je fais pour la detection une simple difference entre une image acquise par le webcam et une image de fond converties toutes les deux en niveaux gris puis seuillées, dans mon cas, la conversion en niveaux de gris prend un temps important, le code suivant est un exemple à améliorer :

    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    getcwd (rep, MAXPATH) ;
    sprintf (nomfic, "%s\\b.bmp", rep) ;
    capFileSaveDIB(Form1->capvideo, nomfic) ;
    Image2->Picture->LoadFromFile(nomfic);
    for (i=0;i<= 351;i++)
    for (j=0;j<= 287;j++)
    {
    b[i][j] = Image2->Picture->Bitmap->Canvas->Pixels[i][j];
    }

    byte rouge ,vert, bleu;
    int nivgri;
    for (i=0;i<= 351;i++)
    for (j=0;j<= 287;j++)
    {
    rouge = GetRValue(b[i][j]);
    vert = GetGValue(b[i][j]);
    bleu = GetBValue(b[i][j]);
    nivgri = rouge+vert+bleu;
    b[i][j] =nivgri/3;
    }
    for (i=0;i<= 351;i++)
    for (j=0;j<= 287;j++)
    {
    if(abs(a[i][j]-b[i][j])>20)
    Image2->Canvas->Pixels[i][j]=RGB(255,255,255);
    else
    Image2->Canvas->Pixels[i][j]=RGB(0,0,0);
    }
    }

    comment je peux optimiser ce code pour avoir une execution en temps réel ?? et est ce que c'est utile d'utiliser Timer???

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 190
    Par défaut
    Bonsoir,
    N'oublie pas les balises '[CODE]' la prochaine fois.
    Plutot que d'utiliser Pixels, utilise ScanLine pour ton traitement des pixels.
    Tu devrais déjà gagner pas mal de temps.
    Cordialement,
    Benjamin

    EDIT: et puis plutot que de faire troix boucles for consécutives, arrange toi pour qu'il n'y en ai plus qu'une.

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 63
    Par défaut
    excusez moi de ne pas avoir utilisé les balises code, j'ai essayé d'utiliser "scanline" mais je n'ai pas réussi, je ne comprends pas son principe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    pBitmap->LoadFromFile(nomfic);
        for (int y = 0; y < pBitmap->Height; y++)
        {
          ptr = (Byte *)pBitmap->ScanLine[y];
     
          for (int x = 0; x < pBitmap->Width; x++)
            {
            ptr[x] = (Byte)y;
     }
     
        }
        Canvas->Draw(0,0,pBitmap);
      }
    je n'arrive pas à comprendre comment ça fonctionne et comment integrer mon code de calcul de niveaux de gris à l'interieur.

  7. #7
    Membre éclairé Avatar de Général03
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 848
    Par défaut
    Est-ce que tu n'oublies pas de décaler les trois couleurs primaire ? (RGB)
    Moi j'ai fait comme cela :
    for(int y=0 ; y<hauteur ; y++)
    {
    ptr = (Byte *)Image2->Picture->Bitmap->ScanLine[y]; //ptr comporte les pixels d'une ligne

    for(int x=0 ; x<largeur ; x++)
    {
    Anc[x][y] = (ptr[3*x]+ptr[3*x+1]+ptr[3*x+2])/3; //1pixel=Bleu+Vert+Rouge
    }

    }

Discussions similaires

  1. reduction du bruit et detection de mouvement
    Par marco13 dans le forum Traitement d'images
    Réponses: 9
    Dernier message: 14/01/2009, 14h30
  2. Detection de mouvement Robuste
    Par bmw13fr dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 27/09/2007, 11h12
  3. Probleme de detection de mouvement
    Par laurrrette dans le forum Traitement d'images
    Réponses: 3
    Dernier message: 28/02/2007, 13h02
  4. Detection de mouvement / reconnaissance des zones
    Par BNS dans le forum Traitement d'images
    Réponses: 7
    Dernier message: 04/05/2006, 21h17

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