Fixer Focus

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

Fixer Focus

Beitragvon udo187 » 16.06.2014, 09:55

Hallo @all !

Ich habe eine Frage: Und zwar verwende ich meine Canon Powershot (mit Fernauslöser) für Selbstportraits (also immer der gleiche Abstand, ca. 2 Meter).
Soweit so gut, mein verwendetes einfaches Skript (Lua) macht auch alles wie es soll und die Fotos werden bei Tageslicht auch schön & scharf.
Anders schauts in der Nacht aus, die Kamera hat Probleme mit dem Fokusieren, ca. 50% der Fotos werden unscharf.
Anscheinend kann meine Kamera nicht richtig fokussieren, wenn sich die Person nicht in der Mitte befindet.

Meine Idee: Den Fokus fix vorzugeben, damit alle Bilder scharf werden.

Ich habe ein wenig gesucht und den Befehl set_focus() gefunden.
Muss ich hier als Wert lediglich die Entfernung zum abzubildeten Objekt in Millimeter eingeben ?
Müssen vor diesen Befehl noch andere Befehle ausgeführt werden ? Kann ich mit get_focus den Fokus auslesen (Tageslicht) ?

Zur Info: Ich habe mittels Exif-Viewer versucht, den "AF-Punkt gewählt" aus einem der scharfen Fotos auszulesen, leider schreibt meine Kamera diesen Wert nicht mit.

Bin für jede Hilfe dankbar !

Liebe Grüße
Udo
udo187
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 6
Registriert: 05.06.2014, 22:38
Kamera(s): Canon Powershot A3300IS

Re: Fixer Focus

Beitragvon Werner_O » 17.06.2014, 01:25

Hallo Udo,

zunächst einmal herzlich willkommen hier im Forum!

Die bei der A3300 (eine AS3300 gibt es m.W. nicht - bitte Dein Profil hier dazu korrigieren) nicht vorhandene MF-Einstellung sowie der ebenfalls fehlende AF-Lock machen alles besonders schwierig.
Eine Lösung via der Skriptbefehle get_focus und set_focus scheint auch sehr schwierig, wenn man sich diese Seite dazu genauer anschaut. Bereits ich selber fühle mich da sehr überfordert und wüßte nicht, was ich dazu sinnvoll als Skriptcode für Deinen speziellen Anwendungsfall schreiben könnte.
Auch die via CHDK einstellbaren Fokuseinstellungen können bei Kameras ohne MF nur im M-Modus ausgeführt werden, womit dann aber auch die automatische Belichtungsmessung komplett ausfällt. Somit müßten dann immer auch Blende, Belichtungszeit und ISO-Wert zusätzlich manuell vorgegeben werden, was m.E. erst recht völlig unpraxisgerecht wäre.

Falls die von Dir genannte Fernbedienung eine "USB-FB" ist könnte man Dein Problem aber zumindest einigermaßen elegant über ein Lua-Skript lösen:
1) Ein "langer" USB-Impuls könnte dann einen Halfshoot mit AF- und Belichtungsmessung ausführen, wobei anschließend beide Werte dauerhaft gespeichert werden (natürlich mit der Option, diese beiden Werte über einen erneuten "langen" USB-Impuls neu zu messen, falls bspw. der AF nicht korrekt fokussiert hatte).
2) Ein oder mehrere folgende "kurze" USB-Impulse könnten dann aber immer ein Bild auslösen via Lua-Befehl press/release "shoot_full_only", wobei die gespeicherten Werte für Fokus und Belichtung beibehalten werden würden.

Ich wäre auch gerne bereit Dir so ein Lua-Skript zu schreiben, aber dazu brauche ich erst Infos, welche Fernbedienung Du überhaupt verwendest. Bisher kenne ich mich dabei nur mit USB-FBs aus.

Liebe Grüße
Werner
Benutzeravatar
Werner_O
CHDK-Legende
CHDK-Legende
 
Beiträge: 1011
Registriert: 22.10.2010, 14:12
Wohnort: Köln
Kamera(s): SX20 1.02d
SX240 1.01a
S100 1.01a
S3 1.00a

Re: Fixer Focus

Beitragvon udo187 » 17.06.2014, 08:57

Hallo Werner!

