Hier nun die einfachste aber auch langsamste Lösung für eine Bewegungserkennung. Das Skript sollte auf allen Kameras mit aktuellen CHDK laufen. Somit kann sich jeder mal einen Eindruck verschaffen.
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--[[
@title Bewegungserkennung
@param a Spalten
@default a 6
@param b Zeilen
@default b 4
@param c Methode(U=0,Y=1,V=2)
@default c 1
@param d Ablaufzeit
@default d 3
@param e Intervall (mSek.)
@default e 1
@param f Schwellwert(0-255)
@default f 24
@param o Pixel Step
@default o 5
@param p Verzögerung(.1 Sek.)
@default p 0
@param h Startverzögerung (Sek.)
@default h 1
]]
if a<1 then a=1 end
if b<1 then b=1 end
if c<0 then c=0 end
if d<1 then d=1 end
if e<1 then e=1 end
if f<0 then f=0 end
if o<0 then o=0 end
if o>10 then o=10 end
if h<0 then h=0 end
Spalten = a -- Anzahl Spalten Erkennungszellen
Zeilen = b -- Anzahl Zeilen Erkennungszellen
Messmethode = c -- 0=U-Farbanteil des YUV-Farbmodells
-- 1=Y Helligkeitswert des YUV-Farbmodells
-- 2=V-Farbanteil des YUV-Farbmodells
-- 3=R Rotanteil des RGB-Farbmodells
-- 4=G Grünanteile des RGB-Farbmodells
-- 5=B Blauanteil des RGB-Farbmodells
Zeit = d*1000 -- Ablaufzeit, danach wird nächste Skriptzeile abgearbeitet.
Intervall = e -- Vergleichsintervall in ms
Schwellwert = f -- Schwellwert 0 - 255
Zellanzeige = 1 -- 1=an 0=aus
leer = 0 -- wird unter Lua nicht benötigt
Maskierung = 0 -- 1=an 0=aus
Mask_links = 1 -- Maskierung linke Spalte
Mask_oben = 1 -- Maskierung obere Zeile
Mask_links = a -- Maskierung rechte Spalte
Mask_unten = b -- Maskierung untere Zeile
Parameter = 1 -- 0=ohne Aktion
-- 1=unmittelbare Auslösung
-- 2=Log-Datei schreiben
-- 4=Abzug des Live-Bilds aus RAM in Datei
-- 8=bei Auslösung wird die Auslösung zusätzlich gehalten
-- Abschluss mit release "shoot_full"
Pixel_Step = o -- Pixel-Scritte der Erkennung
Startverzug = p*100 -- Startverzögerung in ms
sleep(h*1000)
repeat
Erkennung = 0
Erkennung = md_detect_motion(Spalten, Zeilen, Messmethode, Zeit, Intervall,
Schwellwert, Zellanzeige, leer, Maskierung,
Mask_links, Mask_oben, Mask_rechts, Mask_unten,
Parameter, Pixel_Step, Startverzug)
-- Erkennung ist Anzahl der Zellen, in der eine Bewegung erkannt wurde.
-- Ist diese >0 erfolgte eine Bewegungserkennung.
until false
@title Bewegungserkennung
@param a Spalten
@default a 6
@param b Zeilen
@default b 4
@param c Methode(U=0,Y=1,V=2)
@default c 1
@param d Ablaufzeit
@default d 3
@param e Intervall (mSek.)
@default e 1
@param f Schwellwert(0-255)
@default f 24
@param o Pixel Step
@default o 5
@param p Verzögerung(.1 Sek.)
@default p 0
@param h Startverzögerung (Sek.)
@default h 1
]]
if a<1 then a=1 end
if b<1 then b=1 end
if c<0 then c=0 end
if d<1 then d=1 end
if e<1 then e=1 end
if f<0 then f=0 end
if o<0 then o=0 end
if o>10 then o=10 end
if h<0 then h=0 end
Spalten = a -- Anzahl Spalten Erkennungszellen
Zeilen = b -- Anzahl Zeilen Erkennungszellen
Messmethode = c -- 0=U-Farbanteil des YUV-Farbmodells
-- 1=Y Helligkeitswert des YUV-Farbmodells
-- 2=V-Farbanteil des YUV-Farbmodells
-- 3=R Rotanteil des RGB-Farbmodells
-- 4=G Grünanteile des RGB-Farbmodells
-- 5=B Blauanteil des RGB-Farbmodells
Zeit = d*1000 -- Ablaufzeit, danach wird nächste Skriptzeile abgearbeitet.
Intervall = e -- Vergleichsintervall in ms
Schwellwert = f -- Schwellwert 0 - 255
Zellanzeige = 1 -- 1=an 0=aus
leer = 0 -- wird unter Lua nicht benötigt
Maskierung = 0 -- 1=an 0=aus
Mask_links = 1 -- Maskierung linke Spalte
Mask_oben = 1 -- Maskierung obere Zeile
Mask_links = a -- Maskierung rechte Spalte
Mask_unten = b -- Maskierung untere Zeile
Parameter = 1 -- 0=ohne Aktion
-- 1=unmittelbare Auslösung
-- 2=Log-Datei schreiben
-- 4=Abzug des Live-Bilds aus RAM in Datei
-- 8=bei Auslösung wird die Auslösung zusätzlich gehalten
-- Abschluss mit release "shoot_full"
Pixel_Step = o -- Pixel-Scritte der Erkennung
Startverzug = p*100 -- Startverzögerung in ms
sleep(h*1000)
repeat
Erkennung = 0
Erkennung = md_detect_motion(Spalten, Zeilen, Messmethode, Zeit, Intervall,
Schwellwert, Zellanzeige, leer, Maskierung,
Mask_links, Mask_oben, Mask_rechts, Mask_unten,
Parameter, Pixel_Step, Startverzug)
-- Erkennung ist Anzahl der Zellen, in der eine Bewegung erkannt wurde.
-- Ist diese >0 erfolgte eine Bewegungserkennung.
until false
Erstellt in 0.013 Sekunden, mit GeSHi 1.0.8.9
Zur Wirkungsweise der Parameter findet ihr umfangreiches Material hier Forum. Die Geschwindigkeit ist wirklich vom eigentlichen Shooting abhängig. Dieses gilt es zu optimieren. Dazu gibt es schon einige uBasic-Skripte, die aber nicht alle für alle Kameras funktionieren.
Die eigentliche Bewegungserkennung funktioniert sehr schnell. Dazu habe ich diese Funktion mal etwas anders eingesetzt. Ich benutze sie im Stoppuhr-Skript von Kettmeister als Stopp-Auslöser. Man könnte so theoretisch einen Zieldurchlauf zeitlich und im Bild festhalten. Im Skript habe ich das Shooting weggelassen, damit man sieht, wie schnell die Bewegungserkennung reagiert.
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--[[
@title stopwatch
@param a split time (1)/lap time(0)
@default a 1
]]
function format_nn(n)
r=tostring(n)
if n<10 then r= "0" .. n end
return r
end
function to_time()
if(a==0) then
ztime=(get_tick_count()-count_a)
count_a=get_tick_count()
else
ztime=(get_tick_count()-count_a)
end
h = (ztime /10) % 100
s = (ztime /1000) % 60
m = (ztime /1000/ 60) % 60
hh = (ztime /1000/ 3600) % 24
print("> "..format_nn(hh)..":"..format_nn(m)..":"..format_nn(s)..":"..format_nn(h))
end
--start script
if (a~=1 and a~=0) then a=1 end
i=1
ztime=0
count_a=0
cls()
print("[SET] start")
while(i==1) do
wait_click(0)
if is_pressed "set" then
count_a=get_tick_count()
i=0
end
end
i=1
while(i==1) do
cls()
print("[MD] time")
print()
print("started")
repeat
Erkennung = 0
Erkennung = md_detect_motion(6, 4, 1, 5000, 1, 24, 0, 0, 0, 1, 1, 6, 4, 0, 5, 0)
until Erkennung > 0
cls()
print("[SET] time [MENU] end")
print()
to_time()
wait_click(0)
if is_pressed "menu" then
cls()
to_time()
print("finished")
sleep(3000)
i=0
end
end
@title stopwatch
@param a split time (1)/lap time(0)
@default a 1
]]
function format_nn(n)
r=tostring(n)
if n<10 then r= "0" .. n end
return r
end
function to_time()
if(a==0) then
ztime=(get_tick_count()-count_a)
count_a=get_tick_count()
else
ztime=(get_tick_count()-count_a)
end
h = (ztime /10) % 100
s = (ztime /1000) % 60
m = (ztime /1000/ 60) % 60
hh = (ztime /1000/ 3600) % 24
print("> "..format_nn(hh)..":"..format_nn(m)..":"..format_nn(s)..":"..format_nn(h))
end
--start script
if (a~=1 and a~=0) then a=1 end
i=1
ztime=0
count_a=0
cls()
print("[SET] start")
while(i==1) do
wait_click(0)
if is_pressed "set" then
count_a=get_tick_count()
i=0
end
end
i=1
while(i==1) do
cls()
print("[MD] time")
print()
print("started")
repeat
Erkennung = 0
Erkennung = md_detect_motion(6, 4, 1, 5000, 1, 24, 0, 0, 0, 1, 1, 6, 4, 0, 5, 0)
until Erkennung > 0
cls()
print("[SET] time [MENU] end")
print()
to_time()
wait_click(0)
if is_pressed "menu" then
cls()
to_time()
print("finished")
sleep(3000)
i=0
end
end
Erstellt in 0.009 Sekunden, mit GeSHi 1.0.8.9
Sicherlich lassen sich unter Lua die Möglichkeiten der Bewegungserkennung massiv erweitern. Schade, dass sich unser Motion-Detection-Guru Chiptune seit langem nicht mehr zu Wort gemeldet hat. Er hätte da bestimmt ein paar gute Ideen. Aber vielleicht gibt es ja noch andere, die kreativ beim Skripten aktiv werden wollen.
Gruß msl