Jedenfalls habe ich dabei festgestellt, dass die Funktionen get_dof und get_hyp_dist nur unter ganz bestimmten Voraussetzungen den richtigen Wert zurückliefern.
Um herauszufinden, welche Voraussetzungen das sind, habe ich ein Skript geschrieben, das nacheinander die unten aufgelisteten Aktionen ausführt und dann jeweils die Werte von get_dof und get_hyp_dist ausliest:
1. Nach set_focus, dann shoot_half.
2. Nach set_focus, shoot_half und dann warten bis get_shooting=1 ist.
3. Direkt nach set_focus.
4. Nach 4. mit zusätzlicher Wartezeit 1 s.
5. Nach set_focus, dann shoot.
6. Nach 5. mit zusätzlicher Wartezeit 1 s.
Um prüfen zu können, ob die ausgegebenen Werte stimmen, wird mit den set_focus-Kommandos jeweils abwechselnd 100 mm und 500 mm eingestellt. Das Ganze wird einmal mit Blende 2,8 und einmal mit Blende 8,0 ausgeführt. Die Brennweite war jeweils auf 5,8 mm (max. Weitwinkel) eingestellt. Das entspricht in KB 35 mm, aber aus optischen Gründen ist DOF deutlich größer als bei 35 mm KB und HYP entsprechend geringer.
Der betreffende Teil des Skripts sieht so aus - die hier nicht gezeigte Funktion set_focusmode stellt den übergebenen Modus (normal, macro, manual, supermacro) ein:
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
set_focusmode("manual")
cls()
print_screen(1) -- log to file
apertures={"2,8", "8,0"} -- f values to be tested
foc_val={{500, 100}, {100, 500}} -- focus settings to be tested
for k, aperture in pairs(apertures) do -- for all f values
if aperture == "2,8" -- camera must be in AV mode
then set_user_av96(9*32) else set_user_av96(18*32) end
print("A=",aperture)
for i=1, 2 do -- both sets of focal distances
set_focus(foc_val[i][1])
press "shoot_half"
dof = get_dof() hyp = get_hyp_dist()
print("shoot_half ", foc_val[i][1], "mm D=",dof, "H=",hyp)
set_focus(foc_val[i][2])
press "shoot_half"
repeat until get_shooting() == true -- wait until finished
dof = get_dof() hyp = get_hyp_dist()
print("shoot_half/ready ", foc_val[i][2], "mm D=",dof, "H=",hyp)
sleep(1000)
set_focus(foc_val[i][1])
dof = get_dof() hyp = get_hyp_dist()
print("set_focus ", foc_val[i][1], "mm D=",dof, "H=",hyp)
sleep(1000)
dof = get_dof() hyp = get_hyp_dist()
print("set_focus/sleep ", foc_val[i][1], "mm D=",dof, "H=",hyp)
sleep(1000)
set_focus(foc_val[i][2])
shoot()
dof = get_dof() hyp = get_hyp_dist()
print("set_focus/shoot ", foc_val[i][2], "mm D=",dof, "H=",hyp)
sleep(1000)
dof = get_dof() hyp = get_hyp_dist()
print("set_f/shoot/sleep", foc_val[i][2], "mm D=",dof, "H=",hyp)
sleep(1000)
end
end
set_focusmode("normal") -- reset mode for normal operation
cls()
print_screen(1) -- log to file
apertures={"2,8", "8,0"} -- f values to be tested
foc_val={{500, 100}, {100, 500}} -- focus settings to be tested
for k, aperture in pairs(apertures) do -- for all f values
if aperture == "2,8" -- camera must be in AV mode
then set_user_av96(9*32) else set_user_av96(18*32) end
print("A=",aperture)
for i=1, 2 do -- both sets of focal distances
set_focus(foc_val[i][1])
press "shoot_half"
dof = get_dof() hyp = get_hyp_dist()
print("shoot_half ", foc_val[i][1], "mm D=",dof, "H=",hyp)
set_focus(foc_val[i][2])
press "shoot_half"
repeat until get_shooting() == true -- wait until finished
dof = get_dof() hyp = get_hyp_dist()
print("shoot_half/ready ", foc_val[i][2], "mm D=",dof, "H=",hyp)
sleep(1000)
set_focus(foc_val[i][1])
dof = get_dof() hyp = get_hyp_dist()
print("set_focus ", foc_val[i][1], "mm D=",dof, "H=",hyp)
sleep(1000)
dof = get_dof() hyp = get_hyp_dist()
print("set_focus/sleep ", foc_val[i][1], "mm D=",dof, "H=",hyp)
sleep(1000)
set_focus(foc_val[i][2])
shoot()
dof = get_dof() hyp = get_hyp_dist()
print("set_focus/shoot ", foc_val[i][2], "mm D=",dof, "H=",hyp)
sleep(1000)
dof = get_dof() hyp = get_hyp_dist()
print("set_f/shoot/sleep", foc_val[i][2], "mm D=",dof, "H=",hyp)
sleep(1000)
end
end
set_focusmode("normal") -- reset mode for normal operation
Erstellt in 0.012 Sekunden, mit GeSHi 1.0.8.9
Damit bekomme ich folgende Ausgabe:
- Code: Alles auswählen
A= 2,8
shoot_half 500 mm D= 231 H= 2344
shoot_half/ready 100 mm D= 9 H= 2344
set_focus 500 mm D= 231 H= 2344
set_focus/sleep 500 mm D= 231 H= 2344
set_focus/shoot 100 mm D= 24 H= 841
set_f/shoot/sleep 100 mm D= 9 H= 2344
shoot_half 100 mm D= 9 H= 2344
shoot_half/ready 500 mm D= 231 H= 2344
set_focus 100 mm D= 9 H= 2344
set_focus/sleep 100 mm D= 9 H= 2344
set_focus/shoot 500 mm D= 966 H= 841
set_f/shoot/sleep 500 mm D= 231 H= 2344
A= 8,0
shoot_half 500 mm D= 231 H= 2344
shoot_half/ready 100 mm D= 24 H= 841
set_focus 500 mm D= 966 H= 841
set_focus/sleep 500 mm D= 966 H= 841
set_focus/shoot 100 mm D= 24 H= 841
set_f/shoot/sleep 100 mm D= 9 H= 2344
shoot_half 100 mm D= 9 H= 2344
shoot_half/ready 500 mm D= 966 H= 841
set_focus 100 mm D= 24 H= 841
set_focus/sleep 100 mm D= 24 H= 841
set_focus/shoot 500 mm D= 966 H= 841
set_f/shoot/sleep 500 mm D= 231 H= 2344
*** BEENDET ***
Ich habe mit einem Tiefenschärferechner mal nachgesehen, welche Werte denn richtig wären. Dabei kam folgendes heraus:
Für Blende 2,8 ergibt sich mit der DofMaster-Berechnung (Fokusentfernungen werden dort ab Linse gerechnet!!)
- Code: Alles auswählen
Blende Fokus ab CCD Fokus ab Linse DOF HYP
2,8 100 mm 51 mm 2 mm 2,4 m
2,8 500 mm 451 mm 172 mm 2,4 m
8,0 100 mm 51 mm 5 mm 0,85 m
8,0 500 mm 451 mm 659 mm 0,85 m
Beim Vergleich mit den Kamera-Werten muss man berücksichtigen, dass die berechnete Tiefenschärfe stark vom vorgegebenen Streukreisdurchmesser abhängt, weitere Diskrepanzen gibt es, wie gesagt, bei geringem Objektabstand.
Aber wie auch immer, wenn ich einfach die Werte von der Kamera heraussuche, die am besten passen, dann sind das immer die in den Zeilen "shoot_half/ready".
In allen anderen Fällen ist anscheinend entweder die Blende oder die aktuelle Fokuseinstellung nicht korrekt berücksichtigt.
Um also korrekte Werte von den Funktionen get_dof und get_hyp_dist zu bekommen, reicht es also nicht, set_focus auszuführen, sondern man muss auch press "shoot_half" drücken und dann warten, bis get_shooting eine 1 bzw. true zurückliefert.