[Lua] Script: Fokus-Reihen-Tiefenschärfe

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

Script: Fokus-Reihen-Tiefenschärfe

Beitragvon Nando » 22.09.2011, 14:05

Hallo miteinander,
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)
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"
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:
Bild Bild Bild Bild Bild Bild Bild

bis dann,
Nando
Zuletzt geändert von Nando am 27.09.2011, 23:38, insgesamt 7-mal geändert.
Canon PowerShot SX200 IS 100D (seit Mitte Nov 2009), Canon PowerShot A1000 IS 100b
Nando
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 257
Registriert: 11.11.2009, 15:55

Re: [Script] Fokus-Reihen-Tiefenschärfe

Beitragvon CHDKLover » 22.09.2011, 14:53

Hallo Nando,
sehr schönes Projekt und Ergebnisse! =D>

Ich weiß nicht ob es funktioniert, aber möglicherweise lassen sich alle kameraspezifischen Teile aus deinem Skript streichen.
Das umschalten in den manuellen Fokus und zurück könnte der folgende Befehl bewirken:
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
post_levent_to_ui("PressSw1AndMF")
Erstellt in 0.002 Sekunden, mit GeSHi 1.0.8.9


Das warten auf den Fokus hat msl immer wie folgt realisiert (Die Funktion get_dofinfo() sollte bei halb gedrückter Auslösetaste aufgerufen werden):
Syntax: [ Download ] [ Verstecken ]
Benutze C Syntax Highlighting
press("shoot_half")
repeat
    sleep(10)
until get_shooting() == true

a=get_dofinfo()

release("shoot_half")
Erstellt in 0.002 Sekunden, mit GeSHi 1.0.8.9


CHDKLover
A610 100e CHDK-DE: aktuelle Version
Benutzeravatar
CHDKLover
Super-Mod
Super-Mod
 
Beiträge: 878
Bilder: 8
Registriert: 12.09.2007, 18:25
Wohnort: Dresden
Kamera(s): a610 100e

Re: [Script] Fokus-Reihen-Tiefenschärfe

Beitragvon Nando » 22.09.2011, 15:19

Hallo CHDKLover,
danke für das Lob und deine Unterstützung! :)

Ich habe die Änderungen am Script gerade vorgenommen. Der Befehl 'post_levent_to_ui("PressSw1AndMF")' funktioniert aber irgendwie nicht. Brauche ich besondere Voraussetzungen?
Mein Version von CHDK ist sx200is-100d-1.1.0-full_rev_815.zip.

Woran kann es liegen?

Zurück geändert zu Tasten-Befehlen (click) geht es wieder.

bis dann,
Nando
Canon PowerShot SX200 IS 100D (seit Mitte Nov 2009), Canon PowerShot A1000 IS 100b
Nando
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 257
Registriert: 11.11.2009, 15:55

Re: [Script] Fokus-Reihen-Tiefenschärfe

Beitragvon CHDKLover » 22.09.2011, 15:34

Hallo Nando,
das ist ein sehr systemnaher Befehl, welchen scheinbar nicht jede Kamera unterstützt. Dann bleiben wir lieber bei der Lösung mit der Tastendrucksimulation.
Funktioniert der zweite Vorschlag mit get_shooting()?

CHDKLover
A610 100e CHDK-DE: aktuelle Version
Benutzeravatar
CHDKLover
Super-Mod
Super-Mod
 
Beiträge: 878
Bilder: 8
Registriert: 12.09.2007, 18:25
Wohnort: Dresden
Kamera(s): a610 100e

Re: [Script] Fokus-Reihen-Tiefenschärfe

Beitragvon Nando » 22.09.2011, 15:44

Hallo CHDKLover,
ja, mit der Befehlszeile 'get_shooting()' funktioniert es.

Hat 'set_levent_script_mode(true/false)' einen Einfluss? Ich habe es aber gerade Probiert und es geht auch nicht.
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
...
set_levent_script_mode(true)
post_levent_to_ui("PressSw1AndMF")
set_levent_script_mode(false)
...
Erstellt in 0.003 Sekunden, mit GeSHi 1.0.8.9


Eine Binäre Zahl in Klammern funktioniert auch nicht, oder?
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
...
post_levent_to_ui("Zahlenreihe oder 0xirgendwas")
...
Erstellt in 0.004 Sekunden, mit GeSHi 1.0.8.9


bis dann,
Nando
Canon PowerShot SX200 IS 100D (seit Mitte Nov 2009), Canon PowerShot A1000 IS 100b
Nando
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 257
Registriert: 11.11.2009, 15:55

