CHDK inside

  • Schrift vergrößern
  • Standard-Schriftgröße
  • Schriftgröße verkleinern
Start CHDK inside Bedienung Bewegungserkennung


Bewegungserkennung

Drucken PDF

Einführung

Eines der schönsten CHDK-Features ist die Fähigkeit, Bewegungen zu erkennen, auszuwerten und bei Bedarf auszulösen. Die Bewegungserkennung wird per Skript organsisert. Es gibt vier spezielle Skriptbefehle, die bei geschickter Benutzung viele Möglichkeiten bieten. Besonders beliebte Anwendungen der Bewegungserkennung sind das Einfangen von Gewitterblitzen, Tieren  oder einem Feuerwerk.

Die Daten zur Auswertung kommen dabei nicht direkt vom Bildsensor. Das CHDK bedient sich hier dem kleinen Pufferspeicher für das Kameradisplay. Die Reduktion der Auflösung bedeutet aber auch einen Verlust an Details.

Skriptfunktionen

Um die CHDK-Bewegungserkennung zu nutzen, muss ein entsprechendes Skript auf der Kamera verfügbar sein. Zwei einfache Skripte in uBASIC und LUA befinden sich am Ende dieser Seite.

Der uBASIC- und Lua-Hauptbefehl für die Bewegungserkennung md_detect_motion hat 16 Eingabeparameter. Der Einfachheit halber werden diese mit a bis p bezeichnet. Neben diesem Hauptbefehl gibt es noch zwei Analysefunktionen und eine Testfunktion.

Parameter der Bewegungerkennung

Zonen: Das Display der Kamera wird in einem Raster von Zonen unterteilt. Diese Zonen werden verwendet, um festzulegen, wie eine Bewegung erkannt wird. Parameter a & b definieren die Zonen als Raster. Bei diesen Zonen sprechen wir auch von Zellen.

Ausschlusszonen: Die Bewegungserkennung kann einen Teil des Displays ignorieren. Dies ist nützlich, wenn die Bewegung nur in einem bestimmten Bereich erkannt werden soll.  Parameter i legt die Art der Ausschlusszone fest. j, k, l & m definieren Anfangs- und Endkoordinaten.

Erkennungsmodi: Der Parameter c legt fest, welcher Farbkanal eines Farbmodells für die Auswertung relevant ist. Dabei kann zwischen 2 Farbmodellen ausgewählt werden, YUV (c=0,1,2) und RGB (c=3,4,5).

Das YUV-Farbmodell ist nur sehr schwer zu erklären. Es verwendet zur Darstellung der Farbinformation zwei Komponenten, Luminanz und Chrominanz. Da die Kamera intern mit diesem Farbmodell arbeitet, ist die Auswertung etwas schneller. Der Farbkanal Y lässt sich besonders gut nutzen, um Helligkeitsunterschiede (farbunabhänig) festzustellen. Der Farbkanal U ist auf blau und grün spezialisiert, der Farbkanal V auf rot und gelb.

Bei dem RGB-Farbmodell hingegen setzt eine Farbe mit Hilfe der additiven Farbmischung aus einem Rotanteil, einem Grünanteil und einem Blauanteil zusammen. Somit lassen sich hiermit besonders gut rote (c=3), grüne (c=4) und blaue (c=5) Körper erkennen. Aber zum Beispiel auch gelbe Körper kann man erkennen, da gelb im RGB-Farbraum aus Rot und Grün gemischt wird. Somit ist es egal, ob man c=3 oder 4 einstellt.

Empfindlichkeit: Diese Einstellungen bestimmen, wie viele Änderungen notwendig sind, damit Bewegungen erkannt werden. Es gibt eine Schwellwerteinstellung (Parameter f) und ein Pixel-Schritt-System (Parameter o).

Sonstiges: Die anderen Parameter stehen zur Verfügung, um zu bestimmen, wie die Bewegungserkennung verarbeitet werden soll. Man kann einstellen, wie lange die Funktion Bewegungen erkennen soll, wie lange die Funktion vor der ersten Bewegungserkennung warten soll oder wie oft auf eine Bewegung geprüft werden soll.

Die Funktion md_detect_motion

