[Lua] Grundlage Bewegungserkennung

CHDK-Skripte, CHDK-Entwicklung, PC-Zusatzprogramme, Informationen für Tüftler

Grundlage Bewegungserkennung

Beitragvon msl » 10.11.2008, 16:48

Die Bewegungserkennung funktioniert natürlich auch unter Lua. :shock:

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
 
Erstellt in 0.012 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
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
Dateianhänge
md_uni.lua
einfachste Bewegungserkennung
(2.31 KiB) 2256-mal heruntergeladen
md_stop.lua
StoppUhr mit Bewegungserkennung
(1.16 KiB) 1164-mal heruntergeladen
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Beitragvon gehtnix » 07.02.2009, 18:17

Hi msl,

auf meiner A610 stürtzt die stopwatch mit Fehler

:52: attempt to compare with nil
Press shutter to close

ab und mit Getöse geht der Strom weg.

MD_uni schießt nach der erstmaligen Auslösung munter weiter. Stop nur mit Alt oder Shutter.

Bevor ich jetzt frage ob das so gehört, habe ich mit meinem MD_Six gestern auch meine Probleme gehabt, unerklärlich hängengeblieben, dann war auf einmal RAW eingeschaltet und andere Merkwürdigkeiten.
Habe alle \DATA gelöscht, alle Scripte runter und wieder rauf kopiert.
Jetzt geht mein MD-Six wieder, weiß aber partout nicht wieso und warum.

Daher eine ganz andere Frage, hat sich in der letzten Zeit irgendwetwas am MD-Befehlssatz geändert?

Und noch ein Frage: Die Dateinamen der gespeicherten Parameter werden aus dem Scriptdateinemen erstellt? Nicht aus dem Titelname?

gruß gehtnix
Benutzeravatar
gehtnix
CHDK-Legende
CHDK-Legende
 
Beiträge: 2406
Bilder: 8
Registriert: 17.04.2008, 12:42
Wohnort: München
Kamera(s): A610 100e+f + IXUS990 IS

Beitragvon Kunibertus » 13.02.2009, 10:28

Grüße an alle!

Dank an msl.

In meiner A 590 IS läuft die Bewegungserkennung prima.
Handelt sich um die "Einfache" Bewegungserkennung lua.
Hab diese in die Ordner Lua und skript gespeichert, muß bestimmt nur in einen der beiden gell.
Die txt skripte wollen immer nicht reagieren. Blinken zwar mal die beiden LED ein anderen mal
wird "gestartet" angezeigt aber es läuft nicht.

Mit der lua md-uni.... irgendwas schießt die 590 los was ihr vor die Linse kommt.
Habe bisher keine Änderungen gemacht vonwegen vezögerung und so.

Das nur mal zur Info damit Du erfährst das wieder was geklappt hat.

Grüße auch
Nix SX 1 IS. A 590 ISses jetze. Aber nicht mehr lange. Hoffendlich bald A1400.
Kunibertus
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 41
Registriert: 29.01.2009, 00:17

Beitragvon hothouse » 14.03.2009, 00:40

Bei der Ixus 80 läuft das Programm nur so lange wie die einstellung im Stromsparmenue also maximal 3 min.
Was sehr schade ist, den somit ist das Programm zumindest auf der Ixus 80 nicht wirklich zu gebrauchen.
hothouse
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 4
Registriert: 13.03.2009, 11:11

Beitragvon fe50 » 14.03.2009, 01:08

hothouse hat geschrieben:Bei der Ixus 80 läuft das Programm nur so lange wie die einstellung im Stromsparmenue also maximal 3 min.
Was sehr schade ist, den somit ist das Programm zumindest auf der Ixus 80 nicht wirklich zu gebrauchen.


Hi hothouse,

die Lösung Deines "Problems" ist hier: CHDK-Handbuch: Stromsparmodus...
◄"The grass was greener, The light was brighter"►  ◄fe50 home►  ◄TRAIL-Magazin►  ◄RTFM !►
Benutzeravatar
fe50
CHDK-Legende
CHDK-Legende
 
