oft wird die Frage gestellt, wie man ein Dark Frame (Dunkelbild) erzeugt. Meistens wird dann ein Foto mit abgedunkeltem Objektiv erstellt. Aber warum wollen wir nicht auch für diesen Anwendungsfall CHDK benutzen. Man schließt einfach den mechanischen Verschluss am Objektiv der Kamera während der Aufnahme.
Wie geht das nun aber? In CHDK ist eine Möglichkeit eingebaut, per Lua-Skript-Befehl direkt auf kameraeigene Funktionen bzw. Prozeduren zuzugreifen. Diese Möglichkeit stellt auch eine gewisse Gefahr dar. Man sollte sich genau überlegen, was man macht. Mit dieser Methode ist durchaus auch möglich, das kameraeigene Betriebssystem zu zerstören! Aus diesem Grund ist diese Möglichkeit in der Standard-CHDK-Version auch nicht aktiviert.
Erstellt man sich mit der CHDK-Shell aber selbst eine CHDK-Version (selbst compilieren), hat man die Möglichkeit, die beschriebene Funktionalität freizuschalten. Es handelt sich dabei um die Funktion OPT_LUA_CALL_NATIVE, die man aktivieren muss. Auf den CHDK-Wiki-Seiten kann man mehr zu "Call Native Function" nachlesen.
Edit: Die Funktion ist ab Revision 465 CHDK-DE standardmäßig verfügbar!
Steht eine entsprechende CHDK-Version zur Verfügung, kann das nachfolgende Skript benutzt werden. Es wurde von fudgey entwickelt und in diesem Thema im int. Forum beschrieben. Ich habe lediglich Konsolenausgaben und Kommentare auf deutsch angepasst sowie eine Restore-Funktion hinzugefügt.
Das Skript erkennt das Betriebssystem der Kamera und richtet danach die notwendigen Funktionen zum Schließen und Öffnen des mechanischen Verschlusses ein. Sollte eine entsprechende Prozedur nicht verfügbar sein, wird das Skript mit einer Fehlermeldung abbrechen.
Es wird nun ein Foto mit abgeschalteter Rauschreduktion erstellt. Anschließend macht die Kamera ein weiteres Foto - aber mit geschlossenem mechanischen Verschluss - mit den Einstellungen des ersten Fotos. Es wird jeweils ein RAW/DNG und ein JPG erzeugt. Man kann vor dem eigentlichen Skriptablauf die entsprechenden Kameraeinstellungen vornehmen, so z.B. (längere) Verschlusszeiten. Das Skript selbst benötigt keine Parametereinstellungen.
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--[[
@title Foto + Dark-Frame
by fudgey 2010/11/16
zzgl. DE-Anpassung + Restore by msl
--]]
propcase=require("propcase")
-- Speichere Einstellungen RAW + Rauschreduktion
rawmode=get_raw()
dfrmode=get_raw_nr()
-- Verschluss-Kontrolle-Prozedur abhängig vom Kamera-betriebssystem
-- openshutter() und closeshutter() zur Steuerung des mech. Verschlusses
function init()
-- Überprüfung Native-Call-Interface:
if (type(call_event_proc) ~= "function" ) then
error("Dein CHDK unterstützt Native Calls nicht")
end
local bi=get_buildinfo()
if bi.os=="vxworks" then
closeproc="CloseMShutter"
openproc="OpenMShutter"
if (call_event_proc("InitializeAdjustmentFunction") == -1) then
error("InitAdjFunc fehlt")
end
elseif bi.os=="dryos" then
closeproc="CloseMechaShutter"
openproc="OpenMechaShutter"
if (call_event_proc("Mecha.Create") == -1) then
error("Mecha.Create fehlt")
end
else
error("Unbekanntes OS:" .. bi.os)
end
-- mech. Verschluss schließen
function closeshutter()
if (call_event_proc(closeproc) == -1) then
print("closeshutter fehlt")
end
end
-- mech. Verschluss öffnen
function openshutter()
if (call_event_proc(openproc) == -1) then
print("openshutter fehlt")
end
end
-- Ist Aufnahmenahme-Modus Foto aktiviert?
rec,vid=get_mode()
if rec ~= true then
error("Kein Aufnahme-Modus")
elseif vid == true then
error("Video nicht unterstützt")
end
end -- Ende init()
-- Diese Funktion wird auch bei Skriptabbruch aufgerufen.
function restore()
-- Wiederherstellung der Einstellungen für RAW und Rauschreduzierung
set_raw(rawmode)
set_raw_nr(dfrmode)
-- möglicherweise muss der Verschluss bei Skriptabbruch wieder geöffnet werden.
if (type(openshutter) == "function" ) then
openshutter()
end
end
-- Speichere aktuelle Belichtungswerte (nach halbgedrücktem Auslöser und automatischer Berechnung)
function get_exposure_params()
print("Werte speichern")
--tv96=get_tv96() -- Verschlusszeit
--sv96=get_sv96() -- ISO
tv96=get_prop(propcase.TV) -- Verschlusszeit
sv96=get_prop(propcase.SV) -- ISO
if get_nd_present() ~= 1 then -- Av-Wert wenn Kamera Irisblende hat
--av96=get_av96()
av96=get_prop(propcase.AV)
end
end
-- Setze gespeicherte Belichtungswerte (nach halbgedrücktem Auslöser und automatischer Berechnung)
function set_exposure_params()
print("Werte setzen")
--set_tv96_direct(tv96) -- Verschlusszeit
--set_sv96(sv96) -- ISO
set_prop(propcase.TV,tv96) -- Verschlusszeit
set_prop(propcase.SV,sv96) -- ISO
if get_nd_present() ~= 1 then -- Av-Wert wenn Kamera Irisblende hat
--set_av96_direct(av96)
set_prop(propcase.AV,av96)
end
end
function expcontrol_shoot(dark)
-- halber Auslöser und warten Belichtungswerte ermittelt sind
press("shoot_half")
repeat
sleep(1)
until get_shooting() == true
if dark == true then -- wenn Dark-Frame
set_exposure_params() -- Setze gespeicherte Werte
closeshutter() -- Schließe Verschluss
sleep(1) -- möglicherweise nicht notwendig
end
-- Foto machen
press("shoot_full")
sleep(1)
if dark ~= true then -- Foto machen und Werte speichern
get_exposure_params()
end
-- Shooting abschließen
release("shoot_full")
sleep(1)
release("shoot_half")
repeat
sleep(1)
until get_shooting() ~= true
end
-- Skript-Start
init()
set_raw(1) -- aktiviere RAW/DNG
set_raw_nr(1) -- Rauschreduktion (Dark-Frame-Subtraktion) ausschalten
print("Shooting RAW+JPG")
expcontrol_shoot(false) -- Foto machen und Werte speichern
print("Shooting Dark Frame")
expcontrol_shoot(true) -- Dark-Frame mit gespeicherten Werten machen
restore() -- Wiederherstellung von Voreinstellungen
@title Foto + Dark-Frame
by fudgey 2010/11/16
zzgl. DE-Anpassung + Restore by msl
--]]
propcase=require("propcase")
-- Speichere Einstellungen RAW + Rauschreduktion
rawmode=get_raw()
dfrmode=get_raw_nr()
-- Verschluss-Kontrolle-Prozedur abhängig vom Kamera-betriebssystem
-- openshutter() und closeshutter() zur Steuerung des mech. Verschlusses
function init()
-- Überprüfung Native-Call-Interface:
if (type(call_event_proc) ~= "function" ) then
error("Dein CHDK unterstützt Native Calls nicht")
end
local bi=get_buildinfo()
if bi.os=="vxworks" then
closeproc="CloseMShutter"
openproc="OpenMShutter"
if (call_event_proc("InitializeAdjustmentFunction") == -1) then
error("InitAdjFunc fehlt")
end
elseif bi.os=="dryos" then
closeproc="CloseMechaShutter"
openproc="OpenMechaShutter"
if (call_event_proc("Mecha.Create") == -1) then
error("Mecha.Create fehlt")
end
else
error("Unbekanntes OS:" .. bi.os)
end
-- mech. Verschluss schließen
function closeshutter()
if (call_event_proc(closeproc) == -1) then
print("closeshutter fehlt")
end
end
-- mech. Verschluss öffnen
function openshutter()
if (call_event_proc(openproc) == -1) then
print("openshutter fehlt")
end
end
-- Ist Aufnahmenahme-Modus Foto aktiviert?
rec,vid=get_mode()
if rec ~= true then
error("Kein Aufnahme-Modus")
elseif vid == true then
error("Video nicht unterstützt")
end
end -- Ende init()
-- Diese Funktion wird auch bei Skriptabbruch aufgerufen.
function restore()
-- Wiederherstellung der Einstellungen für RAW und Rauschreduzierung
set_raw(rawmode)
set_raw_nr(dfrmode)
-- möglicherweise muss der Verschluss bei Skriptabbruch wieder geöffnet werden.
if (type(openshutter) == "function" ) then
openshutter()
end
end
-- Speichere aktuelle Belichtungswerte (nach halbgedrücktem Auslöser und automatischer Berechnung)
function get_exposure_params()
print("Werte speichern")
--tv96=get_tv96() -- Verschlusszeit
--sv96=get_sv96() -- ISO
tv96=get_prop(propcase.TV) -- Verschlusszeit
sv96=get_prop(propcase.SV) -- ISO
if get_nd_present() ~= 1 then -- Av-Wert wenn Kamera Irisblende hat
--av96=get_av96()
av96=get_prop(propcase.AV)
end
end
-- Setze gespeicherte Belichtungswerte (nach halbgedrücktem Auslöser und automatischer Berechnung)
function set_exposure_params()
print("Werte setzen")
--set_tv96_direct(tv96) -- Verschlusszeit
--set_sv96(sv96) -- ISO
set_prop(propcase.TV,tv96) -- Verschlusszeit
set_prop(propcase.SV,sv96) -- ISO
if get_nd_present() ~= 1 then -- Av-Wert wenn Kamera Irisblende hat
--set_av96_direct(av96)
set_prop(propcase.AV,av96)
end
end
function expcontrol_shoot(dark)
-- halber Auslöser und warten Belichtungswerte ermittelt sind
press("shoot_half")
repeat
sleep(1)
until get_shooting() == true
if dark == true then -- wenn Dark-Frame
set_exposure_params() -- Setze gespeicherte Werte
closeshutter() -- Schließe Verschluss
sleep(1) -- möglicherweise nicht notwendig
end
-- Foto machen
press("shoot_full")
sleep(1)
if dark ~= true then -- Foto machen und Werte speichern
get_exposure_params()
end
-- Shooting abschließen
release("shoot_full")
sleep(1)
release("shoot_half")
repeat
sleep(1)
until get_shooting() ~= true
end
-- Skript-Start
init()
set_raw(1) -- aktiviere RAW/DNG
set_raw_nr(1) -- Rauschreduktion (Dark-Frame-Subtraktion) ausschalten
print("Shooting RAW+JPG")
expcontrol_shoot(false) -- Foto machen und Werte speichern
print("Shooting Dark Frame")
expcontrol_shoot(true) -- Dark-Frame mit gespeicherten Werten machen
restore() -- Wiederherstellung von Voreinstellungen
Erstellt in 0.009 Sekunden, mit GeSHi 1.0.8.9
Das Skript könnte sicherlich ein guter Ansatz sein, Langzeitbelichtungen mit passendem Dark Frame zu organisieren.
Gruß msl