Der Befehl md_detect_motion ist das Kernstück der Bewegungserkennung. Sowohl uBASIC als auch Lua unterstützen diesen Befehl. Es gibt aber kleine Unterschiede.

uBASIC:

md_detect_motion a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p

Lua:

Zonen = md_detect_motion (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)

Hinweis: Parameter i bis p sind optional. Wenn man einen dieser Parameter benutzt, müssen die anderen auch angegeben werden.

a: Definiert die Anzahl der Spalten, die den Bildschirm in Zellen aufteilen.

b: Definiert die Anzahl der Zeilen, die den Bildschirm in Zellen aufteilen.

Anmerkung: wenn a oder b kleiner als Null sind oder wenn die Gesamtzahl der Zellen größer als 1024 ist, wird der Standardwert von 3 x 3 verwendet.

c: Messmethode

0=U grün/blauer Farbanteil des YUV-Farbmodells
1=Y Helligkeitswert des YUV-Farbmodells
2=V gelb/roter Farbanteil des YUV-Farbmodells
3=R Rotanteil des RGB-Farbmodells
4=G Grünanteile des RGB-Farbmodells
5=B Blauanteil des RGB-Farbmodells

Als Standard wird 1 verwendet.

d: die Zeit in Millisekunden, für die md_detect_motion auftretende Bewegungen erkennen soll. Dieser Parameter ist nützlich, wenn in regelmäßigen Abständen  andere Skript-Befehle ausgeführt werden sollen.

e: Vergleichsintervall. Die Zeitverzögerung in Millisekunden, in der nach einer Änderung in einer Zelle geprüft werden soll. Dieser Parameter ist entscheidend für die Erkennungsgeschwindigkeit.

f: Schwellwert für den gewünschten Modus, je höher desto unempfindlicher. Typische Werte können sein: 10 = Blitz, 12 = Sonne, 24 = bewölkt, 36 = Dämmerung

g: Zelleinteilung - legt fest, ob ein Gitter angezeigt wird. Neuere Versionen von CHDK (Version 1.2.0 oder höher) können auch Veränderungen als Zahlenwerte je Zelle anzeigen. (0 = kein Zellengitter, 1 = Zellengitter, 2 = Zahlenwerte, 3 = Zellengitter+Zahlenwerte)

h: in uBASIC gibt diese Variable die Anzahl der Zellen zurück, in der eine Bewegung erkannt wurde.  Diese Variable wird in der LUA-Version ignoriert.

i: legt fest, ob Zellbereiche ausgeschlossen werden sollen. Optionen: 0=aus, 1=einzuschließende Zellen, 2=auszuschließende Zellen

j, k, l, m: Definition der Zellbereiche, die entsprechend Parameter i ausgeschlossen werden.

n: Reaktionsparameter - Was soll nach einer Bewegungdserkennung gemacht werden?

0 (0000 binär) = Bewegungserkennung ohne Aktion
1 (0001 binär) = unmittelbare Auslösung
2 (0010 binär) = Log-Datei schreiben
4 (0100 binär) = Dump des Live-Bildes aus dem RAM in eine Datei schreiben
8 (1000 binär) = bei Auslösung wird die Auslösung zusätzlich gehalten und muss mit einem nachfolgenden Skriptbefehl release "shoot_full" abgeschlossen werden.

Die Befehle können über binär ODER verknüpft werden, Beispiel:
0001 binär OR 0010 binär -> 0011 binär = 3 dezimal = unmittelbare Auslösung und Schreiben der Log-Datei
0001 binär OR 0010 binär OR 1000 binär-> 1011 binär = 11 dezimal = unmittelbare Auslösung mit Halten
und Schreiben der Log-Datei

Hinweis: Die Verwendung von 2 und 4 erfordert eine benutzerdefinierte CHDK-Version mit OPT_MD_DEBUG = 1 in Makefile.inc. Diese Funktion wurde aus den  Standard-CHDK-Versionen entfernt, um Speicherplatz zu sparen.

o: bestimmt die Pixel-Schrittweite. Die größte Genauigkeit der Bewegungerkennung erzielt man, wenn jedes Pixel abgetastet wird. Je größer die Schrittweite ist, desto schneller kann die Bewegungserkennung reagieren.

