im internationalen CHDK-Forum gab es vor einiger Zeit ein Script, für Tiefenschärfe basierende Fokus-Reihenaufnahme (DOF-based focus stack script NOT based on CHDK DOF calculations).
Damit werden unnötige Aufnahmen bei Fokusreihen in festgelegten festen Schritten verhindert. Es wird der Tiefenschärfe-Bereich als Abstand zum nächsten nötigen Fokus genommen.
Ich habe das Script an die Möglichkeit in CHDK-DE (dank Rudi) angepasst. Es werden die Tiefenschärfewerte von 'get_dofinfo()' verwendet.
(Re: DOF-based focus stack script NOT based on CHDK DOF calculations)
In letzter Zeit habe ich etwas damit getestet und bin recht zufrieden, mit den Ergebnissen.
get_dofinfo.lua
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--[[
@title Focus-Stacker-LUA
]]
uhrzeit =100*get_time("m")+get_time("s")
print_screen (uhrzeit)
press( "shoot_half" )
e = get_dofinfo()
--n = ((d.focal_length*d.focal_length/(2*d.coc*d.aperture*d.focus/10000)-d.focal_length*d.focal_length/(2*d.coc*d.aperture*d.far/10000))*d.focus)/((d.focus-d.focal_length/10000)/10)+1
f = e.focal_length/100
--c = e.coc
--a = e.aperture/100
--d = e.focus
q = 65535
--k = e.focus+e.dof
--p = 0
--n=((100*f*f/(2*c*a*d)-100*f*f/(2*c*a*q))*d)/((10*d-f)/10)+1
--hfg=e.focal_length*e.focal_length/(e.coc*e.aperture)
--n=e.hyp_dist*e.focus/(e.hyp_dist-(e.focus-e.aperture/1000))-e.hyp_dist*e.focus/(e.hyp_dist+(e.focus-e.aperture/1000))
n = ((e.hyp_dist/(2*e.focus)-e.hyp_dist/(2*q))*e.focus)/((10*e.focus-f)/10)+1
---print ( "Manuellen Fokus benutzen!" )
print ( "Startfokus: " .. e.focus )
print ( "Fotos: " .. n+1 .. ", F" .. e.aperture/1000 .. ", " .. e.focal_length/1000 .. "mm" )
print ( " " )
sleep (5000)
print ( "Fokus " .. "Ziel-Fokus " .. "DoF-Ziel" )
shoot ()
--M = 1
--get_prop 133 M
--for j=1,3 do
-- if M = 0 then
-- click ("left")
-- click ("right")
-- click ("set")
-- get_prop 133 M
-- endif
--next j
for i=1,n do
-- print("d.focus: " .. d.focus .. " d.aperture: " .. d.aperture .. " d.dof: " .. d.dof .. " focal_length:" .. d.focal_length .. "Foto: " .. i )
h = e.focus+e.dof
-- k = h
p = e.dof
focus = e.focus
if h > e.focus then
set_focus (h)
shoot ()
end
e = get_dofinfo()
focusdiff = e.focus-focus
if i==n and e.focus_valid==false then
set_focus (65535)
shoot ()
e = get_dofinfo()
-- print ( " " .. focus .. " " .. h-e.focus .. " " .. focusdiff-p)
print ( "" .. focus .. " " .. h .. "-".. e.focus .. " " .. p .. "-" .. focusdiff )
end
-- print ( " " .. focus .. " " .. h-e.focus .. " " .. focusdiff-p)
print ( "" .. focus .. " " .. h .. "-".. e.focus .. " " .. p .. "-" .. focusdiff )
-- print(" e.dof: " .. e.dof .. " e.near:" .. e.near .. " e.coc: " .. e.coc .. " e.hyp_dist" .. e.hyp_dist)
end
cls()
exit_alt ()
sleep(1000)
@title Focus-Stacker-LUA
]]
uhrzeit =100*get_time("m")+get_time("s")
print_screen (uhrzeit)
press( "shoot_half" )
e = get_dofinfo()
--n = ((d.focal_length*d.focal_length/(2*d.coc*d.aperture*d.focus/10000)-d.focal_length*d.focal_length/(2*d.coc*d.aperture*d.far/10000))*d.focus)/((d.focus-d.focal_length/10000)/10)+1
f = e.focal_length/100
--c = e.coc
--a = e.aperture/100
--d = e.focus
q = 65535
--k = e.focus+e.dof
--p = 0
--n=((100*f*f/(2*c*a*d)-100*f*f/(2*c*a*q))*d)/((10*d-f)/10)+1
--hfg=e.focal_length*e.focal_length/(e.coc*e.aperture)
--n=e.hyp_dist*e.focus/(e.hyp_dist-(e.focus-e.aperture/1000))-e.hyp_dist*e.focus/(e.hyp_dist+(e.focus-e.aperture/1000))
n = ((e.hyp_dist/(2*e.focus)-e.hyp_dist/(2*q))*e.focus)/((10*e.focus-f)/10)+1
---print ( "Manuellen Fokus benutzen!" )
print ( "Startfokus: " .. e.focus )
print ( "Fotos: " .. n+1 .. ", F" .. e.aperture/1000 .. ", " .. e.focal_length/1000 .. "mm" )
print ( " " )
sleep (5000)
print ( "Fokus " .. "Ziel-Fokus " .. "DoF-Ziel" )
shoot ()
--M = 1
--get_prop 133 M
--for j=1,3 do
-- if M = 0 then
-- click ("left")
-- click ("right")
-- click ("set")
-- get_prop 133 M
-- endif
--next j
for i=1,n do
-- print("d.focus: " .. d.focus .. " d.aperture: " .. d.aperture .. " d.dof: " .. d.dof .. " focal_length:" .. d.focal_length .. "Foto: " .. i )
h = e.focus+e.dof
-- k = h
p = e.dof
focus = e.focus
if h > e.focus then
set_focus (h)
shoot ()
end
e = get_dofinfo()
focusdiff = e.focus-focus
if i==n and e.focus_valid==false then
set_focus (65535)
shoot ()
e = get_dofinfo()
-- print ( " " .. focus .. " " .. h-e.focus .. " " .. focusdiff-p)
print ( "" .. focus .. " " .. h .. "-".. e.focus .. " " .. p .. "-" .. focusdiff )
end
-- print ( " " .. focus .. " " .. h-e.focus .. " " .. focusdiff-p)
print ( "" .. focus .. " " .. h .. "-".. e.focus .. " " .. p .. "-" .. focusdiff )
-- print(" e.dof: " .. e.dof .. " e.near:" .. e.near .. " e.coc: " .. e.coc .. " e.hyp_dist" .. e.hyp_dist)
end
cls()
exit_alt ()
sleep(1000)
Erstellt in 0.030 Sekunden, mit GeSHi 1.0.8.9
Wie es funktioniert:
- Autofokus auf Motiv -> Wechsel zu Manuellen Fokus mit 'halbgedrückter Auslöser' + 'links'
- Fokus etwas reduzieren mit Drehrad
- starten des Scripte
- Fokus bis hinter das Motiv oder bis unendlichen Fokus aufnehmen lassen
Von den Aufnahmen kann man die schärfste Einzelaufnahme auswählen oder mehrere Aufnahmen für mehr Tiefenschärfe z.B. mit CombineZP zusammenrechnen lassen.
Nun habe ich noch Teile eines anderen Scriptes hinzugenommen (lamp.lua), wodurch man den Bereich (Startfokus bis Endfokus) der Fokusreihenaufnahme festlegen kann.
Einige markierte Abschnitte müssten in dem Script gegebenen Falles auf eure Kamera angepasst werden.
fokus-reihen-dofinfo.lua
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--[[
@title Fokus-Reihen-Tiefenschaerfe-LUA
]]
uhrzeit =100*get_time("m")+get_time("s")
print_screen (uhrzeit)
function button()
key = "null"
wait_click(150)
if is_pressed "left" then
key = "LEFT"
end
if is_pressed "right" then
key = "RIGHT"
end
if is_pressed "up" then
key = "UP"
end
if is_pressed "set" then
key = "SET"
end
if is_pressed "down" then
key = "DOWN"
end
if is_pressed "menu" then
key = "MENU"
end
end
function record()
-- Umschalten zu manuellen Fokus
focus_state = get_prop(6)
if focus_state ~= 4 then -- not in manual, so change it
if focus_state == 0 then -- normal, move 1 right
click("left")
sleep(200)
click("right")
sleep(200)
click("set")
elseif focus_state == 1 then -- macro, move 2 right
click("left")
sleep(200)
click("right")
sleep(200)
click("right")
sleep(200)
click("set")
else -- super macro, move 1 left
click("left")
sleep(200)
click("left")
sleep(200)
click("set")
end
end
--
f = a.focal_length/100
-- Anzahl nötiger Fotos
n = ((a.hyp_dist/(2*a.focus)-a.hyp_dist/(2*e.focus))*a.focus)/((10*a.focus-f)/10)+1
cls()
print ( "Fokus: " .. a.focus .. " - " .. e.focus )
print ( "Fotos: " .. n+1 .. ", F" .. a.aperture/1000 .. ", " .. a.focal_length/1000 .. "mm" )
print ( " " )
sleep (5000)
print ( "Fokus " .. "Ziel-Fokus " .. "DoF-Ziel" )
shoot ()
repeat
h = a.focus+a.dof
p = a.dof
focus = a.focus
-- Foto aufnehmen, wenn Fokus+DOF grösser Fokus
if h > a.focus then
set_focus (h)
shoot ()
end
a = get_dofinfo()
focusdiff = a.focus-focus
-- letzter Fokus 65535, wenn neuer Fokus über 65535 (nicht gesetzt werden konnte)
if focusdiff == 0 then
set_focus (65535)
sleep(200)
shoot ()
a = get_dofinfo()
h = 65535
print ( "" .. focus .. " " .. h .. "-".. a.focus .. " " .. p .. "-" .. focusdiff )
end
if ( a.focus < 65535 and a.focus > 0 ) then
print ( "" .. focus .. " " .. h .. "-".. a.focus .. " " .. p .. "-" .. focusdiff )
end
-- Fotos bis aktueller Fokus grösser Endfokus oder unendlicher Fokus erreicht
until ( a.focus > e.focus or h == 65535 )
sleep(3000)
-- Umschalten zu atomatischen Fokus
--
end
cls()
print("[UP] Fokusende")
print("[DOWN] Fokusanfang")
print("[LEFT] [RIGHT] Modus")
print("[SET] Aufnahme")
print("[MENU] exit")
repeat
button()
if key == "LEFT" then
click("left")
sleep(200)
click("left")
sleep(200)
click("set")
end
if key == "RIGHT" then
click("left")
sleep(200)
click("right")
sleep(200)
click("set")
end
if key == "UP" then
press("shoot_half")
repeat
sleep(1)
until get_shooting() == true
e = get_dofinfo()
-- Endfokus auf 65535 setzen, bei Fokus unendlich
if e.focus<1 then
e.focus=65535
end
release("shoot_half")
print("Fokusende " .. 100*e.focus/65535 .. "%")
end
if key == "DOWN" then
press("shoot_half")
repeat
sleep(1)
until get_shooting() == true
a = get_dofinfo()
release("shoot_half")
print("Fokusanfang " .. 100*a.focus/65535 .. "%")
end
if key == "SET" then
record()
end
until key == "MENU"
@title Fokus-Reihen-Tiefenschaerfe-LUA
]]
uhrzeit =100*get_time("m")+get_time("s")
print_screen (uhrzeit)
function button()
key = "null"
wait_click(150)
if is_pressed "left" then
key = "LEFT"
end
if is_pressed "right" then
key = "RIGHT"
end
if is_pressed "up" then
key = "UP"
end
if is_pressed "set" then
key = "SET"
end
if is_pressed "down" then
key = "DOWN"
end
if is_pressed "menu" then
key = "MENU"
end
end
function record()
-- Umschalten zu manuellen Fokus
focus_state = get_prop(6)
if focus_state ~= 4 then -- not in manual, so change it
if focus_state == 0 then -- normal, move 1 right
click("left")
sleep(200)
click("right")
sleep(200)
click("set")
elseif focus_state == 1 then -- macro, move 2 right
click("left")
sleep(200)
click("right")
sleep(200)
click("right")
sleep(200)
click("set")
else -- super macro, move 1 left
click("left")
sleep(200)
click("left")
sleep(200)
click("set")
end
end
--
f = a.focal_length/100
-- Anzahl nötiger Fotos
n = ((a.hyp_dist/(2*a.focus)-a.hyp_dist/(2*e.focus))*a.focus)/((10*a.focus-f)/10)+1
cls()
print ( "Fokus: " .. a.focus .. " - " .. e.focus )
print ( "Fotos: " .. n+1 .. ", F" .. a.aperture/1000 .. ", " .. a.focal_length/1000 .. "mm" )
print ( " " )
sleep (5000)
print ( "Fokus " .. "Ziel-Fokus " .. "DoF-Ziel" )
shoot ()
repeat
h = a.focus+a.dof
p = a.dof
focus = a.focus
-- Foto aufnehmen, wenn Fokus+DOF grösser Fokus
if h > a.focus then
set_focus (h)
shoot ()
end
a = get_dofinfo()
focusdiff = a.focus-focus
-- letzter Fokus 65535, wenn neuer Fokus über 65535 (nicht gesetzt werden konnte)
if focusdiff == 0 then
set_focus (65535)
sleep(200)
shoot ()
a = get_dofinfo()
h = 65535
print ( "" .. focus .. " " .. h .. "-".. a.focus .. " " .. p .. "-" .. focusdiff )
end
if ( a.focus < 65535 and a.focus > 0 ) then
print ( "" .. focus .. " " .. h .. "-".. a.focus .. " " .. p .. "-" .. focusdiff )
end
-- Fotos bis aktueller Fokus grösser Endfokus oder unendlicher Fokus erreicht
until ( a.focus > e.focus or h == 65535 )
sleep(3000)
-- Umschalten zu atomatischen Fokus
--
end
cls()
print("[UP] Fokusende")
print("[DOWN] Fokusanfang")
print("[LEFT] [RIGHT] Modus")
print("[SET] Aufnahme")
print("[MENU] exit")
repeat
button()
if key == "LEFT" then
click("left")
sleep(200)
click("left")
sleep(200)
click("set")
end
if key == "RIGHT" then
click("left")
sleep(200)
click("right")
sleep(200)
click("set")
end
if key == "UP" then
press("shoot_half")
repeat
sleep(1)
until get_shooting() == true
e = get_dofinfo()
-- Endfokus auf 65535 setzen, bei Fokus unendlich
if e.focus<1 then
e.focus=65535
end
release("shoot_half")
print("Fokusende " .. 100*e.focus/65535 .. "%")
end
if key == "DOWN" then
press("shoot_half")
repeat
sleep(1)
until get_shooting() == true
a = get_dofinfo()
release("shoot_half")
print("Fokusanfang " .. 100*a.focus/65535 .. "%")
end
if key == "SET" then
record()
end
until key == "MENU"
Erstellt in 0.024 Sekunden, mit GeSHi 1.0.8.9
Wie es funktioniert:
- Script Starten
- durch Taste 'UP' Fokusende und Taste 'DOWN' Fokusbegin festlegen
-> Ich nehme vor der Aufnahme noch mit einer Graukarte einen manuellen Weissabgleich vor, die ich mit karierter Rückseite vor das Motiv halte und damit den Startfokus leicht vor das Motiv lege. Das sichert ab, dass man die schärfste Aufnahme der Front des Motivs auf jeden Fall dabei hat.
- durch Taste 'LEFT' oder 'RIGHT' kann der Fokus-Modus (Supermakro, Makro, Normal, Manueller Fokus) geändert werden
-> Der Fokus-Modus kann dadurch für nötigen Fokus-Bereich geändert werden.
- auf LCD steht die Position des gewählten Fokus in Prozent
- der Anfangsfokus sollte zuletzt gewählt werden, da das Script mit dem Fokus beginnt (Kameraposition/-abstand ist genauer)
- mit Taste 'SET' die Aufnahme der Bilder Starten
Wenn der Automatische Fokus von der Kamera mit einem grünen Rechteck auf dem LCD-Display bestätigt wird und der Endfokus grösser als der Anfangsfokus ist, sollte das Script funktionieren.
Wird der Tiefenschärfebereich von 'get_dofinfo()' nicht mit einem Wert berechnet (INF steht im DOF-Rechner, auf dem LCD-Display), kann der nächste Fokusschritt nicht berechnet werden. Bei mir war es meist vor Fokus unendlich. Für den Fall, lasse ich durch das Script ein letztes Bild von Fokus unendlich aufnehmen. Schreibt bitte, in welchen Fällen bei euch Fehler auftauchen.
Probiert es bitte mal aus, ob es bei euch klappt. Es sollte bei Nahaufnahmen, Makro-Aufnahmen mit Nahlinse oder Aufnahmen entfernterer Motive gleichermassen funktionieren.
Wie schon bei dem Script oben beschrieben, könnt ihr von den Aufnahmen die schärfste Einzelaufnahme auswählen oder mehrere Aufnahmen für mehr Tiefenschärfe z.B. mit CombineZP zusammenrechnen lassen.
Über Rücksprache würde ich mich freuen.
aktuelle Beispielbilder von mir:
bis dann,
Nando