Beiträge: 1106
Registriert: 25.04.2008, 14:28
Wohnort: B'Württemberg
Kamera(s): Ixus50 101b, Ixus860 100c, SX10 101a

Beitragvon jensichen » 29.11.2009, 16:36

Servus,

ich möchte die Anzahl der Foto´s begrenzen ( ca. 10 Stück ) ,
Wie kann man das festlegen ?
jensichen
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 2
Registriert: 29.11.2009, 12:34

Beitragvon msl » 29.11.2009, 17:00

Bild

Hallo,

wäre nett, wenn Du uns verraten könntest, mit welcher Kamera Du arbeitest. Fülle dazu Deine Signatur aus.

Baue einfach eine Zählschleife in das Skript ein. Wenn 10 erreicht ist soll die Schleife beendet werden.

Gruß msl
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Beitragvon jensichen » 30.11.2009, 18:28

Hallo msl,

ich hab´s gerade in die Signatur eingetragen wird aber irgendwie ( noch ) nicht angezeigt.

Es ist eine Ixus 50. Eine Zählschleife ist eine gute Idee, ich wollte dies anpassen und einfügen :
____________________________

@param e Erste Zeile des Fensters
rem s Wert: D=Direktauslösung, oN=Auslösung ohne Neufokussierung, S=Serienauslösung ohne Neufokussierung
@param s Auslöseart (0=D/1=oN/2=S)
@default s 1

if s<0>2 then let s=2
get_prop 0 x
if x=18 then let s=3
get_prop 6 y
if s<>2 and y=1 then
let s=2
else if s=2 and y<>1 then
let s=0
endif
if s=0 then let g=1 else let g=0
m=m*100
o=o*1000
print "Beenden: Auslöser drücken"
while 1
if x<>18 and u<>0 then gosub "fokussieren"
md_detect_motion b, a, j, o, l, r, c, t, d, h, e, i, f, g, k, m
if x<>18 and u<0>0 then print t, " Felder erkannt"
if t=0 then gosub "wecken"
if t>0 and u=0 and s=2 then gosub "fokussieren"
if t>0 and s=1 then click "shoot_full"
if t>0 and s=2 then gosub "Serienaufnahme"
if t>0 and s=3 then gosub "Filmaufnahme"
if t>0 and x<>18 then
do
get_prop 205 p
until p<>1
let t=0
endif
wend

:fokussieren
press "shoot_half"
do
get_prop 205 p
until p=1
return

:Serienaufnahme
press "shoot_full"
sleep n*1000
release "shoot_full"
return

:Filmaufnahme
click "shoot_full"
sleep n*1000
click "shoot_full"
return

:wecken
release "shoot_half"
if x<>18 and u=0 then
click "set"
click "set"
endif
return
____________________________

Aber wahrscheinlich passt das mit dem Kameraprozessor nicht zusammen und mit meinem
Programmierverstand bekomme ich das nicht hin.

Wäre Supi, wenn mir jemand helfen könnte.

Danke schonmal...

Jens
Ixus50
jensichen
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 2
Registriert: 29.11.2009, 12:34

Bewegungserkennung Lua

Beitragvon naddel » 30.11.2009, 21:10

Hallo Jens,

Da hast Du dich wohl vertan.
Hier geht es um Lua.
Was Du da eingestellt hast ist Basic, da kann ich Dir nicht viel weiter helfen.
Wenn Du dann noch alle Parameter-Variablen raus löschst, die Du später benutzt wird das nichts.
Beziehe Dich doch bitte auf das in diesem Beitrag vorgestellte Skript.
Und beim nächsten Post markiere bitte den Code mit dem Schalter Syntax,
sonst steigt man da nicht durch.

Gruß naddel
S2 1.00f mit aktueller DE Version
Benutzeravatar
naddel
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 156
Registriert: 26.01.2009, 19:42
Kamera(s): G3 s2 ixusii


Zurück zu Code-Ecke

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 16 Gäste

cron