p: ermöglicht eine Verzögerung von "p" Millisekunden, bevor die Funktion gestartet wird.

Die Funktion: md_get_cell_diff

Diese Funktion ist für die fortgeschrittene Analyse einer Szeneänderung gedacht. Sie kann nur in Verbindung mit md_detect_motion eingesetzt werden. Es wird die Luminanz ausgewertet.

uBASIC:
x = md_get_cell_diff v w

Lua:
x = md_get_cell_diff (v, w)

v: Spalte der Zelle zu überprüfen (1. Spalte = 1)

w: Zeile der Zelle überprüft werden (1. Zeile = 1)

x: Bereich von -255 bis 255. Es wird der Luminanzunterschied der letzten beiden Messungen ermittelt.

Die Funktion md_get_cell_val

Diese Funktion ist für die fortgeschrittene Analyse einer Szeneänderung gedacht. Sie kann nur in Verbindung mit md_detect_motion eingesetzt werden. Es wird die Helligkeit ausgewertet.

uBASIC:

x = md_get_cell_val v w

Lua:

x = md_get_cell_diff (v, w)

v: Spalte der Zelle zu überprüfen (1. Spalte = 1)

w: Zeile der Zelle überprüft werden (1. Zeile = 1)

x: Bereich von -255 bis 255. Es wird der Helligkeitsunterschied der letzten beiden Messungen ermittelt.

Hinweis: Nur in CHDK Version 1.2.0 oder höher verfügbar.

Die Funktion md_af_on_time

Mit diese Funktion kann die Bewegungserkennungsfunktion getestet werden. Dazu wird die AF-LED periodisch für eine im Skriptbefehl definierte Zeit aktiviert. Auf dem Kamerabildschirm werden diverse Werte zur Reaktionszeit ausgegeben.

uBASIC:

md_af_on_time d t

Lua:

md_af_on_time (d, t)

d: Verzögerung in 10ms-Schritten,  bevor der test gestartet wird.

t: Zeit in 10ms-Schritten, wie lange die AF-LED leuchten soll.

Mit md_af_on_time (0,0) wird der MD-AF-LED-Testmodus deaktiviert.

Hinweis: Nur in CHDK Version 1.2.0 oder höher und nicht für alle Kameras verfügbar.

Debugging

n = 2 (Debug-Modus): Die Debug-Funktion wurde aus dem Standard-CHDK entfernt . Zur Nutzung der Funktion muss diese mit OPT_MD_DEBUG=1 in makefile.inc zum Compilieren aktiviert werden. Mit der CHDK-Shell kann diese Option beim Compilieren aktiviert werden. Es wird eine Logdatei im Hauptverzeichnis der Speicherkarte mit dem Namen MD_INFO.TXT angelegt. Sie wird nur beim Timeout der MD-Funktion geschrieben.

Beispielskripte

uBASIC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@title Motion Detect uBASIC Script
 
a=6
b=6
c=1
d=300000
e=200
f=5
g=1
h=0
i=0
j=0
k=0
l=0
m=0
n=0
o=2
p=0
 
do 
 
  md_detect_motion a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p
 
  if( h > 0 ) then
        shoot
  endif
 
until (0)
 
end

Lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
--[[
@title Motion Detect Lua Script
]]
 
a=6         -- columns to split picture into 
b=6         -- rows to split picture into 
c=1         -- measure mode (Y,U,V R,G,B) <96> U=0, Y=1, V=2, R=3, G=4, B=5
d=300000    -- timeout (mSec) 
e=200       -- comparison interval (msec) 
f=5         -- threshold (difference in cell to trigger detection)
g=1         -- draw  grid (0=no, 1=yes)   
h=0         -- not used in LUA 
i=0         -- region masking mode: 0=no regions, 1=include, 2=exclude
j=0         --      first column
k=0         --      first row
l=0         --      last column
m=0         --      last row
n=0         -- optional parameters  (1=shoot immediate)
o=2         -- pixel step
p=0         -- triggering delay (msec) 
 
repeat
 
   zones = md_detect_motion( a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)
 
   if( zones > 0 ) then
        shoot()
   end
 
until (false)

 

 

Anmeldung

Wer ist online?

Wir haben 52 Gäste online