Danke für die Antwort.
Ich habe mir mit Hilfe dieses tollen Forums eine einfache USB-Fernbedienung selbst gebastelt, ein Taster schließt den Stromkreis (4,5V), im Skript wird einfach mittels get_usb_power abgefragt und dann ein shoot ausgelöst.
Dein Lösungsvorschlag mit einem langen und den kurzen USB-Impulsen gefällt mir sehr gut.
Da ich die Kamera aber als Partycam verwende (es sollte einfach immer 1 Foto gemacht werden, egal ob lang oder kurz gedrückt wird), müsste der lange Impuls zum Einstellen des AF-Wertes aber wirklich sehr lange sein (z.B. größer als 5 Sekunden), damit der Autofokus nicht irrtümlich geändert wird.
Oder der AF-Wert wird bei Tageslicht ermittelt und dann fix im Skrip hinterlegt (für diesen festgelegten Abstand von ca. 2 Meter).
Alle anderen Einstellungen wie Blitz, Belichtung, etc. sollte nach wie vor automatisch von der Kamera übernommen werden.


Super dass du mir beim Skript helfen willst, danke dafür !

Liebe Grüße
Udo
udo187
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 6
Registriert: 05.06.2014, 22:38
Kamera(s): Canon Powershot A3300IS

Re: Fixer Focus

Beitragvon Werner_O » 18.06.2014, 22:58

Hallo Udo,

Oder der AF-Wert wird bei Tageslicht ermittelt und dann fix im Skrip hinterlegt (für diesen festgelegten Abstand von ca. 2 Meter). Alle anderen Einstellungen wie Blitz, Belichtung, etc. sollte nach wie vor automatisch von der Kamera übernommen werden.

Du hast anscheinend immer noch nicht begriffen, daß es m.W. so bei Deiner A3300 ohne MF-Modus leider nicht geht.
Via Skriptbefehlen wird alles extrem umständlich - hast Du meinen gelegten Link dazu überhaupt aufmerksam gelesen?
Via CHDK-Fokus-Vorgaben funktioniert es ebenfalls nicht, weil es dann nur im M-Modus gehen könnte und dann leider keine automatische Belichtungsmessung mehr erfolgen kann.

GsD habe ich im Handbuch zur A3300 auf Seite 96 den überaus wichtigen Hinweis gefunden, daß diese Kamera immerhin den Befehl "AF-Speicherung" (auf englisch AF-Lock) beherrscht und habe dazu inzwischen ein Lua-Skript geschrieben, welches einen anfangs gemachten AF auf eine Distanz nach Deiner Wahl dauerhaft für alle nachfolgenden Aufnahmen speichert, wobei mit "dauerhaft" nur die Dauer des laufenden Skriptes gemeint ist.
Über die CHDK-Einstellungen kannst Du ja festlegen, daß die Kamera im Alt-Modus generell nicht mehr ausgeht, was für Deine Zwecke überaus wichtig wäre.

Hier zunächst mal das Skript:

Code: Alles auswählen
--[[
**************************************************
Script "Partytime" for an USB remote with provided
AF-Lock for Canon cams without available MF mode
Script Version: v1.00
Licence: GPL
(c) Werner_O 2014/06/18
**************************************************
@title Partytime
@param a Auto-Mode USB-Port
 @default a 1
 @range a 0 1
@param t Low Limit for AFL in sec
 @default t 5
 @range t 1 10
]]

-- 1) Definitionen von Variablen und Unterfunktionen:

auto_mode = a            --USB Automodus
aflock_mode = 0          --AF-Lock Status
time_limit = t * 100     --USB-Zeitgrenze für die AF-Lock Funktion
usb_high_speed_mode = 0  --Anfangsdefinition USB High-Speed-Mode

--Unterfunktion für AF-Lock:
function command_aflock()
    if aflock_mode == 1 then
        set_aflock(0)    --Disable AF lock
        sleep(10)
        aflock_mode = 0
    end
    press("shoot_half")
    repeat sleep(10) until get_shooting() == true
    set_aflock(1)        --Enable AF lock
    aflock_mode = 1
    print("AF-Lock enabled")
end

--Unterfunktion für Shoot:
function command_shoot()
    count = get_exp_count()
    shoot()
    repeat sleep(10) until get_exp_count() ~= count
end

--Unterfunktion Restore, verwendet bei Skriptabbruch via Auslöser:
function restore()
    cls()
    if auto_mode == 1 then
        set_config_value(121,0) --Disable USB remote
        print("USB remote disabled")
    end
    if aflock_mode == 1 then
        set_aflock(0)           --Disable AF lock
        print("AF-Lock disabled")
    end
    if usb_high_speed_mode == 1 then
        h = enable_highspeed_usb(0)  --Disable USB high speed mode
        print("USB high speed mode disabled")
    end
end

--Definition Konsolenlayout (unten links mit 4 Zeilen und je 28 möglichen Zeichen):       
set_console_layout(0, 0, 28, 4)

-- 2) Anfang der Ausführung von Skriptbefehlen:

