Je viens de programmer un détecteur de mouvements à partir d'une webcam et de la lib/dll trouvée ici même sur le forum (escapi)
Je souhaiterai savoir si mon code peut fonctionner mieux.
Actuellement, les mouvements sont détectés, mais j'ai été obligé de réduire la sensibilité à cause du bruit généré par les webcams.
Du coup, un mouvement de la main est suivi, mais un mouvement de la bouche ou des yeux doit être exagéré pour être capté par le programme.
Merci d'avance de vos précieux conseils.
Code : Tout sélectionner
timeBeginPeriod_(1)
IncludeFile "escapi.pbi"
UseJPEGImageDecoder()
device = 0
Width = 320
Height = 240
dest = AllocateMemory(Width*Height)
destLen = MemorySize(dest)
count = setupESCAPI()
name$ = Space(1000)
getCaptureDeviceName(device, @name$, 1000)
scp.SimpleCapParams
scp\mWidth = Width
scp\mHeight = Height
scp\mTargetBuf = AllocateMemory(scp\mWidth*scp\mHeight*4)
fx=(Width/2)
fy=(Height/2)
dist=240 ; ================== champs de vision
seuil=70 ; ================== seuil à partir duquel une différence de lumière entre l'ancienne image et la nouvelle est détectée à un pixel donné
maxverif=200 ; ================== nombre de pixels dont le mouvement est testé pour chaque image
noisekiller=16 ; ================== ce parametre elimine le bruit
image3=CreateImage(#PB_Any,Width,Height)
StartDrawing(ImageOutput(image3))
Box(0,0,320,240,RGB(0,0,0))
StopDrawing()
If initCapture(device, @scp)
image = CreateImage(#PB_Any, Width, Height)
image4 = CreateImage(#PB_Any, Width, Height)
OpenWindow(0, 0, 0, Width, Height, name$, #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
ImageGadget(0, 0, 0, Width, Height, ImageID(image))
wxl_EncodePixelFormat(#PB_PixelFormat_32Bits_BGR)
Repeat
Event = WindowEvent()
doCapture(device)
While isCaptureDone(device) = 0
Delay(1)
Wend
len = wxl_JPEGEncode(scp\mTargetBuf, Width, Height, 50, dest, destLen)
CatchImage(image2, dest, len)
oldfx=fx
oldfy=fy
; on met l'image en miroir, pour s'identifier dans l'image
StartDrawing(ImageOutput(image2))
For y=0 To Height-1
For x=0 To (Width/2)-1
col1=Point(x,y)
col2=Point(Width-x-1,y)
Plot(x,y,col2)
Plot(Width-x-1,y,col1)
Next
Next
StopDrawing()
difftot=0
For i=1 To maxverif
StartDrawing(ImageOutput(image3))
x=fx+Random(dist)-(dist/2)
y=fy+Random(dist)-(dist/2)
If x>Width-1
x=Width-1
EndIf
If x<0
x=0
EndIf
If y>Height-1
y=Height-1
EndIf
If y<0
y=0
EndIf
col1=Point(x,y)
StopDrawing()
StartDrawing(ImageOutput(image2))
col2=Point(x,y)
moy1=(Red(col1)+Green(col1)+Blue(col1))/3
moy2=(Red(col2)+Green(col2)+Blue(col2))/3
; on va comparer ici un pixel pris au hasard dans le champs de vision avec le pixel qui était précédement là aux même coordonnées
; si la couleur change, c'est qu'il y a mouvement... ou du bruit dans la webcam. d'où le besoin de filtrer le bruit et de mettre un seuil
; sous lequel rien n'est detecté.
diff=noisekiller*Int(Abs(moy2-moy1)/noisekiller)
If diff>seuil
If diff>difftot
fx=x
fy=y
EndIf
EndIf
StopDrawing()
Next
FreeImage(image3)
image3=CopyImage(image2,#PB_Any)
fx=(oldfx+fx)/2 ; pour un mouvement plus fluide, je fais toujours la moyenne entre les anciennes coordonnées de la fenetre de vision et les nouvelles coordonnées
fy=(oldfy+fy)/2
; je calcule ma fenetre...
StartDrawing(ImageOutput(image4))
Box(0,0,320,240,RGB(0,0,0))
StopDrawing()
x1=fx-80
y1=fy-80
wh=160
If x1<0
x1=0
EndIf
If y1<0
y1=0
EndIf
If x1+wh>320
wh=320-x1
EndIf
If y1+wh>240
wh=240-y1
EndIf
image5=GrabImage(image2,#PB_Any,x1,y1,wh,wh)
StartDrawing(ImageOutput(image4))
DrawImage(ImageID(image5),x1,y1)
StopDrawing()
FreeImage(image5)
SetGadgetState(0, ImageID(image4))
Until Event = #PB_Event_CloseWindow
deinitCapture(device)
Else
Debug "init capture failed!"
EndIf
timeEndPeriod_(1)
End