jmp77
Messages postés1119Date d'inscriptionlundi 4 février 2002StatutMembreDernière intervention 4 octobre 2006
-
29 mars 2005 à 14:47
marmato
Messages postés1Date d'inscriptionlundi 20 janvier 2003StatutMembreDernière intervention31 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.
marmato
Messages postés1Date d'inscriptionlundi 20 janvier 2003StatutMembreDernière intervention31 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és1Date d'inscriptionvendredi 12 février 2010StatutMembreDernière intervention18 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és460Date d'inscriptiondimanche 5 décembre 2004StatutMembreDernière intervention 6 avril 20092 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és1Date d'inscriptionlundi 27 décembre 2004StatutMembreDernière intervention22 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és2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 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és1119Date d'inscriptionlundi 4 février 2002StatutMembreDernière intervention 4 octobre 20067 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és702Date d'inscriptionvendredi 21 mars 2003StatutMembreDernière intervention 1 octobre 20095 30 mars 2005 à 14:39
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 30 mars 2005 à 13:13
Dommage ...
T' inquiète, d' ici 24 heures, on aura la réponse, tu paries?
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 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és702Date d'inscriptionvendredi 21 mars 2003StatutMembreDernière intervention 1 octobre 20095 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és240Date d'inscriptionlundi 16 décembre 2002StatutMembreDerniè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és34Date d'inscriptionsamedi 9 février 2002StatutMembreDernière intervention27 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és240Date d'inscriptionlundi 16 décembre 2002StatutMembreDerniè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és34Date d'inscriptionsamedi 9 février 2002StatutMembreDernière intervention27 août 2007 29 mars 2005 à 16:30
Voilà, j'ai modifié mon fichier.
jmp77
Messages postés1119Date d'inscriptionlundi 4 février 2002StatutMembreDernière intervention 4 octobre 20067 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.
31 mai 2012 à 00:11
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…
18 mars 2010 à 22:42
26 nov. 2005 à 16:38
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
22 avril 2005 à 23:34
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...
30 mars 2005 à 15:39
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 !!!
30 mars 2005 à 15:14
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.
30 mars 2005 à 14:39
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
30 mars 2005 à 13:13
T' inquiète, d' ici 24 heures, on aura la réponse, tu paries?
30 mars 2005 à 11:45
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 !
30 mars 2005 à 09:26
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
29 mars 2005 à 23:24
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 !).
29 mars 2005 à 23:14
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++
29 mars 2005 à 22:49
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 !
29 mars 2005 à 16:30
29 mars 2005 à 14:47
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.