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

Delphi Discussion :

repérer plusieurs pixels sur une video


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 42
    Points : 18
    Points
    18
    Par défaut repérer plusieurs pixels
    Bonjour tout le monde, voila au lancement de mon programme l'image d'une webcam s'affiche et j'aimerai par un calcul que lorsque tel pixel plus tel pixel sont affichés de tel ou tel couleur un autre composant du programme soit activé.

    Mais comment répérer les pixels, avec quel code ?

    J'espere que quelqu'un prendra la peine de me venir en aide, et si il y a besoin de plus de précision n'hésitez surtout pas. Merci

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Pour lire la couleur d'un pixel et que connais les coordonnées,
    tu peux utiliser la fonction suivante:
    - GetPixel
    F1 sur cette fonction te donnera tout le reste...

    Reste maintenant à savoir quand tu dois lire ces pixels...
    Si tu as un évènement qui est déclanché à chaque fois
    que la caméra envoit une nouvelle image, ce serait parfait.

    sinon, via un timer... mais à ce moment là, tu risque de lire tes pixels
    avec une demi image.. où même validé plusieurs fois la condition
    de lancement car tu va lire plusieurs fois les pixels de la même image
    étant donnée que la caméra n'aura pas envoyé de nouvelle image...
    Ca te prend absolument un moyen de savoir si l'image à changé...

  3. #3
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut
    Il y a beaucoup plus simple...
    Il y a des logiciels de vidéosurveillance tout fais, et tu peu extraire des images du flux vidéo (dont la première), après, les traitement deviennent plus simple (couleur du pixel sur une simple TImage...).
    Tu peux aussi télécharger DSPack, et regarder dans les exemples, tu y trouvera sûrement ton bonheur...
    Voilà bon dev et à plus !!

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    Merci pour vos réponses eric et petitprince,
    j'ai récupéré une partie d'un programme que j'essay d'adapter au mien, il me permet d'afficher la couleur du pixel qui se trouve sous mon curseur dans un label.
    Il faudrait que j'arrive à fixer le choix d'un seul pixel de l'affichage de la webcam sans que mon curseur ne passe dessus.
    Mais le probleme est que lorsque mon curseur passe au-dessus de l'image de la webcam il m'affiche la couleur du pixel qui est derriere la fenetre de delphi(en quelque sorte il ne voit pas l'affichage). Comment faire ? voici le bout de programme :
    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
    Function CouleurPointEcran(x,y:Integer):TColor;
    var Dc : HDC;
    Begin
      // Création d'un contexte d'affichage non lié à une fenêtre
      // donc permet d'accéder à l'écran entier
      DC := CreateDC('DISPLAY',Nil,Nil,Nil);
      Try
        // Obtenir la couleur du point
        Result:=GetPixel(DC,X,Y);
      Finally
        // ne pas oublier de libérer le contexte, c'est une ressource rare.
        DeleteDc(DC);
      end;
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      label1.Color:=CouleurPointEcran(Mouse.CursorPos.X,Mouse.CursorPos.Y);
    end;
    Et pour la frequence de capture des pixels, je pense qu'ils seront lus sur une capture d'image et il y aura une nouvelle capture toutes les 5s

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    Pour simplifier un peu, ce dont je souhaite juste c'est que le programme précédent soit dans un contexte lié a une fenetre donc le contraire du code qui lui agit en dehors de la fenetre.
    Je remercie vivement ceux qui m'ont répondu et ceux qui me répondront.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    Comme je vois que je ne suis pas tres compréhensible je vais tenter une derniere fois de m'expliquer.

    Je voudrais que si la couleur d'un pixel est (par exemple) rouge alors label1 devient noir. J'ai pensé à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     If canvas.pixels[80,100] := clred then label1.color := clblack;
    end;
     
    end.
    Mais ça ne marche pas, est ce que quelqu'un peut m'aider ?

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 190
    Points : 218
    Points
    218
    Par défaut
    si tu utilise l'image provenant d'une webcam tu ne peux pas te baser sur couleur egal noir, il faut que tu fasses des seuils de tolerances genre pas egal mais presque egal a noir

    la webcam est un périphérique qui dispose d'un capteur video il presque certain que ton image provenant de la webcam est BRUITE (il suffit qu'il y ai une legere variation de la luminosité ambiante et la couleur de ton pixel va changer)

    renseigne toi sur le traitement d'image

    les produits de convolutions,les filtres passes haut ect ...

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Le problème vient surtout du fait qu'il n'est pas capable de capturer
    l'image de la caméra via le canvas...

    j'imagine qu'un printscreen ne te permet pas non plus
    de capturer l'image de la caméra...

    j'ai pas de webcam alors... je peux pas t'aider.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    Pour capturer une image j'ai trouvé comment faire, en utilisant un timer.
    Et pour la variation de lumiere la solution est de compresser la video de sorte qu'elle n'affiche seulement une 15aine de pixels différents donc quand un objet blanc est présent devant, elle affiche du cyan, quand l'objet est noir l'image est noire et quand l'objet n'est ni blanc ni noir il y un dégradé de vert mais de tres peu de couleurs, pas assez pour faire varié incessemment la couleur de chaque pixel.
    Mais le soucis que j'ai maintenant est de faire fonctionner ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     If canvas.pixels[80,100] := clred then label1.color := clblack;
    end;
     
    end.
    Meme en dehors de l'image capturée ou de la video(a nimporte quel pixel la fenetre du programme) ce code ne marche pas parce qu'il est en parti faux
    il me dit que then n'est pas une expression boolean ou un truc du genre, ça doit pas etre grand chose.
    Si quelqu'un a une idée, ou bien si quelqu'un est capable de traduire ça :"si le pixel de coordonnées [80,100] est jaune alors la couleur du label1 est noir" qu'il me le dise. merci^^

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Change ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If canvas.pixels[80,100] := clred then label1.color := clblack;
    pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If canvas.pixels[80,100] = clred then label1.color := clblack;

  11. #11
    Membre régulier

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 126
    Points : 107
    Points
    107
    Par défaut
    Voici une petite procedure (que j'ai trouvée sur ce forum, mais je ne me souviens plus qui en est l'auteur) qui permet de récupérer dans un bitmap, une portion rectangulaire de l'écran du PC (éventuellement la totalité)

    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
    procedure GetScreenBitmap(r: TRect; var bitmap: TBitmap);
    var DC: HDC;
    begin
      Bitmap.Width := r.Right;
      Bitmap.Height := r.Bottom;
     
      DC := GetDC(0);
      try
        with Bitmap do
          BitBlt(Canvas.Handle, 0, 0,
                 Width, Height, DC, r.Left, r.Top, SrcCopy);
      finally
        ReleaseDC(0, DC);
      end;
    end; // GetScreenBitmap

    A partir de la on peut très bien analyser tel ou tel pixel, si on connait son adresse.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    Super eric tu as trouvé , je vais pouvoir avancer un peu plus vite maintenant.
    Encore merci à tous ceux qui ont répondu c'est vraiment sympas de passer du temps pour aider les autres.

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

Discussions similaires

  1. [xDSL]Support de plusieurs xDSL sur une ligne analogique
    Par leminipouce dans le forum Dépannage et Assistance
    Réponses: 3
    Dernier message: 03/04/2006, 17h52
  2. Plusieures infos sur une seule ligne avec ou sans tableau
    Par Him dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 17/03/2006, 14h16
  3. plusieurs div sur une ligne
    Par difficiledetrouver1pseudo dans le forum Balisage (X)HTML et validation W3C
    Réponses: 14
    Dernier message: 18/02/2006, 23h57
  4. Mettre plusieurs enrégistrement sur une ligne
    Par royrremi dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 20/01/2006, 07h41
  5. Ajouter du texte sur une vidéo
    Par ChIcKeN78 dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 01/06/2005, 10h43

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