if auto_mode == 1 then
    set_config_value(121,1)     --Enable USB remote
    print("USB remote enabled")
end

--Verwendung des USB high speed mode bei erkanntem CHDK 1.3 ab Version 3442 oder größer:
if tonumber(string.sub(string.gsub(get_buildinfo().build_number, "%p", ""), 0, 3)) >= 130 then  --Get CHDK version
    if tonumber(get_buildinfo().build_revision) < 3442 then  --Get CHDK build number
        usb_high_speed_mode = 0
    else
        usb_high_speed_mode = 1
        h = enable_highspeed_usb(1000)
        --Change USB time_limit to another value needed in USB high speed mode:
        time_limit = t * 1000
        print("USB high speed mode enabled")
    end
else
    usb_high_speed_mode = 0
end

repeat
    x = get_usb_power()   -- x = normalerweise die USB-Impulslänge in ms geteilt durch 10;
                          -- im USB high speed mode dagegen die USB-Impulslänge in ms
    if x > 0 then
        if x < time_limit then
            command_shoot()
        else
            command_aflock()
        end
    end
until is_pressed("menu")

-- 3) Befehle nach Skriptabbruch via Taste MENÜ:

cls()

if auto_mode == 1 then
    set_config_value(121,0)     --Disable USB remote
    print("USB remote disabled")
end

if aflock_mode == 1 then
    set_aflock(0)               --Disable AF lock
    print("AF-Lock disabled")
end

if usb_high_speed_mode == 1 then
    h = enable_highspeed_usb(0) --Disable USB high speed mode
    print("USB high speed mode disabled")
end

(Alternativer Download des Skriptes von meiner eigenen Homepage: http://www.studio4all.de/foren/chdk/Party.lua)

Wichtige Hinweise zum Skript:

1) Die USB-Zeitgrenze, ab wann das Skript statt Shoot einen AF-Lock macht, kannst Du vor dem Skriptstart via CHDK über einen Vorgabeparameter von 1 bis 10 sec an eigene Vorlieben anpassen.
2) Bei aktiviertem Vorgabeparameter "Auto-Mode USB-Port" wird für den USB-Port bei Start des Skriptes automatisch der Remote-Modus aktiviert und bei Skriptende wieder deaktiviert.
3) Der seit CHDK 1.3 v3442 mögliche "USB High Speed Mode" mit wesentlich genaueren Ergebnissen für den Befehl "get_usb_power()" wird automatisch aktiviert, wenn die vom Skript ermittelte CHDK-Version dazu passt (siehe Zeilen 73 -86).
4) Bzgl. Struktur ist dieses Skript für Lua-Neulinge nicht unbedingt auf den ersten Blick nachzuvollziehen. Bspw. habe ich die Funktionen Shoot und AF-Lock in den Unterfunktionen "command_shoot()" bzw. "command_aflock()" definiert, was mit Lua (nicht aber mit uBasic) möglich ist.
Etliche eingefügte Kommentare sollten aber dabei helfen, die grundlegende Funktionsweise dieses Skriptes nachvollziehen zu können.
5) Konsolen-Textausgaben bei Skriptstart und Skriptende geben wichtige Infos zu USB-Port und USB High Speed Mode. Auch ein erfolgter AF-Lock wird angezeigt.

Zusatzinfo zur Funktion AF-Lock:
Bei meinen eigentlich erfolgreichen Tests dieses Skriptes an meiner S3 kam es zu nicht so ganz nachvollziehbaren Ausgaben am OSD bzgl. des AFL-Symbols:
a) Nach via USB-FB erfolgtem AF-Lock erscheint nur ein grüner AF-Rahmen aber ohne AFL-Anzeige im Display.
Nur die Konsolenausgabe vom Skript zeigt an, daß tatsächlich ein AF-Lock gemacht wurde.
b) Mache ich dann ein Bild, ist der AF-Rahmen nicht mehr grün, dafür wird AFL im Display angezeigt.
c) Beende ich das Skript, wird zunächst weiterhin AFL im Display angezeigt, obwohl das Skript AFL beim Beenden automatisch wieder deaktiviert. Nach erneutem Antippen des Auslösers bei deaktiviertem Alt-Modus ist das AFL-Symbol aber sofort wieder weg.
Das aber nur zur Info - mein Skript macht ja trotzdem schon genau das was es machen soll.

Liebe Grüße
Werner_O
Benutzeravatar
Werner_O
CHDK-Legende
CHDK-Legende
 
Beiträge: 1011
Registriert: 22.10.2010, 14:12
Wohnort: Köln
Kamera(s): SX20 1.02d
SX240 1.01a
S100 1.01a
S3 1.00a

Re: Fixer Focus