Re: [Script] Fokus-Reihen-Tiefenschärfe

Beitragvon CHDKLover » 22.09.2011, 16:19

Hallo Nando,
es könnte sein, dass der Aufruf nur im P-Modus funktioniert. Probiere mal bitte folgendes Skript: viewtopic.php?p=21516#p21516

CHDKLover
A610 100e CHDK-DE: aktuelle Version
Benutzeravatar
CHDKLover
Super-Mod
Super-Mod
 
Beiträge: 878
Bilder: 8
Registriert: 12.09.2007, 18:25
Wohnort: Dresden
Kamera(s): a610 100e

Re: [Script] Fokus-Reihen-Tiefenschärfe

Beitragvon Nando » 22.09.2011, 17:17

Hi CHDKLover,
das Script funktioniert leider nicht. Es wird bei 'press("shoot_half")' immer wieder über Autofokus neu fokussiert.
Die Aufnahmen haben einen sich änderten Fokus um einen Punkt, den ich mit der Hand anvisiert habe.

Die anderen Zeilen (get_shooting) habe ich im ersten Beitrag angepasst.
Das Problem mit den Tasten (left, right, set) ist nur, dass in dem eingestellten Fokusbereich (z.B. fern) vielleicht gerade nicht auf das Motiv (nah) fokussiert werden kann.

Das ändere ich als nächstes.
Dann kann man vorher im ausgewählten Fokusbereich schauen, ob die Punkte (Anfangsfokus, Endfokus) fokussiert werden können und dann das Skript starten.

bis dann,
Nando
Canon PowerShot SX200 IS 100D (seit Mitte Nov 2009), Canon PowerShot A1000 IS 100b
Nando
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 257
Registriert: 11.11.2009, 15:55

Re: [Script] Fokus-Reihen-Tiefenschärfe

Beitragvon Nando » 22.09.2011, 19:41

Hallo zusammen,
ich habe das Script fokus-reihen-dofinfo.lua im ersten Beitrag angepasst.

Man kann jetzt im Aufnahme-Modus (Supermakro, Makro oder Normal) die Punkte für Anfangsfokus und Endfokus prüfen. Sollte der Fokus gesetzt werden können, kann man das Script starten.
Die Aufnahmen erfolgen im manuellen Modus. Man kann auch im manuellen Modus das Script starten. Über das Drehrädchen kann man den Fokus verändern und durch Taste 'UP' Fokusende und Taste 'DOWN' Fokusbegin festlegen.

Bei mir funktioniert es bei Tests im Supermakro-, Makro- oder Normal-Modus.
Bei euch müsstet ihr gegebenen Falles den Bereich '-- Umschalten zu manuellen Fokus - kameraspezifisch' ändern.

bis dann,
Nando
Canon PowerShot SX200 IS 100D (seit Mitte Nov 2009), Canon PowerShot A1000 IS 100b
Nando
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 257
Registriert: 11.11.2009, 15:55

Re: Script: Fokus-Reihen-Tiefenschärfe

Beitragvon Nando » 26.09.2011, 10:02

Hallo zusammen,
ich habe gerade mitbekommen, dass die Anzahl notwendiger Bilder falsch berechnet wird. Dadurch stop die Kamera zu früh oder zu spät die Einzelaufnahmen.
Ich versuche herauszufinden, wo der Fehler liegt.

bis dann,
Nando
Canon PowerShot SX200 IS 100D (seit Mitte Nov 2009), Canon PowerShot A1000 IS 100b
Nando
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 257
Registriert: 11.11.2009, 15:55

Re: Script: Fokus-Reihen-Tiefenschärfe

Beitragvon Nando » 27.09.2011, 23:37

Hallo zusammen,
die Berechnung der nötigen Aufnahmen bis zum Endfokus, abhängig von den Fokusschritten mit grösser werdender Tiefenschärfe, scheint zu stimmen.
Ich habe es mit entfernten, nahen und Makro-Motiven durchgetestet.

Probleme tauchen nur auf, wenn der Fokus nicht korrekt gesetzt werden konnte.

Ich habe an den Script fokus-reihen-dofinfo.lua (im ersten Beitrag) noch ein paar Veränderungen vorgenommen.
- 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)

bis dann,
Nando
Canon PowerShot SX200 IS 100D (seit Mitte Nov 2009), Canon PowerShot A1000 IS 100b
Nando
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 257
Registriert: 11.11.2009, 15:55


Zurück zu Code-Ecke

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast