[uBasic] Video Zoom und Focus

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

Video Zoom und Focus

Beitragvon pieps » 11.02.2008, 18:53

Hallo CHDKlover,

ich habe ein Script für die A570is geschrieben.
Dieses Script ermöglicht es bei der Videoaufnahme zu
Zoomen (analog und digital) und zu focusieren, hyperfocal oder manual.
Das Script ist für die Digit III Modelle.
Bei den Digit II müssen alle:

get/set_prop 133 -> Manualfocus on/off Digit III (funktinoniert)

in:

get/set_prop 12 -> Manualfocus on/off Digit II ??

(kann von mir nicht getestet werden)

angepasst werden.

Wenn es ein Problem mit den get/set_prop gibt, kann man Diese auch weglassen.
Allerdings muss man dann vor dem Start des Scriptes immer den manualen Focus selbst wählen.

Die Bedienung ist einfach. Vor dem Start kann man zwischen
Hyperfocal Focus (Standart) oder Manual Focus gewählt werden.
Für den Manual Focus gibt es die Möglichkeit die "Stufen" anzupassen:

Entfernungen >= 3000 mm -> Standart 50 mm x 20 (=1000mm)
Entfernungen >= 1000 mm -> Standart 50 mm x 10 (=500mm)
Entfernungen >= 500 mm -> Standart 10 mm x 10 (=100mm)
Entfernungen >= 200 mm -> Standart 50 mm
Entfernungen < 200 mm -> Standart 10 mm

Nach dem Start zeigt das Script einen Bedienungshinsweis an:

" half-press shoot button"
" to stop video recording"
" click Set for change"
" hyp. or manual focus"
"click any button to start"

Die Aufnahme startet erst nachdem eine Taste gedrückt wurde.
Mit "Zoom_in" und "Zoom-out" wird der digitale Zoom,
mit dem Steuerkreuz "up" und "down" der analoge Zoom gesteuert.
Wurde hyperfocal Focus gewählt, stellt das Script den Focus
immer auf den hyperfocalen Focus, d.h. abhängig von der analogen
Zoomstufe wird immer ab einer def. Entfernung (ca.1,2 - 16 meter)
bis unendlich scharfgestellt. Mit dem "Set_button" kann man auf
manual Focus umschalten. Jetzt ist es möglich in den voreingestellten,
bzw. gewählten Stufen mit dem Steuerkreuz "left" und "right" zu
focusieren. Man kann beliebig zwischen den zwei Möglichkeiten
hin- und herschalten. Auch kann der digitale und analoge Zoom
beliebig kombiniert werden. Die Video - Aufnahme wird mit dem
Shoot - Button beendet und der Analoge Zoom und der Focus wieder
zurückgestellt.

Viel Spass mit Script

Gruss Pieps

P.S. Vielleicht könnte Jemand das Script auch in das eng.Forum
stellen.



Code: Alles auswählen
rem Author Pieps
rem Enables zoom during video recording on A570is
rem Hyp. Focus Set
rem or
rem Manual Focus Set

@title zoom/focus Video

@param a Focuschangevalue >=   3 m
@default a 50
@param b Faktor x * Value (mm)
@default b 20
@param c Focuschangevalue >=   1 m
@default c 50
@param d Faktor x * Value (mm)
@default d 10
@param e Focuschangevalue >= 0,5 m
@default e 10
@param f Faktor x * Value (mm)
@default f 10
@param g Focuschangevalue >= 0,2 m
@default g 50
@param h Focuschangevalue <  0,2 m
@default h 10
@param i  hyp.(1) or manual focus(0)
@default i 1

if i>1 then i=1
if i<0 then i=0
if a<1 then a=50
if b<1 then b=20
if c<1 then c=50
if d<1 then d=10
if e<1 then e=10
if f<1 then f=10
if g<1 then g=50
if h<1 then h=10

gosub "startanzeige"

get_zoom z
get_focus r

get_prop 133 m
n=m

press "shoot_half"
sleep 1000
if m=0 then set_prop 133 1
sleep 1000
press "shoot_full"
release "shoot_full"

if i=1 then goto "hypfocus" else goto "manualfocus"

:hypfocus
get_near_limit o
get_far_limit p
get_hyp_dist q
k=q
s=1
set_focus q
gosub "anzeige"

  wait_click

  is_key l "up"
    if l=1 then set_zoom_rel +1
  is_key l "down"
    if l=1 then set_zoom_rel -1

  is_key l "zoom_in"
    if l=1 then click "zoom_in"
  is_key l "zoom_out"
    if l=1 then click "zoom_out"

  is_key l "set"
  if l=1 then gosub "manualfocus"

  is_key l "shoot_half"
  if l=1 then goto "end"
goto "hypfocus"

:manualfocus
get_near_limit o
get_far_limit p
get_hyp_dist q
s=0
gosub "anzeige"

  wait_click

  is_key l "up"
    if l=1 then set_zoom_rel +1
  is_key l "down"
    if l=1 then set_zoom_rel -1

  is_key l "zoom_in"
    if l=1 then click "zoom_in"
  is_key l "zoom_out"
    if l=1 then click "zoom_out"

  is_key l "left"
    if l=1 then gosub "negative"
  is_key l "right"
    if l=1 then gosub "positive"

  is_key l "set"
  if l=1 then goto "hypfocus"

  is_key l "shoot_half"
  if l=1 then goto "end"
goto "manualfocus"

:negative
if k>=3000 then k=k-(a*b)
if k>=1000 & k< 3000 then k=k-(c*d)
if k>=500 & k < 1000 then k=k-(e*f)
if k>=200 & k < 500 then k=k-g
if k<200 then k=k-h
  set_focus k
return

:positive
if k>=3000 then k=k+(a*b)
if k>=1000 & k< 3000 then k=k+(c*d)
if k>=500 & k < 1000 then k=k+(e*f)
if k>=200 & k < 500 then k=k+g
if k<200 then k=k+h
  set_focus k
return

:anzeige

print " Focus:", k
print " near Limit:", o
if p=-1 then print " far Limit: inf" else print " far Limit:", p
print " hyp Dis:", q
if s=1 then print " hyp Focus" else print " manual Focus"
return

:startanzeige
print " half-press shoot button"
print " to stop video recording"
print "   click Set for change"
print "   hyp. or manual focus"
print "click any button to start"
wait_click
return

:end
click "shoot_full"
sleep 2000
set_zoom z
set_focus r
set_prop 133 n
cls
end
pieps
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 30
Registriert: 08.01.2008, 17:42
Wohnort: Saarland

Beitragvon CHDKLover » 11.02.2008, 20:19

Hallo pieps,
sieht sehr interessant aus, werd ich mir mal in den nächsten Tagen anschauen (hab gerade Prüfungen). Danke für deine Bemühungen.

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

Beitragvon CHDKLover » 12.02.2008, 18:39

Hallo pieps,
hab mir gerade dein Programm angeschaut. Es gefällt mir sehr sehr gut, ein echt nützliches Programm fürs Filmen.
Ein paar kleine Sachen sind mir aufgefallen, die ich verbessert habe.
    - Durch das verwenden von gosub "manualfocus" baut sich bei häufigen Wechseln zwischen hyperfocal und manual Focus ein gewaltiger Stack auf der nie abgebaut wird. --> Durch neue Programmstruktur Problem beseitigt.
    - Zur Sicherheit stellt das Script jetzt noch fest ob es überhaupt im Video-Modus gestartet wurde, da es sonst zu Fehlfunktionen führen kann. (mit DIGICII und aktuellem allbestbuild getestet)
    - Um die Wartezeit bei der Initialisierung zu verkürzen, lasse ich noch Informationen über die Schrittweiten zum Verstellen des Focus anzeigen

Aber sonst ist es ein sehr gelungenes Projekt, welches dich sicherlich viel Zeit und Mühe gekostet hat. Aber hoffentlich hattest du auch viel spaß beim Testen, denn den hatte ich auch.

Hier noch dein von mir bearbeitetes Script (für DIGICII und aktuelles allbestbuild, für DIGiCIII Kameras sind alle get/set_prop 12 mit get/set_prop 133 zu ersetzen):
Code: Alles auswählen
@title zoom/focus Video

@param a Focuschangevalue >= 3 m
@default a 50
@param b Faktor x * Value (mm)
@default b 20
@param c Focuschangevalue >= 1 m
@default c 50
@param d Faktor x * Value (mm)
@default d 10
@param e Focuschangevalue >= 0,5 m
@default e 10
@param f Faktor x * Value (mm)
@default f 10
@param g Focuschangevalue >= 0,2 m
@default g 50
@param h Focuschangevalue < 0,2 m
@default h 10
@param i hyp.(1) or manual focus(0)
@default i 1

if i>1 then i=1
if i<1 then i=-1
if a<1 then a=50
if b<1 then b=20
if c<1 then c=50
if d<1 then d=10
if e<1 then e=10
if f<1 then f=10
if g<1 then g=50
if h<1 then h=10

get_prop 0 z
if z<>18 then goto "exep_video"

print " half-press shoot button"
print " to stop video recording"
print " click Set for change"
print " hyp. or manual focus"
print "click any button to start"
wait_click

get_zoom z
get_focus r
get_prop 12 m
n=m
press "shoot_half"

print " >3000mm:",a*b
print " >1000mm:",c*d
print " > 500mm:",e*f
print " > 200mm:",g
print " < 200mm:",h

sleep 800
if m=0 then set_prop 12 1
sleep 800
press "shoot_full"
release "shoot_full"

:menue
get_near_limit o
get_far_limit p
get_hyp_dist q
if i=1 then k=q set_focus q endif
gosub "anzeige"

wait_click
if is_key "up" then set_zoom_rel +1
if is_key "down" then set_zoom_rel -1
if is_key "zoom_in" then click "zoom_in"
if is_key "zoom_out" then click "zoom_out"
if is_key "left" & i<1 then gosub "negative"
if is_key "right" & i<1 then gosub "positive"
if is_key "set" then i=i*(-1)
if is_key "shoot_half" then goto "end"
goto "menue"

:negative
if k>=3000 then k=k-(a*b)
if k>=1000 & k< 3000 then k=k-(c*d)
if k>=500 & k < 1000 then k=k-(e*f)
if k>=200 & k < 500 then k=k-g
if k<200 then k=k-h
set_focus k
return

:positive
if k>=3000 then k=k+(a*b)
if k>=1000 & k< 3000 then k=k+(c*d)
if k>=500 & k < 1000 then k=k+(e*f)
if k>=200 & k < 500 then k=k+g
if k<200 then k=k+h
set_focus k
return

:anzeige
print " Focus:", k
print " near Limit:", o
if p=-1 then print " far Limit: inf" else print " far Limit:", p
print " hyp Dis:", q
if i=1 then print " hyp Focus" else print " manual Focus"
return

:end
click "shoot_full"
sleep 2000
set_zoom z
set_focus r
set_prop 12 n
cls
end

:exep_video
print "Please choose Video-Mode"
end


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

Beitragvon pieps » 15.02.2008, 18:51

Hallo CHDKLover,

ich freue mich wenn es Dir gefallen hat.
Es war mein 1.Script und jede konstruktive Kritik ist
willkommen.

Ich werde die überarbeitete Version von Dir mit Freude testen :)

Gruss Pieps
pieps
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 30
Registriert: 08.01.2008, 17:42
Wohnort: Saarland

Beitragvon pieps » 16.02.2008, 17:12

Hallo CHDKLover,

funktioniert bestens.

für DIGiCIII Kameras sind alle get/set_prop 0 mit get/set_prop 49 zu ersetzen

if z<>18 then goto "exep_video"

18 ist für DIGiCIII Kameras in 2597 zu ändern

Gruss Pieps
pieps
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 30
Registriert: 08.01.2008, 17:42
Wohnort: Saarland


Zurück zu Code-Ecke

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 23 Gäste