Beitragvon Werner_O » 19.06.2014, 17:19

Hallo Udo,

freundlicherweise hat mich der User waterwingz aus dem internationalen CHDK-Forum darauf hingewiesen, daß mit CHDK 1.3 bei vielen (aber leider nicht allen!) Kameras ohne generischen MF-Modus dieser MF-Modus trotzdem über den Befehl set_mf eingestellt werden kann.

Ich habe darum heute ein neues Lua-Skript geschrieben, welches diese Funktion ausnutzt und beim Skriptstart eine Kamera auf einen in den Skriptvorgaben einstellbaren festen Fokuswert setzt, falls die jeweilige Kamera das zulässt.
Über entsprechende Skriptabfragen wird dabei überprüft, ob die jeweilige Kamera dafür geeignet ist. Bei nicht geeigneten Kameras bzw. zu alten gefundenen CHDK-Versionen bricht das Skript dann mit entsprechenden Fehlermeldungen ab.
Ob Deine A3300 für dieses Skript geeignet ist mußt Du noch selber ausprobieren.

Zum neuen Skript:
1) Die gewünschte Fokusdistanz kann über die Skriptvorgabewerte dabei in weiten Grenzen von 0 cm auf bis zu 65 m (unendlich) voreingestellt werden. Als Default-Vorgabewert habe ich dabei Deine gewünschten 2 m gewählt.
2) Auch dieses Skript aktiviert/deaktiviert die Remote-Funktion des USB-Ports automatisch falls gewünscht.
3) Die real eingestellte Fokusdistanz wird nach dem Skriptstart an der Konsole angezeigt, wobei dafür immer erst eine automatisch gemachte Testaufnahme nötig ist (siehe hier).
4) Ein USB-Impuls löst nun unabhängig von seiner Länge immer ein Bild aus.

Code: Alles auswählen
--[[
******************************************
Script "MF via USB remote" for cams which
doesn't support MF-Mode via Canon firmware
Script Version: v1.00
Licence: GPL
(c) Werner_O 2014/06/19
******************************************
@title MF via USB remote
@param d MF-Distance (cm)
 @default d 200
 @range d 0 6500
@param a Auto-Mode USB-Port
 @default a 1
 @range a 0 1
]]

distance = d * 10     --Definition MF-Distance in mm
auto_mode = a         --Definition Auto-Mode for USB-Port
ready = false

--Subfunction Restore, used at script aborting via Shoot-key:
function restore()
    cls()
    if auto_mode == 1 then
        set_config_value(121,0) --Disable USB remote
        print("USB remote disabled")
    end
    set_mf(0)
    print("MF-Mode disabled")
end

--Check CHDK version and available MF-Mode:
if tonumber(string.sub(string.gsub(get_buildinfo().build_number, "%p", ""), 0, 3)) >= 130 then  --Get CHDK version
    x = set_mf(1)    --At cams without available MF-mode x will be 0
    if x == 1 then
        ready = true   
    else
        print("Error: This cam")
        print("doesn't support MF-Mode")
        sleep(3000)
    end
else
    print("Error: This script")
    print("requires CHDK 1.3")
    sleep(3000)
end

--Start main script:
if ready == true then   

    if auto_mode == 1 then
        set_config_value(121,1) --Enable USB remote
        print("USB remote enabled")
    end
   
    set_focus(distance)
    shoot()
    sleep(500)
    f = get_focus()
    focus_result = (f / 10)
    print(string.format("Focus set to %d cm", focus_result))

    repeat
    x = get_usb_power()
        if x > 0 then
            count = get_exp_count()
            shoot()
            repeat sleep(10) until get_exp_count() ~= count
        end
    until is_pressed("menu")

    if auto_mode == 1 then
        set_config_value(121,0) --Disable USB remote
        print("USB remote disabled")
    end
    set_mf(0)
    print("MF-Mode disabled")
end


