Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

DÉTECTEUR DE MOUVEMENTS AVEC UNE WEBCAM


Information sur la source

Catégorie :Graphique Niveau : Initié Date de création : 29/03/2005 Date de mise à jour : 30/03/2005 12:15:14 Vu / téléchargé: 16 338 / 2 857

Note :
8,75 / 10 - par 8 personnes
8,75 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (15)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Ce programme permet de détecter si il y a un mouvement devant votre webcam. Il est possible de configurer la sensibilité de la détection et de sauvegarder une image lorsqu'un mouvement est détecté.

Pour détecté le mouvement, je compare les couleurs des pixels l'image actuel de la webcam avec ceux de la dernière image. Si la couleur du pixel ne fait pas parti de l'interval [CouleurRef - 1000000, CouleurRef + 1000000], alors cela incrémente le compteur d'erreur. Si le rapport entre le nombre de pixels qui on incrémentés erreur et le nombre de pixel total composant l'image est plus grand que X% (x est paramétrable) alors, je considère qu'il y a eu un mouvement.

Pour la récupération de l'image de la webcam je me suis inspiré de cette source http://www.delphifr.com/code.aspx?id=23967
Pour la sauvegarde de l'image au format Jpg je me suis inspiré de cette source http://www.delphifr.com/code.aspx?id=11722
 

Conclusion

Si quelqu'un à des idées pour améliorer cette source, je lui serai grandement reconnaissant.
Merci pour vos commentaires.

Ps. Ma WebCam capture en 352*288 alors mon code est conçu pour ce format à vous de l'adapter a votre format.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   Detection de mouvement

Télécharger le zip

Historique

29 mars 2005 16:26:48 :
29.3.2005 : Allégement du fichier zip
30 mars 2005 12:15:14 :
Correction du code selon les instruction de Kenavo ( merci ).

Commentaires et avis

signaler à un administrateur
Commentaire de jmp77 le 29/03/2005 14:47:50

Hello,

Alors ta source à l'air tres interessante mais juste quelques remarques de principes :
1 - Tu ne dois pas fournir l'exe.
2 - Tu ne dois pas fournir les .dcu
3 - Tu ne dois pas fournir les fichiers .~..
Tous ces fichiers sont inutiles et surcharge le serveur.
4 - Evite de mettre des noms de fichiers avec accents (é,è...) car on ne peut pas les télécharger quand on est membre club.


Allez je vais tester ta source maintenant.

Bonne continuation,
JMP77.

signaler à un administrateur
Commentaire de Billou le 29/03/2005 16:30:10

Voilà, j'ai modifié mon fichier.

signaler à un administrateur
Commentaire de floflotz le 29/03/2005 22:49:30

Ca avait l'air intéressant mais chez moi ca ne marche pas !

Enfin aucune image ne s'enregistre malgré différents réglages.

J'y connais pas grand chose en delphi pour savoir ce qui coince. Dommage !

signaler à un administrateur
Commentaire de Billou le 29/03/2005 23:14:28

salut,

lorsque tu es en mode "détection", est-ce qu'un carré rouge apparaît en dessous de l'image? Si c'est le cas, il doit y avoir un problème pour l'enregistrement de ton image. Sinon, essaye de mettre le réglage de la sensibilité a 1 ou 2 et surtout n'oublie pas de cocher "sauver image".

a++

signaler à un administrateur
Commentaire de floflotz le 29/03/2005 23:24:55

hello

je n'ai aucun carré rouge nulle part ! et meme avec sensibilité à 1 ca ne s'enregistre pas (avec la case cochée bien sur !).

signaler à un administrateur
Commentaire de Kenavo le 30/03/2005 09:26:42

Salut,

Il y a plusieurs problèmes dans la fonction différence :
1 - les boucles for .. do doivent être :
for i := 0 to (Bmp1.Height-1) div Rapport  et
for j := 0 to (Bmp1.Width-1) div Rapport
Bmp.Canvas.Pixels[Bmp.Width,Bmp.Height] est hors rectangle !

2 - La fonction Pixels n'est pas la plus adaptée ni la plus rapide pour faire de l'analyse d'image.
Il est préférable d'utiliser la fonction Scanline du bitmap:

3 - En comparant les couleur comme tu le fais, tu effectues une comparaison du bleu (couleur = $10000*Bleu + $100*Vert + Rouge).
Et ce n'est pas la couleur la plus intéressante,  elle est très bruitée. Il est préférable d'utiliser le vert comme base de comparaison.

