DÉTECTEUR DE MOUVEMENTS AVEC UNE WEBCAM

jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 - 29 mars 2005 à 14:47
marmato Messages postés 1 Date d'inscription lundi 20 janvier 2003 Statut Membre Dernière intervention 31 mai 2012 - 31 mai 2012 à 00:11
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/30410-detecteur-de-mouvements-avec-une-webcam

marmato Messages postés 1 Date d'inscription lundi 20 janvier 2003 Statut Membre Dernière intervention 31 mai 2012
31 mai 2012 à 00:11
Bonjour,
Merci pour ce code source intéressants.
Est-il possible d'isoler le presse-papiers utilisé dans le programme?
(Car quand celui-ci est lancé, le presse-papiers ne fonctionne plus dans les autres applications).

Merci à celui qui pourra m'indiquer une solution…
cs_chaymouta Messages postés 1 Date d'inscription vendredi 12 février 2010 Statut Membre Dernière intervention 18 mars 2010
18 mars 2010 à 22:42
je suis très intéressée par votre projet et mon pfe consiste a élaboré un logiciel qui a les méme principe si tu peux m'aidé je serai très reconnaissante
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
26 nov. 2005 à 16:38
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
mternet Messages postés 1 Date d'inscription lundi 27 décembre 2004 Statut Membre Dernière intervention 22 avril 2005
22 avril 2005 à 23:34
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...
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
30 mars 2005 à 15:39
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 !!!
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
30 mars 2005 à 15:14
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.
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
30 mars 2005 à 14:39
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
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
30 mars 2005 à 13:13
Dommage ...
T' inquiète, d' ici 24 heures, on aura la réponse, tu paries?
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
30 mars 2005 à 11:45
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 !
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
30 mars 2005 à 09:26
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
floflotz Messages postés 240 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 6 janvier 2006
29 mars 2005 à 23:24
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 !).
cs_Billou Messages postés 34 Date d'inscription samedi 9 février 2002 Statut Membre Dernière intervention 27 août 2007
29 mars 2005 à 23:14
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++
floflotz Messages postés 240 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 6 janvier 2006
29 mars 2005 à 22:49
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 !
cs_Billou Messages postés 34 Date d'inscription samedi 9 février 2002 Statut Membre Dernière intervention 27 août 2007
29 mars 2005 à 16:30
Voilà, j'ai modifié mon fichier.
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
29 mars 2005 à 14:47
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.
Rejoignez-nous