EDIT 21.06.2014:
Inzwischen neue Skriptversion 1.01 verfügbar:
(Alternativer Download des Skriptes von meiner eigenen Homepage: http://www.studio4all.de/foren/chdk/RemoteMF.lua )

Liebe Grüße
Werner_O
Zuletzt geändert von Werner_O am 21.06.2014, 19:52, insgesamt 1-mal geändert.
Benutzeravatar
Werner_O
CHDK-Legende
CHDK-Legende
 
Beiträge: 1011
Registriert: 22.10.2010, 14:12
Wohnort: Köln
Kamera(s): SX20 1.02d
SX240 1.01a
S100 1.01a
S3 1.00a

Re: Fixer Focus

Beitragvon udo187 » 19.06.2014, 21:39

Hallo Werner!

Das ist aber erfreulich! Werde Dein Skript am Wochenende testen und berichten.
1000 Dank für Dein Engagement!

Liebe Grüße
Udo
udo187
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 6
Registriert: 05.06.2014, 22:38
Kamera(s): Canon Powershot A3300IS

Re: Fixer Focus

Beitragvon Werner_O » 21.06.2014, 19:54

Hallo Udo,

in einer weiteren PN an mich hat mich waterwingz aus dem internationalen CHDK-Forum darauf hingewiesen, daß in CHDK 1.3 auch die Funktion set_aflock() wesentlich verbessert wurde und ggfs. alternativ zum Befehl set_mf() eingesetzt werden kann, wenn der Befehl set_mf() an der jeweiligen Kamera nicht funktionieren sollte.
Auch so kann dann über den nachfolgenden Befehl set_focus(x) das Objektiv auf die gewünschte Fokusdistanz festgesetzt werden.

Anbei meine aktualisierte Skriptversion 1.01, welche notfalls set_aflock() verwendet, falls set_mf() nicht funktioniert (siehe die Zeilen 41-48):

Code: Alles auswählen
--[[
******************************************
Script "MF via USB remote" for cams which
doesn't support MF-Mode via Canon firmware
Script Version: v1.01
Licence: GPL
(c) Werner_O 2014/06/21
******************************************
@title MF via USB remote
@param d MF-Distance (cm)
 @default d 200
 @range d 0 6500
@param a Auto-Mode USB-Port
 @default a 1
 @range a 0 1
]]

distance = d * 10     --Definition MF-Distance in mm
auto_mode = a         --Definition Auto-Mode for USB-Port
afl_mode = 0          --Definition AFL-Mode for cams without MF-Mode
ready = true

--Subfunction Restore, used at script aborting via Shoot-key:
function restore()
    cls()
    if auto_mode == 1 then
        set_config_value(121,0) --Disable USB remote
        print("USB remote disabled")
    end
    if afl_mode == 0 then
        set_mf(0)
        print("MF-Mode disabled")
    else
        set_aflock(0)
        print("AFL-Mode disabled")
    end
end

--Check CHDK version and available MF- or AFL-Mode:
if tonumber(string.sub(string.gsub(get_buildinfo().build_number, "%p", ""), 0, 3)) >= 130 then  --Get CHDK version
    x = set_mf(1)
    if x == 1 then      --At cams without available MF-mode x will be 0   
        print("MF-Mode enabled") 
    else
        set_aflock(1)   --Use AFL-Mode instead MF-Mode
        afl_mode = 1
        print("AFL-Mode enabled")
    end
else
    ready = false
    print("Error: This script")
    print("requires CHDK 1.3")
    sleep(3000)
end

--Start main script:
if ready == true then
    if auto_mode == 1 then
        set_config_value(121,1) --Enable USB remote
        print("USB remote enabled")
    end
   
    set_focus(distance)
    shoot()
    sleep(500)
    f = get_focus()
    if (f < 1000) then          --True if focus < 1 m
        focus_result = f
        print(string.format("Focus set to %d mm", focus_result))
    elseif (f < 10000 ) then    --True if focus < 10 m
        focus_result = tostring(f)
        string1 = string.sub(focus_result, 0, 1)
        string2 = string.sub(focus_result, 2, 3)
        print(string.format("Focus set to %s,%s m", string1, string2))
    else                        --True if focus > 10 m
        focus_result = tostring(f)
        string1 = string.sub(focus_result, 0, 2)
        string2 = string.sub(focus_result, 3, 4)
        print(string.format("Focus set to %s,%s m", string1, string2))   
    end
   
    repeat
    x = get_usb_power()
        if x > 0 then
            count = get_exp_count()
            shoot()
            repeat sleep(10) until get_exp_count() ~= count
        end
    until is_pressed("menu")
   
    cls()
    if auto_mode == 1 then
        set_config_value(121,0) --Disable USB remote
        print("USB remote disabled")
    end
   
    if afl_mode == 0 then
        set_mf(0)
        print("MF-Mode disabled")
    else
        set_aflock(0)
        print("AFL-Mode disabled")
    end
end

(Alternativer Download des Skriptes von meiner eigenen Homepage: http://www.studio4all.de/foren/chdk/RemoteMF.lua )
Bitte zu Testzwecken unbedingt die neuere Skriptversion 1.01 verwenden!

EDIT 22.06.2014:
Die neuere Skriptversion 1.01 zeigt zudem die real eingestellte Fokus-Distanz nun deutlich leserlicher an:
Werte unter 1.000 mm werden in mm angezeigt, Werte darüber dagegen in m mit Nachkommastellen.
Die Anzeigelänge habe ich dabei auf m.E. sinnvolle max. 4 angezeigte Stellen beschränkt.

Liebe Grüße
Werner_O
Benutzeravatar
Werner_O
CHDK-Legende
CHDK-Legende
 
Beiträge: 1011
Registriert: 22.10.2010, 14:12
Wohnort: Köln
Kamera(s): SX20 1.02d
SX240 1.01a
S100 1.01a
S3 1.00a

Re: Fixer Focus

Beitragvon udo187 » 23.06.2014, 08:33

Hallo Werner !

Ich habe Deine letzte Skriptversion bei meiner Canon A3300IS ausprobiert, erste Tests schauen vielversprechend aus :-)

Eine Verständnisfrage zum Skript habe ich dennoch:
Beim setzen des Fokus mit set_focus(distance) wird der Fokus auf den zuvor definierten Abstand eingestellt und mittels shoot "fixiert".
Der tatsächliche Wert, der mit get_focus() (nach dem sleep von 500) ausgelesen wird, sollte ja gleich sein, wie der zuvor gesetzte?!
Wenn das nicht so ist, dann müßte der sleep-Wert erhöht werden, damit die Kamera mehr seit zum fokusieren hat, oder? (lt. englischem Wiki)

Nochmals Danke für dein super Skript !

Gruss
Udo
udo187
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 6
Registriert: 05.06.2014, 22:38
Kamera(s): Canon Powershot A3300IS

Re: Fixer Focus

Beitragvon rudi » 23.06.2014, 19:26

Hallo,

den für die Aufnahme benutzen Fokuswert wird man nur direkt beim Auslösen ermitteln können. Dazu muss der shoot()-Befehl aufgelöst werden und sleep() kann entfallen. Etwa so:
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--fokussieren
press("shoot_half")
--warten auf abgeschlossene Fokussierung
repeat
  sleep(10)
until get_shooting() == true
--eingenommene Werte auslesen, wie Entfernung, Blende
f = get_focus()

--auslösen, kann man für Tests auch auskommentieren oder mit if-then-end umgehen
press("shoot_full")
--auslösen beenden
release("shoot_full")

--fokussieren beenden
release("shoot_half")
Erstellt in 0.004 Sekunden, mit GeSHi 1.0.8.9

Nach meinen Erfahrungen wird der Fokuswert immer etwas kleiner sein als vorgegeben (siehe hier).

Zum Skript:
Werner du kannst am Ende die Zeilen ab cls() bis zum vorletzten end durch restore() ersetzen.

Gruß rudi
Benutzeravatar
rudi
CHDK-Spezialist
CHDK-Spezialist
 
Beiträge: 500
Registriert: 11.09.2009, 12:27
Kamera(s): A590IS_101B, SX260_100B

Re: Fixer Focus

Beitragvon udo187 » 23.06.2014, 20:06

Hallo !

Also wenn der tatsächliche Fokuswert nur unwesentlich kleiner (oder größer) als der vorgegebene Wert ist, ist dies für meine Zwecke eigentlich egal (wenn ich alles richtig verstanden habe...).
Ich fotografiere ja Personen aus ca. 2 Meter Abstand. Wenn ich den Fokus aus 2000 mm vorgebe und die Kamera stellt nur auf 1950 mm müßte das ja auch egal sein oder ? Ich denke beim Automatikmodus (wenn der Fokus bei jedem Auslösen neu ermittelt wird) stellt die Kamera ja auch einmal z.B. auf die Stirn scharf und beim nächsten Bild auf die Nase :^o , oder ?
Und mein Hauptproblem ist ja, dass die Kamera überhaupt nicht scharf stellen kann wenn es sehr dunkel ist, trotz Hilfslicht, und dann werden die Fotos unbrauchbar.
Oder liege ich mit meinen Überlegungen komplett falsch?

Gruss Udo
udo187
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 6
Registriert: 05.06.2014, 22:38
Kamera(s): Canon Powershot A3300IS

Re: Fixer Focus

Beitragvon Werner_O » 23.06.2014, 20:15

Hallo Udo,

Der tatsächliche Wert, der mit get_focus() (nach dem sleep von 500) ausgelesen wird, sollte ja gleich sein, wie der zuvor gesetzte?

Das muß man differenziert betrachten:

1) Der Fokus dieser Kameras kann nicht stufenlos sondern immer nur in Schritten eingestellt werden. Nach setfocus() geht das jeweilige Objektiv dabei in die Fokus-Position, welche dem Vorgabewert am nächsten ist. Genau aus diesem Grund sind in meinem Skript auch nur Vorgabewerte in cm-Schritten möglich.
Insofern ist es auch normal, daß der via getfocus() angezeigte eingestellte Fokuswert nur in seltenen Fällen exakt dem Fokus-Vorgabewert entspricht. Eine recht kleine Differenz ist dabei für die Praxis nicht relevant.