Je te propose :

function TForm1.Difference(): Integer;
Const
  MaxPixels = 480 * 640;
type
  TBuffer = array[0..MaxPixels] of TColor;
var
  Coul1, Coul2: TColor;
  I, II, J, JJ, Erreur, rapport: Integer;
  p1, p2: ^TBuffer;
const
  SensiCoul = 8;      // 8 points d'écart d
begin
  Rapport := form1.TrackBar2.Position;
  Erreur := 0;
  P1 := Bmp1.ScanLine[Bmp1.Height - 1];  (**)
  P2 := Bmp2.ScanLine[Bmp2.Height - 1];  (**)
  for I := 0 to (Bmp1.Height - 1) div Rapport do
  begin
    II := I * Rapport;
    for J := 0 to (Bmp1.Width - 1) div Rapport do
    begin
      JJ := Rapport * J;
      Coul1 := P1^[(479-ii)*Bmp1.Width + JJ]; (**)
      Coul2 := P2^[(479-ii)*Bmp1.Width + JJ]; (**)
      if abs((Coul2 and $00FF00)-(Coul1 and $00FF00)) > (SensiCoul * $100) then Inc(erreur);
    end;
  end;
  Result := (Round(Erreur / ((Bmp1.Height / Rapport) * (Bmp1.Width / Rapport)) * 100));
end;

-----------------------------------------------------------------------------------------
(**) La fonction Scanline renvoie l'adresse de la ligne passée en paramètre.
Si on observe ces pointeurs, on voit :
1 - que le bitmap est contenu dans une table continue
2 - que le début de cette table est la ligne d'indice de plus fort (= Bmp.Height-1)
on en déduit :
qu'on peut lire toute l'image avec un seul pointeur renvoyé par Scanline[Bmp.Height - 1]
que l'indice du pixel de coordonnées(i,j) est ((Bmp.Height-1) - j * Bmp.Width + i)

Ken@vo

signaler à un administrateur
Commentaire de MAURICIO le 30/03/2005 11:45:43

Bien que cette source soit une excelente idée, elle manque cruellement de commentaires, surtout dans les lignes suivantes:
hcam:=capCreateCaptureWindowA('',0,0,0,320,240,handle,0);
sendmessage(hcam,1034,0,0);
On voit tous à quoi ça sert mais comment ça marche? Pourquoi 320, 240 ????? et 1034 ???????????

Kenavo te donne un bout de code qui va speeder ta fonction de comparaison, disons 10 fois plus vite, alors, utilise là !

D' ailleurs, voici une fonction de comparaison que j' ai fais il y a 1an ou 2:
function BITMAP_COMPARARAR_CANVAS(Bmp1: TBitmap; Bmp2: TBitmap; FirstCol, LastCol, FirstRow, LastRow : Integer): Integer;
var x, y: Integer;
    P1, P2: PByteArray;
begin
  RESULT := 0;

  If Bmp1.Width - 1 < LastCol Then RESULT := -1;
  If Bmp2.Width - 1 < LastCol Then RESULT := -1;

  If Bmp1.Height - 1 < LastRow Then RESULT := -1;
  If Bmp2.Height - 1 < LastRow Then RESULT := -1;

  If RESULT = 0
  Then
    If Bmp1.PixelFormat <> Bmp2.PixelFormat
    Then RESULT := -1;

  If RESULT = 0
  Then
    For y := FirstRow to LastRow do
    Begin
        P1 := Bmp1.ScanLine[y];
        P2 := Bmp2.ScanLine[y];

        Case Bmp1.PixelFormat Of
          pf4bit :  begin     // 16 cores : 2 pixeis = 1 byte !          // TESTADO !
                     for x := (FirstCol Div 2) to (LastCol Div 2) do
                       If P1[x] <> P2[x]
                       Then RESULT := RESULT + 1;
                    end;

          pf8bit :  begin     // 256 cores : 1 pixel = 1 byte !          // TESTADO !
                     for x := (FirstCol) to (LastCol) do
                       If P1[x] <> P2[x]
                       Then RESULT := RESULT + 1;
                    end;

          pf16bit : begin     // 16 bit : 1 pixel = 2 bytes !
                     for x := (FirstCol * 2) to (LastCol * 2) do
                       If P1[x] <> P2[x]
                       Then RESULT := RESULT + 1;
                    end;

          pf24bit : begin     // 24 bit : 1 pixel = 3 bytes !            // TESTADO !
                     for x := (FirstCol * 3) to (LastCol * 3) do
                       If P1[x] <> P2[x]
                       Then RESULT := RESULT + 1;
                    end;

          pf32bit : begin     // 32 bit : 1 pixel = 4 bytes !
                     for x := (FirstCol * 4) to (LastCol * 4) do
                       If P1[x] <> P2[x]
                       Then RESULT := RESULT + 1;
                    end;
        End;
    End;
