$H Windows.ph
' Bewegungsmelder
' Walter, 29.4.2023
' Der Bewegungsmelder zeigt al Bildschirm en el Sekundentakt Bilder de el Laptop-Kamera a Kontrolle/Einstellung el Empfindlichkeit.
' Das jeweilige Bild se en Los cambios para vorigen Bild geprüft (Toleranz para Änderung / Anzahl el geänderten Pixel).
' Wird en más que el eingestellten Anzahl Pixeln el eingestellte Toleranz überschritten, es una Meldung.
'
' Ab el Drücken de Button START voluntad en cada erkannten Veränderung
' Bild-Nr, Datum y Uhrzeit en el Bild geschrieben y el Foto en el Programmordner gespeichert.
' (El Bilder voluntad no automáticamente gelöscht, sin embargo beim nächsten Start des Programms überschrieben).
' (Das alles lässt se natürlich a el eigenen Wünsche adaptar - dazu sí el Source :+D--).
' Hier es eingestellt 1 Bild pro Sekunde, Breite/Höhe 640*480
'
' Base es "https://XProfan.net/intl/de/quelltexte/webcam-laptop-kamera-snapshot-escapi-dll/"
' y el Anregung en "https://XProfan.net/intl/de/cafe/bewegungsmelder-programa-mithilfe-uno-webcam/" o. "https://XProfan.net/intl/de/anwendungen/webcam-bewegungsmelder/",
' prospeed.dll para el Vergleich el Webcam-Bilder utilizarse.
'
' Benötigt Escapi.dll V3 Win32
' Windows.ph
' prospeed.dll
'
declarar dll1&,AnzCam%,capture#,a%,b%,name$
declarar dll2&,ZweitesBild#, x&,AnzBy&,Tol&
declarar b1%,b2%,t%,ed1%,ed2%,m%
declarar hBMP%,BildBuffer#
declarar pfad$,i%,Startverzögerung%,Ende%,se ejecuta%, Bewegungen%,zeit!,dauer!,HiebeProBew%
'
pfad$=GetDir$("")
Startverzögerung%=3
'
'
' Bildbuffer
AnzBy&=1228800
dim BildBuffer#,AnzBy&' 640*480*4 Byte
dim ZweitesBild#,AnzBy&
'
' Schnittstellenstruktur para escapi.dll
struct Bild=buff%%,mWidth&,mHeight&' Pointer en el Bild-Buffer, Ancho de imagen, Bildhöhe
dim capture#,Bild
capture#.buff%%=addr(BildBuffer#)
capture#.mWidth&=640
capture#.mHeight&=480
'
' Escapi.dll
Def ESCAPIDLLVersion(0) !"escapi","ESCAPIDLLVersion"
Def countCaptureDevices(0) !"escapi","countCaptureDevices"
Def deinitCapture(1) !"escapi","deinitCapture"
Def doCapture(1) !"escapi","doCapture"
Def getCaptureDeviceName(3) !"escapi","getCaptureDeviceName"
Def initCOM(0) !"escapi","initCOM"
Def initCapture(2) !"escapi","initCapture"
Def isCaptureDone(1) !"escapi","isCaptureDone"
dll1&=usedll("Escapi.dll")
'
' Prospeed.dll
$I Prospeed_Funktionen.inc
dll2&=usedll("prospeed.dll")
'
'
'
'
'-------------------------------------------
Título de la ventana "Bewegungsmelder"
window 700,700
CLS ~GETSYSCOLOR(15)
'
' Toleranz
create("Text",%hwnd,"Toleranz para veränderte Pixel",20,503,200,25)
ed1%=Crear("Edit",%hwnd,"200",220,500,40,20)
Crear("Tooltip",%hwnd,ed1%,"Etwa 200...300 es en me una guter Valor.")
create("Text",%hwnd,"Anzahl veränderter Pixel außerhalb Toleranz",300,503,300,25)
ed2%=Crear("Edit",%hwnd,"100",620,500,40,20)
Crear("Tooltip",%hwnd,ed2%,"Etwa 100 es en me una guter Valor.")
t%=create("Text",%hwnd,"",20,550,400,25)
'
b2%=create("Button",%hwnd,"Start",450,550,80,25)
Crear("Tooltip",%hwnd,b2%,"Ab START se en cada erkannten Bewegung una Bild gespeichert..")
'
b1%=create("Button",%hwnd,"Ende",580,550,80,25)
m%=create("Text",%hwnd,"",20,600,400,20)
'
UseFont Arial,12,0,0,0,0
'
'
' Kamera einschalten (escapi.dll)
' messagebox(str$(ESCAPIDLLVersion()),"Escapi Version",0)
AnzCam%=countCaptureDevices()
name$=space$(1024)
' messagebox("Anzahl Kameras gefunden: "+str$(AnzCam%),"Anzahl",0)
getCaptureDeviceName(0,addr(name$),1024)' Kamera Nr. 0
' messagebox(name$,"Kamera gewählt",0)
a%=initCapture(0, addr(capture#))
'
'
'
läuft%=0
ende%=0
Bewegungen%=0
i%=1
Settimer 1000' Sekundentakt
Mensajes del usuario $10' Abbruch übers Windows-Cruz
'
'
whilenot ende%
waitinput
if %UMessage = $10' Abbruch übers Windows-Cruz
ende% = 1
elseif %wmtimer
settext m%,""
if i%>1
' Das vorige Bild se en ZweitesBild# gemerkt
ZweitesBild#=BildBuffer#
endif
if a%>0
b%=doCapture(0)
endif
if b%>0
mientras que isCaptureDone(0)=0
wend
endif
hBMP% = ~CreateBitmap(capture#.mWidth&, capture#.mHeight& , 1 , 32 , BildBuffer#)' Mapa de bits de el Bufferdaten erzeugen
DrawPic hBMP%, 20, 0; 0' Kontrollbild al Bildschirm
tol&=val(gettext$(ed1%))'Toleranz einlesen
if i%>Startverzögerung%' eingestellt son 3 Sekunden, Luego se 1 x pro Sekunde verglichen
' Altes Bild es con neuem verglichen
' prospeed.dll: CompareBytes (B1,B2,A,T)
x&=compareBytes(ZweitesBild#,BildBuffer#,AnzBy&,tol&)
' Auswertung
if x&>val(gettext$(ed2%))' Anzahl Bytes außerhalb el Toleranz
beep
settext m%,"Bewegung erkannt: "+str$(x&)+" Pixel son verändert."
if se ejecuta%=1
inc Bewegungen%
BildBeschriftenSpeichern
endif
endif
endif
sleep 10
~DeleteObject(hBMP%)'Speicher de Mapa de bits liberación
inc i%
elseif clicked(b1%)' Abbruch-Button
ende%=1
elseif clicked(b2%)' Start gedrückt
se ejecuta%=1
settext t%,"Bei cada erkannten Bewegung se una Bild gespeichert."
endif
Wend
liberación
end
'
'
'-------------------------------
proc BildBeschriftenSpeichern
'-------------------------------
' Bild Nr, Datum y Tiempo en el Bild escribir
' Bild speichern
' Nr, Datum y Uhrzeit en el Bild escribir
startpaint hBMP%
drawtext 0, 0, "Nr. "+str$(Bewegungen%) + " " + dt("getDate",0)+" "+dt("getTime", 2)
endpaint
' Bild speichern
savepic pfad$+"\\Bew."+format$("000.",Bewegungen%)+".jpg",hBMP%,75
ENDPROC' BildBeschriftenSpeichern
'
'
'-------------------
proc Freigeben
'-------------------
killtimer
deinitCapture(0)
disponer capture#, Bildbuffer#, ZweitesBild#
freedll dll1&
freedll dll2&
~DeleteObject(hBMP%)
ENDPROC' Freigeben