2) Bei nahen Vorgabewerten für die Distanz muß zudem beachtet werden, daß CHDK die jeweilige Kamera nicht "überlisten" kann und als nächste Distanz real immer nur das einstellen kann, was das jeweilige Objektiv in der jeweilig eingestellten Brennweite überhaupt hergibt (siehe Kamera-Handbuch). Dabei reden wir hier über übliche 50 cm bis 1 m oder noch mehr minimale Nahdistanz je nach Brennweite.
Die via Skript möglichen besonders extremen 0 cm Distanz brauchen ja eine Kamera wie etwa meine SX20, welche dafür aber vorher auch erst in den Supermakro-Modus gesetzt werden müßte.

3) Über die Länge des Sleep-Befehls muß man erst dann nachdenken, wenn getfocus() Werte ergibt, welche sich deutlich bis krass vom Vorgabewert unterscheiden. In diesem Fall könnte dann eine Verlängerung des Sleep-Befehls zu korrekteren Ergebnissen führen, was aber auszuprobieren wäre.
Anbei darum meine neue Skriptversion 1.02 mit dem neuen Skriptvorgabeparameter "Sleep Time", welcher aktuell von 100 ms bis 2 sec voreingestellt werden kann. Mit dieser Version kannst Du nun prima verschiedene Sleep-Längen testen, ohne die SD-Karte aus der Kamera nehmen zu müssen.
Über Deine Ergebnisse dazu würde ich mich freuen!