end;

Elle permet donc la comparaison de diverses format ainsi qu' une region du bitmap !

signaler à un administrateur
Commentaire de Billou le 30/03/2005 12:02:17

Bonjour,

Je vous remercie grandement pour vos commentaires très constructif et je vais m'empresser de modifier mon code en conséquence.

Maurico : je sais que ma source manque de commentaire je ne suis pas très doués pour en écrire. Mis à par cela, je ne comprend pas non plus la façon dont marche les deux lignes que tu as soulignées. Je les ait bêtement copier du code figurant ici http://www.delphifr.com/code.aspx?id=23967  comme je l'ai mis dans ma description. Désolé de ne pas pouvoir t'en dire plus.

a ++

signaler à un administrateur
Commentaire de MAURICIO le 30/03/2005 13:13:24

Dommage ...
T' inquiète, d' ici 24 heures, on aura la réponse, tu paries?

signaler à un administrateur
Commentaire de Kenavo le 30/03/2005 14:39:13

Gagné Mauricio !
Au lieu de vous donner quelques extraits, je vous conseille de vous reporter aux pages MSDN qui traitent du sujet :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_using_video_capture.asp pour les généralités
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_creating_a_capture_window.asp pour la fonction capCreateCaptureWindow (320 et 240 sont donc les dimensions de la fenêtre de capture)  
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_video_capture_messages.asp pour les constantes des messages
1034 = WM_CAP_DRIVER_CONNECT
1084 = WM_CAP_GRAB_FRAME
1054 = WM_CAP_EDIT_COPY
J'avais fait déja ce commentaire. Ces constantes sont définies dans l'unité AviCap.pas que vous pouvez trouver sur le NET
Y a beaucoup à manger, et c'est pas facile de tout digérer !

Bon courage !

Ken@vo

signaler à un administrateur
Commentaire de jmp77 le 30/03/2005 15:14:34

Hello,

Moi j'ai cette erreur :
---------------------------
MoveDetector.exe - DLL introuvable
---------------------------
La bibliothèque de liaisons dynamique C:\windows\system32\avicap32.dll est introuvable sur le chemin spécifié

Où trouver cette dll alors?

++,
JMP77.

signaler à un administrateur
Commentaire de jmp77 le 30/03/2005 15:20:31

Re,

C'est bon je viens de la trouver pour les autres il faut aller la chercher ici :
http://www.delphifr.com/zipview.aspx?ID=23967&f=Webcam%2favicap32.dll&dl=1
Extrait de cette source :
http://www.delphifr.com/code.aspx?id=23967

Alors franchement sinon pour le 'C:\windows\system32\avicap32.dll' en dur dans le programme je te felicite pas Billou. Moi je suis en win2000 donc 'C:\winnt\system32\avicap32.dll'.

++,
JMP.

signaler à un administrateur
Commentaire de MAURICIO le 30/03/2005 15:39:46

Qu' est-ce que j' ai gagné? hein?
En tout cas, merci à toi Kenavo d' avoir 'perdu ton temps' pour nous donner une explication!
C' est que maintenant, on va pouvoir se coucher ce soir tranquille ... comme ça, bem la webcam ne nous chopera pas à bouger dans tous les sens !!!

signaler à un administrateur
Commentaire de mternet le 22/04/2005 23:34:26

Hello
J'ai essayé ce petit prog source  : l'affichage webcam fonctionne nickel mais dès que je valide la détection-->plantage au niveau de la fonction Difference() à la ligne:
if abs((Coul2 and $00FF00)-(Coul1 and $00FF00)) > (SensiCoul * $100) then Inc(erreur);
Je suis pourtant certain que cela a déjà fonctionné mais je ne m'explique pas ce plantage...
Mon OS est XP SP1...

signaler à un administrateur
Commentaire de cincap le 26/11/2005 16:38:35

Billou,

Superbe et cela fonctionne avec le pack 2 xp.

Si tu améliores cette source, préviens moi s.v.p.

jean-marie.capellen@skynet.be

@+,

CINCAP

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,406 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.