Code: Alles auswählen
--[[
******************************************
Script "MF via USB remote" for cams which
doesn't support MF-Mode via Canon firmware
Script Version: v1.02
Licence: GPL
(c) Werner_O 2014/06/23
******************************************
@title MF via USB remote
@param d MF-Distance (cm)
 @default d 200
 @range d 0 6500
@param t Sleep Time (100 ms)
 @default t 5
 @range t 1 20
@param a Auto-Mode USB-Port
 @default a 1
 @range a 0 1
]]

distance = d * 10     --Definition MF-Distance in mm
auto_mode = a         --Definition Auto-Mode for USB-Port
afl_mode = 0          --Definition AFL-Mode for cams without MF-Mode
sleep_time = t * 100  --Definition Sleep-Time after command set_focus(distance)
ready = true

--Subfunction Restore, used at script aborting via Shoot-key:
function restore()
    cls()
    if auto_mode == 1 then
        set_config_value(121,0) --Disable USB remote
        print("USB remote disabled")
    end
    if afl_mode == 0 then
        set_mf(0)
        print("MF-Mode disabled")
    else
        set_aflock(0)
        print("AFL-Mode disabled")
    end
end

--Check CHDK version and available MF- or AFL-Mode:
if tonumber(string.sub(string.gsub(get_buildinfo().build_number, "%p", ""), 0, 3)) >= 130 then  --Get CHDK version
    x = set_mf(1)
    if x == 1 then      --At cams without available MF-mode x will be 0
        print("MF-Mode enabled") 
    else
        set_aflock(1)   --Use AFL-Mode instead MF-Mode
        afl_mode = 1
        print("AFL-Mode enabled")
    end
else
    ready = false
    print("Error: This script")
    print("requires CHDK 1.3")
    sleep(3000)
end

--Start main script:
if ready == true then
    if auto_mode == 1 then
        set_config_value(121,1) --Enable USB remote
        print("USB remote enabled")
    end
   
    set_focus(distance)
    shoot()
    sleep(sleep_time)
    f = get_focus()
    if (f < 1000) then          --True if focus < 1 m
        focus_result = f
        print(string.format("Focus set to %d mm", focus_result))
    elseif (f < 10000 ) then    --True if focus < 10 m
        focus_result = tostring(f)
        string1 = string.sub(focus_result, 0, 1)
        string2 = string.sub(focus_result, 2, 3)
        print(string.format("Focus set to %s,%s m", string1, string2))
    else                        --True if focus > 10 m
        focus_result = tostring(f)
        string1 = string.sub(focus_result, 0, 2)
        string2 = string.sub(focus_result, 3, 4)
        print(string.format("Focus set to %s,%s m", string1, string2))
    end
   
    repeat
    x = get_usb_power()
        if x > 0 then
            count = get_exp_count()
            shoot()
            repeat sleep(10) until get_exp_count() ~= count
        end
    until is_pressed("menu")
   
    cls()
    if auto_mode == 1 then
        set_config_value(121,0) --Disable USB remote
        print("USB remote disabled")
    end
   
    if afl_mode == 0 then
        set_mf(0)
        print("MF-Mode disabled")
    else
        set_aflock(0)
        print("AFL-Mode disabled")
    end
end

Liebe Grüße
Werner_O
Benutzeravatar
Werner_O
CHDK-Legende
CHDK-Legende
 
Beiträge: 1011
Registriert: 22.10.2010, 14:12
Wohnort: Köln
Kamera(s): SX20 1.02d
SX240 1.01a
S100 1.01a
S3 1.00a

Re: Fixer Focus

Beitragvon udo187 » 25.06.2014, 21:37

Hallo Werner !

Endlich habe ich Zeit gefunden, um Dein Skript ausführlich zu testen.
Es funktioniert wunderbar mit dem Setzen des Fokus.
Ausgegeben wird bei get_focus() der Wert 2,09 m (oder 2,05m).
Ich habe etliche Testfotos geschossen, wenn das Objekt sich in ca. 2 Meter Abstand befindet wird es schön scharf,
selbst bei absoluter Dunkelheit - echt super!!!
So habe ich mir das vorgestellt!

Was mir aber aufgefallen ist: Zum Testen verwende ich nur ein USB-Kabel und eine 4,5 Volt Batterie um den Impuls auszulösen.
Wenn ich einen längeren Schaltkontakt simuliere (ca. 1 Sekunde), dann löst die Kamera 2 mal aus, warum das ?
Sollte ich nach dem Shoot ein sleep einbauen oder den wert x auf 0 setzen ?

Liebe Grüße
Udo
udo187
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 6
Registriert: 05.06.2014, 22:38
Kamera(s): Canon Powershot A3300IS

Re: Fixer Focus

Beitragvon Werner_O » 26.06.2014, 22:44

Hallo Udo,

bitte überprüfe zunächst Deine Einstellungen zu den USB-Remote Einstellungen.
Bei meinen beiden eigenen Kameras sind dabei folgende Einstellungen nötig unter "USB-Fernbedienung-Parameter":
USB-Fernbedienung an/aus = On
Schalter-Typ = None
Kontrollart = None

Die von Dir vorgeschlagenen Skriptänderungen sind dabei unsinnig. Bereits jetzt wird ein neuer USB-Impuls erst dann erneut abgefragt, wenn eine gemachte Aufnahme sozusagen "bereits im Kasten" ist.
Dafür sorgen die Skriptzeilen 89-91:
Code: Alles auswählen
count = get_exp_count()
shoot()
repeat sleep(10) until get_exp_count() ~= count

Bitte ändere also nichts am Skriptcode, weil Du dazu bisher noch zuwenig Ahnung von Lua-Programmierung hast.

Bei Interesse zu eigener Lua-Programmierung kannst Du Dir übrigens gerne diese Webseite ansehen. Allerdings werden dort nur die CHDK-spezifischen Lua-Befehle aufgeführt. Sozusagen "übliche Lua-Befehle" ohne CHDK-Bezug fehlen dort aber, und die müsstest Dir über andere Quellen anlernen, bspw. über diese Webseite.

Ansonsten hat mich dieser Thread dazu animiert, ein erweitertes MF-Skript zu schreiben, welches alternativ auch per Kamerataste SET, also auch ohne USB-FB, den gleichen Zweck erfüllt. Solch ein Skript unter Verwendung neuester CHDK-Errungenschaften bzgl. MF gibt es hier im Forum ja bisher m.W. noch nicht.

Was ändert sich dadurch:
Mein hier vorgestelltes Skript wird ab heute in einer erweiterten Version im neuen Thread MF-Modus für alle Cams bereitgestellt.
Anfragen und Diskussionen zu diesem MF-Skript beantworte ich darum nur noch im genannten neuen Thread!

Last not least @ Rudi:
Zitat:
Werner du kannst am Ende die Zeilen ab cls() bis zum vorletzten end durch restore() ersetzen.

Vielen lieben Dank für diese wichtige Info!
Ich habe das inzwischen bei allen meinen bisher veröffentlichten Skripten entsprechend umgesetzt, weil diese Lösung eleganter ist und auch Speicherplatz in den Cams spart - DANKE!

Liebe Grüße
Werner_O
Benutzeravatar
Werner_O
CHDK-Legende
CHDK-Legende
 
Beiträge: 1011
Registriert: 22.10.2010, 14:12
Wohnort: Köln
Kamera(s): SX20 1.02d
SX240 1.01a
S100 1.01a
S3 1.00a


Zurück zu Code-Ecke

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast