uBASIC用户指南中文版
uBASIC是什么?
uBASIC是与普通的BASIC语言极相似的解释型编程语言,在佳能相机的CHDK外挂破解固件中使用的仅是uBASIC语言的一个微小的子集,但用来控制相机的各种操作已经足够了。uBASIC是CHDK所包含的编程组件,通过编程来进一步拓展CHDK固件的功能。通过运行uBASIC编写的脚本,可以使相机按预定的程序自动地执行各种操作,比如运动检测(功能相当强大),自动调整光圈、快门,包围曝光,甚至USB线控拍摄等等。只要有任何一种编程语言的基础,要学会uBASIC相机控制脚本语言都是非常容易的,不过要灵活地运用它实现很多特殊而有趣的功能则需要一定时间的练习与实践了。
开始做
在开始写脚本前应该记住这些内容:
可以使用任何文本编辑器编写脚本。但应该确定它被保存为纯文本格式。不要用WORD之类的高级编辑器,这些编辑器将会插入隐藏的文件头信息并使用非标准的ASCII字符作为回车/换行命令、引号及其它字符。简单的文本编辑器就足够了,但是即使这样也要当心不要使用TAB进行文字缩进(例如在Windows系统中可以使用记事本或更适用的Crimson,在Linux中使用nano 等)。Mac用户,应该确定你的脚本是用UTF-8编码。
由于CHDK中没有提供中文字库,有网站可以下载到CHDK的中文字体与中文菜单文件,但通常都无法实现所有汉字的完全显示,所以不要在uBASIC脚本代码中使用中文,否则将出现乱码。
保持所有命令写法为小写字母,变量应区分大小写(如a和A不是同一个变量)。
在CHDK Build119及之后的版本中脚本大小不能超过8k(8192字节),在CHDK Build119及更早的版本中大小限制为2K(2048字节)。
要知道不是所有的命令都能在所有的相机中运行。假如你打算共享你的脚本,应尽量保持脚本的通用性,除了你有特别需要而必须使用针对于指定相机的命令。应尽量提供一个更通用的版本以让其它相机用户共享。
假如使用早期的CHDK版本,在本手册中列出的一些命令将无效,并引起错误。应尽量从Wikia的官方网站下载CHDK的最新版,网址:https://www.doczj.com/doc/6612186929.html,/wiki/CHDK。(遗憾!该网址已经被国内网络运营商屏蔽,
要想打开它,建议用傲游浏览器上代理服务器。)
应保持脚本的简洁高效!微型uBASIC解释每一行脚本耗费10毫秒。假如你的脚本有10行,将耗费1/10秒,100行将耗费整整1秒……。这将会对某些高速应用产生很大影响。即使是rem声明也会耗费10毫秒进行处理;应该谨慎地使用它们。在0.5.5版及以后的版本中,多达100条rem声明和标签在被执行之前,将要等待10毫秒。
要记住脚本和CHDK通过从一个协作的多任务系统中窃取时间而运行——不是像在Linux或Windows系统中那样插入一个时间片。必须用一个“sleep…”给相机运行让出时间,以让相机能做一些必要的工作。例如,一些print之后的sleep将给相机一些时间使写到LCD上显示的信息不被破坏。“sleep 100”似乎是一个常用值,但是依赖于相机和其它因素,在某些操作之后你可能需要sleep为300~400毫秒。如果失败,可能导致(间歇性的!)相机挂起或关闭(相机中的看门狗会使发生错误时相机关闭)。
假如你写了一个有趣的脚本,请和其它脚本写作者分享,那么我们会向你学习!脚本创作初学者有时是最有创造力的!
两个新的脚本菜单选项已经被加入到一些特殊的版本,请到固件用法页面查看这些特征。通过使用这两个选项并结合这些脚本,你能在相机中执行任何脚本。这将给你一个无限的自定义拍摄模式和USB远程功能。你可能想要用这些扩展的特征写脚本。
脚本头部
脚本头部命令有3个:@title、@param、@default
在查看脚本时经常会看到像下面这样的部分:
@title Interval shooting
@param a Shoot count
@default a 5
@param b Interval (Minutes)
@default b 0
让我们逐行了解其意义及它们怎么被CHDK使用。
@title Your Script Title
当用CHDK载入脚本时,进入“Scripting Parameters”菜单选项将显示这个标题。它将出现在这行之下“----Current Script----”,当处在
@param x (label)
@default x n
这段代码设定在脚本中使用的用户可定义变量的初始值,经常用来设置
你想要的曝光量、延时长度、包围曝光步数等等。最终用户能从“----Script Parameters----”菜单项中改变这些变量的值。在子菜单中,它们将出现在“----Script Parameters----”这一行的下边。
@param x (label)
这一行中的x可以是从a到z的任一个小写拉丁字母。(label)是将要出现在“----Script Parameters----”列表中的文字,要让最终用户知道他们在改变哪一个变量(例如拍摄张数,多少步等等)。标签文字的最大长度是26个字符(包含空格)(为了适应参数菜单空间)。
每一个脚本中可以使用多达10个@param声名(用户可控变量)。
注:现在最新版本的CHDK允许你使用多达52个变量,a to z和A到Z。但是用户可定义变量必须用小写字母,也应该知道,小写和大写变量是无关的,假如你用一个小写的j作为一个变量时,它与用J并不一样,反之亦然。
@default x n
这行声明建立默认值,或者你的变量(小写字母)的初始值,“x”是上边那个@param所声明的变量,“n”是开始运行时的默认值。这个值仅仅在脚本第一次载入时使用。
注:假如没有@title命令时,将会使用脚本的文件名代替。假如没有@param命令时,CHDK会假定有3个可调节的变量:a,b和c。记住:当命名@param变量时,只能用a~z的小写字母。
在默认变量值已经在这里被定义后,最好添加一些代码行,以确保用户输入0值或超出需要的数值。例如:
If a<2 then let a=5
如果你规定了变量a的用户参数最小为2,那么假如他们改变这个设置为0为1时,上边的示例将自动将那个变量的值增大到默认值5。
在你建立了变量参数后,那么来到你的脚本的核心,做实际工作并让相机干什么的部份,在做这些事时,需要什么按钮或什么命令需要被执行。由于我们运用的是庞大的uBASIC程序语言的一个非常小的子集,我们只需要列出和解释那些仅仅对CHDK uBASIC有效的脚本用法。
uBASIC程序基础
“脚本”是在CHDK环境中运行的简单小程序,能按计划执行相机中的一些功能。
大多数的程序被设计为简单地重复一些命令。以便使它们以适当的顺序工作,并重复一定的次数,这些命令通常包含一些简单的循环和计数,并在继续执行下一个命令之前对某些条件进行检测,或者在最后结束程序的运行。
那几个方面都能使用BASIC程序的数字计数器、循环做到,一些内建的
uBASIC命令用于简化这些任务:for/to/next(计数),do/until(条件),if/then/else (条件),while/wend(条件)。
在本用户手册中,命令为分为“逻辑命令”(控制程序流向/顺序)与“相机操作命令”(控制或获取一些相机操作的状态)。
在这个版本的uBASIC中,每一行只能容纳一条命令。一个uBASIC程序总是以一个“end”命令结束,以使解释程序知道这段脚本已经完成。
uBASIC变量
变量使用单个拉丁字母表示:a~z和A~Z。所有变量是32位带符号整数(范围从-2147483648到+2147483647)。然而,由于当前主版本存在一个BUG,导致超过6位的十进制数字不能被指定(即999999是当前可用的最大十进制数值)。
标签
一个标签必须仅在一行中声明,并且以一个冒号“:”开始。
“restore”标签
在uBASIC中有一个重要的预定义标签:
:restore
当全按相机快门键时uBASIC会试图跳转到标签“restore”。(在你过早地终止一个脚本时发生)。
这个标签的目的是允许脚本编写者在他们的脚本被其它的一些设置打断时,编写一段“最后清理”例程用来恢复相机到“普通”设置,这可能是很重要的,例如,假如你的脚本使用了自动对焦锁,这时过早地中止可能会使相机处于一个不能对焦的状态。那么通过使用restore标签你能包含一段代码,清除自动对焦锁及点亮显示屏。
uBASIC中可用的数学运算符
+ 加
- 减
* 乘
/ 除
% 求余(看后边的解释)
< 小于
> 大于
= 等于
<= 小于或等于
>= 大于或等于
<> 不等于
& 与运算
| 或运算
^ 异或运算
绝大多数的运算符都容易理解,但%(求余)运算需要用一段短小的代码加以解释。
例如:
当把用s代表的总秒数转化成多少分多少秒显示时,代码如下:
print “Total Time:” , s/60; “min”, s%60; “sec”
当s的值是328秒时,那么显示结果如下:
Total Time: 5 min 28 sec
注意:&、|、^ 这三个运算符是位运算符,而不是逻辑运算符,逻辑运算符是and,or,not。
位运算示例如下:
e=5|3
print e
将返回“7”。
5&3的结果为“1”
5^3的结果为“6”
逻辑运算:and, or, not
not 逻辑非最好用一个圆括号组成,即not(表达式)
and 逻辑与
or 逻辑或
子例程
在复杂的程序任务中,把程序分割成小的“子例程”,然后通过gosub命令调用通常是有益的。一个子例程几乎可以是任何内容,但它通常用来编写一个将会被多次调用的命令集,通过把这段代码往到一个字例程中,然后在主程序内使用gosub “标签名”的方式调用它,可以避免一遍又一遍地重复编写同样的命令集。子例程通常放在主程序的后边,以一个可供gosub“labal”调用的标签开始,并以return命令结束,以使这部分代码执行完后能返回调用它的位置。
gosub和goto是相似的,但是应该尽量不用goto,除非你知道你在做什么。gosub总是会从一个子例程中一到达return命令时就返回主程序。goto则
不能做这样的动作。
逻辑命令
uBASIC中可以使用的逻辑命令有:cls、rem 、exit_alt、sleep、if/then/else、do/until、while/wend、for/to/step/next、select/case、gosub、goto、get_day_seconds、get_tick_count、print、print_screen
?cls
cls表示“清屏”。这将会在任意的print声明后轻易地清除整个屏幕内容。而不是必须通过发送5条print “”命令完成这一操作。
?do/until
用于创造一种不断地循环往复的运行方式,或者等待一些条件变为真,在do/until循环中的代码总是至少执行一次(不像while/wend循环)用法:
do
其它命令行
……
until 关系表达式
这里的关系表达式可以是任意的逻辑表达式,当它的值为真时,循环结束。
例如:
rem set some starting values for the variables
y=0
x=5
rem start do-loop
do
rem increment x by 10 each time
x=x+10
rem increment y by 1 each time
y=y+1
rem print results to viewfinder mini-console
print “This DO loop happened”, y; “times.”
rem repeating do-loop until x is equal to the v
until x>=55
end
end
这将是你的程序执行的最后一行。它告诉脚本停止所有的操作,并将相机的控制权返还给你。在结束一个脚本之前,最好恢复脚本在初始化期间和运行期间所改变的相机的所有设置,以使最终用户不必恢复脚本引起的所有按键和菜单改变。
?exit_alt
这个命令用于离开
?for/to/step/next
这些命令用于建立简单的计数循环,例如:
for n=2 to a step 2
sleep t
print “Shoot”, n, “of”, a
shoot
next n
?get_day_seconds
该函数返回从午夜开始时的秒数,注意这个函数格式有点儿不同于其它标准的uBASIC函数。
用法:
t = get_day_seconds
?get_tick_count
这个函数返回相机电源打开后所经过的毫秒数,,注意这个函数格式有点儿不同于其它标准的uBASIC函数。
用法:
t = get_tick_count
?gosub
呼叫指定的子例程,执行后立即返回gosub后边的命令。
一个简单的gosub例子:
for x=1 to 10
gosub “display”
next x
:display
print x
return
下边是一个更长的例子,用于拍摄3张照片,并增加ISO设置:
shoot
for i=1 to 3
gosub “incISO”
shoot
next i
for i=1 to 3
gosub “decISO”
next
end
:incISO
click “menu”
[some more clicks]
return
:decISO
click “menu”
[some more clicks]
return
?goto
立即跳转到指定的标签。
@title Interval Shooting Non-stop
@param a Interval (Minutes)
@default a 0
@param b Interval (Seconds)
@default b 5
@param c Interval (10th Seconds)
@default c 0
t=a*60000+b*1000+c*100
if t<100 then let t=5000
n=1
print “Interval shooting.”
print “Until you interrupt it.”
print “Use with caution.”
sleep 1000
:shot
print “Shot number”, n
shoot
n=n+1
sleep t
goto “shot”
?if/then/else
示例:
if a > 2 then gosub “subroutine1”
if a > 2 then gosub “subroutine1” else gosub “subroutine2”
let
用于执行变量赋值,可以省略,如:let a=2 可以简写为a=2
用于在显示屏的微控制区域显示文本或数值。
语法:print “25 characters of text”
注意:每行应限制在25字符以内。可以包括变量值或整数表达式。
例如:
rem Print total duration of interval to viewfinder
print “Total time:”, t*a/60000; “min”, t*a%60000/1000; “sec”
sleep 1000
rem Start actual camera operation in a loop
print “Shot 1 of”, a
shoot
for n=2 to a
sleep t
print “Shot”, n, “of”, a
shoot
next n
注意:逗号表示输出一个空格,分号则无空格
例如:
print “C”,”H”,”D”,”K”
print “C”;”H”;”D”;”K”
输出结果是:
C H
D K
CHDK
?print_screen
脚本输出到微型控制屏幕上的内容都能被写入到相机SD卡中的一个文
件中,例如“\CHDK\LOGS\LOG_0001.TXT”。
要激活这个捕捉功能,应在你的脚本开头包含下边脚本:
print_screen n
n是一个非零的正整数常数,变量或表达式,取值范围为1~9999。一个新文件(例如n=1时,\CHDK\LOGS\LOG_0001.TXT)被创建,或者如果它已经存在,那么它将被清空。要取消屏幕转储,请使用如下命令:print_screen 0
在一个脚本中屏幕转储能被多次使用,但是如果你不想丢失先前的记录内容,请注意增加“n”的值。
“n”的值可以超过9999,但是文件名仍然只能包含4位数,将只能保留后边的4位数,如果“n”为负数,则会自动转为正数编写文件名。也就是说只能限制到10000个记录文件以内。
示例:
@title printscreen test
@param a None
@default a 0
@param n FileNum
@default n 1
print_screen n
print “START”, n
print_screen 0
n=n+1
print “Not written to file”
print_screen n
print “This should be written to next file.”
print “a=”;a
print_screen 0
end
这将创建包含下列内容的两个文件:
\CHDK\LOGS\LOG_0001.TXT:
START 1
\CHDK\LOGS\LOG_0002.TXT:
将写入下边的内容
a=0
random
返回一个最小值与最大值之间的随机整数。
例如:
playsound random 3 6
将以随机的顺序播放声音3,4,5,6(假如在一个循环中重复该代码) rem
注释语句,会耗费程序运行时间,并占用内存。
select/case功能
示例:
for x=1 to 7
select x
case 1; gosub “new”
case 7; goto “EXIT”
case 2,4; print “x=2 | x=4”
case 2 to 5; print “x=3 | x=5”
case_else print “x=6”
end_select
next x
:EXIT
print “ready”
end
:new
print “sub”
for y=1 to 2
select y
case 1; print “y=1”
case_else print “y=2”
end_select
next y
return
第二个select例子(在“new”子例程之中)实际上是一个低劣的示例,在这个情况下最好用一个单一的if/then/else声明。
?sleep
这将暂停脚本以允许一些动作发生,或在下一个动作发生以前进行延时操作,经常会需要在脚本中插入sleep,以使相机执行一些必要的动作。
语法:sleep x
假如x为1000时,即为1秒(1000毫秒),但定时器分辨率仅能达到10~30毫秒。
?while/wend
与do/until循环相似,不同的是while/wend之间的代码有可能从不被运行。
示例:
x=0
while x<200
x=x+25
print “The value of x is”, x
wend
相机操作命令
这些命令用来让你的脚本控制相机,与手动控制很相似。通过手指按键能做到的所有事情,几乎都能通过这些脚本命令做到。在设法保持你的脚本在8K字符(8192字节)以内的情况下,你的脚本的复杂性和时间线仅仅受限于你的想像力。
相机命令可以写为下边3种类别的命令方法:
?click “按键名”
瞬间按键,用作即刻执行一次命令。这是发出一个相机命令的最常用方
法。
?press “按键名”
按下相机按键,并且保持不松开,它持续按下,直到对同样的按键名发出release命令。某些相机命令仅能在使用期间当一个按键被持续按下时被使用。
例如:在S系列相机中进行手动对焦时,当发出聚焦命令时,MF键需要被持续按下。或者当在高速触发模式拍摄时,快门键需要持续按下,在必要的时候发出press “shoot_full”命令。
?release “按键名”
用于结束press “按键名”命令。
除了经常使用的shoot命令之外,其它能手动按下的所有相机按键命令都可以在脚本中用这样的语法调用。shoot被单独使用,前边没有click,press 和release命令方法。
所有按键命令(除shoot外)的写法都像下边这样:
命令方法“按键名”
这里的命令方法可以是click,press,或release,按键名必须被包含在双引号内。
例如,一个在A系列相机中生成AE锁和AF锁的简单脚本用到了所有3种命令方法:
sleep 2000
press “shoot_half”
sleep 1000
click “erase”
click “down”
release “shoot_half”
?autostarted
如果脚本自动启动则返回1(true)
?click/press/release
像上边描述的那样,用来模拟一个相机按键动作,有效的按键名在下边列出:
“display”、“erase”、“menu”、“print”、“set”、“shoot_full”、“shoot_half”、“up”、“down”、“left”、“right”、“zoom_in”、“zoom_out”
注:
“shoot_half”:在昏暗的光线下,使相机捕捉到焦点可能会花去2秒或更多的时间。假如你的脚本使用这个命令自动对焦,并被设计用于低照度下的拍照,最好在一个press “shoot_half”命令之后使用一条sleep x命令,这里x 取值可以在1500~2500之间。甚至最好在press “shoot_half”之后使用下边代码:do
get_prop 206 p
until p=1
这样它等待的时间将会和对焦锁定的时间一样长。
示例一:(包围曝光)
@title EXP bracketing
@param a Number of ±steps
@default a 2
@param b Step size (1/3EV)
@default b 3
if a<1 then let a=2
if b<1 then let b=3
sleep 1000
print “Preparing...”
click “erase”
for n=1 to a*b
click “left”
next n
for s=1 to a*2
print “Shoot”, s, “of”, a*2
shoot
for n=1 to b
click “right”
next n
next s
print “Shoot”, a*2+1, “of”, a*2
shoot
print “Finalizing...”
for n=1 to a*b
click “left”
next n
click “
end
示例二:(变焦操作)
for s=2 to a
for n=1 to b
print “Zooming-in”, n; “
click “zoom_in”
sleep 600
next n
print “Shoot”, s, “of”, a
shoot
next s
在每一步变焦放大之后暂停0.6秒。
?get_autostart
读出脚本配置中的自动启动属性。(0=off,1=on,2=once)
(参见set_autostart)
?get_display_mode
返回显示模式(仅在拍摄模式),不管是DigicII还是DigicIII的相机(它的一个用处是帮助获得CHDK脚本的通用性)。
0=显示信息图示
1=不显示信息图示
2=LCD 关
3=EVF(电子取景器)
?get_drive_mode
返回驱动模式(像属性页中描述的那样):
0=单张
1=连拍
2=定时器(在DigicII中)
3=定时器(在DigicIII中)
定时器在通用性的脚本中运用起来稍微有些困难,然而配合get_propset 使用则可以实现。
?get_ev
返回属性选项25/107(DigicII/DigicIII)。
?get_exp_count
返回一段时期内的拍摄张数。有一些时候是有用的,例如,在触发模式下想要拍摄3张后停止。在SD1000中返回最后曝光的文件序号。
?get_flash_mode
返回闪光模式(0,1,2=自动闪光,开,关)
?get_flash_ready
如果闪光灯充电完成则返回非0值。
?get_focus
(CHDK 125版及以后)
语法:
get_focus(返回焦距值(毫米)并放入变量x中)
(参见set_focus)
?get_histo_range
用法:get_histo_range
返回
这个命令返回所拍的最后一张照片的直方图信息,它执行读RAW缓冲区(但是不需要启用RAW存储功能:拍摄的直方图数据取自于被抛弃或进一步处理之间的RAW数据)。
在非常暗的场景中它获取的信息是非常有用的:这时,实时预览屏幕全黑,然后RAW缓冲区(通过长时间的曝光)将获得一个图像。
它依赖于shot_histo_enable命令:假如shot_histo_enable没有设置,get_histo_range返回-1值,因此shot_histo_enable必须首先被启动。
这是必须的,因为在每次拍摄后计算拍摄直方图会花去一些时间。因此,在默认情况下拍摄直方图是禁用的,需要用shot_histo_enable启用它。
示例:
rem enable shooting histogram
shot_histo_enable 1
shoot
sleep 100
rem let's read histogram of the shot that was just taken
h=get_histo_range 100 800
rem h contains the percentage of pixels that are
rem between 100/1024 and 800/1024
?get_IS_mode
返回IS模式。
0, 1, 2, 3 = continuous, shoot only, panning, off
?get_iso
(CHDK Build 125 及以后版本)
语法:
Get_iso x (ISO的值存放到变量x中)
(参见set_iso)
?get_mode
返回是拍摄模式还是回放模式处于活动状态。在打算运行特定的模式时用于切换脚本。(所有有效脚本的99%都像这样!)
在拍摄模式中返回0,回放模式中返回1,当相机处于拍摄模式且模式转盘设置为视频模式时返回2。
?get_movie_status
返回视频拍摄状态,能用于取代sleep命令检查。
0-视频拍摄停止
1-视频拍摄暂停
4-拍摄进行中
5-拍摄停止但相机仍然在向SD卡中写入视频。
?get_nd_present
如果没有ND(中密度滤光镜)存在时返回0,如果有ND存在及实际光圈不存在时返回1,两者都存在时返回2。
?get_orientation_sensor
在DigicII/DigicIII中都返回方向传感器的角度。
?get_platform_id
返回平台ID号(整数),通过使用它,能编写依赖于具体平台的脚本。
?get_prop
?get_propset
返回属性集,表示你的相机是用DigicII/DigicIII的哪一个属性集工作。返回1(属性集1)或2(属性集2)。在这里查找你的属性选项:https://www.doczj.com/doc/6612186929.html,/wiki/PropertyCase
?get_quality
返回当前捕捉质量等级的设置,与相机OS无关。要了解可能的值请查看属性选项。(一般情况下为0~2, 2是最差的等级)
?get_resolution
返回当前捕捉分辨率的等级设置,与相机OS无关。要了解可能的值请查看属性选项。(一般情况下为0~8, 相当于佳能设置项)。
?get_shooting
返回属性选项205(DigicII)/206(DigicIII)
?get_temperature
用法:
get_temprature n
在这里:0返回光学元件温度1返回CCD元件温度2返回电池温度。
它能被指定到一个变量或直接打印输出。
例如:
a = get_temperature 0
print “Optical Temp:”,a
或:
print “Battery Temp:”,get_temperature 2
?get_time
返回相机当前时间的元素。
用法:
get_time 0 (返回秒)
1 (分)
2 (时)
3 (日)
4 (月)
5 (年)
?get_av/tv, set_av/tv等等
这是几个用来获得和设置光圈、快门速度的命令。他们仅工作在手动模式(你能完全地在任意模式下改变这些设置,但他们只在手动模式下有效,可能在Av和Tv模式下也行)。下边是这些命令的测试脚本。
这些命令是:
get_av target
get_tv target
set_av val
set_av_rel val
set_tv val
set_tv_rel val
target 是一个变量名(a~z),val是一个表达式。
下边是一个设置和打印这些值的例子:
:set_get
set_av c
set_tv b
print “A V,TV set to”,c,b
sleep 1000
click “shoot_half”
sleep 100
get_av n
get_tv m
print “A V,TV got”,n,m
end
你能相对于现有的值对设置进行改变(这样可以使包围曝光更容易且更快):
rem increase light (1/3+1/3 steps)
set_tv_rel 0-1
set_av_rel 0-1
shoot
end
用法注解
当使用set_tv, set_tv_rel, or set_av, set_av_rel命令时,发现如果插入press、click “button”这样的一系列命令时可能会使上述命令失效。如果在测试脚本时发现这些命令不能改变快门速度或光圈,试着将它们的位置移到任意press “shoot_half/full”或click “timer”(S系列特有)命令之前。set_tv 命令应该放在
它将工作以前,试图将它放在实际拍摄以前的其它位置,脚本将不能正常工作。
佳能固件会在许多方面使用这些“TV”值,依赖于操作模式。最常用的方面是在半按时自动曝光。因此这些属性选项必须在自动曝光完成之后设置,否则佳能固件将会覆盖它们的操作,使它们无法生效。
?get_zoom
语法:
get_zoom x(变焦步数值被放置在变量x中)
范围:
A-系列: x = 0 ~8 或14 (9 or 15 步)
S-系列: x = 0 ~128 (129 步)
(参见set_zoom, set_zoom_rel, set_zoom_speed.)
?get_zoom_steps
返回最大的变焦级数,与相机硬件无关(可用于通用性的变焦脚本)。例如:在A620中将返回8,在S3IS中将返回128。
?is_key
(参见‘wait_click and is_key’)
?is_pressed “key”
在执行这个命令时,检测一个键是否被按下。参见wait_click 与is_key。
?md_detect_motion(运动检测命令)
注:有大量的讨论通过使用适当的方法利用这个令人难以置信的具有高度适应性、用户可定制的功能。一个漫长的讨论是怎么用最快的反应时间捕捉闪电发出的光,现在已经有人发布了两种具有最快检测速度的脚本。
我不是这个功能的作者,那么在下面的信息中可能会存在一些错误。希望作者能检查一下这些是否全都正确。核心部分来自于MX3的演示和测试脚本文件。
语法:
md_detect_motion a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p
这个命令的参数功能是设置的核心部分,各参数含义如下:
a 表示图片切割的列数
b 表示图片切割的行数
c 表示测量模式(Y,U,V,R,G,B)--U=0,Y=1,V=2,R=3,G=4,B=5
d 延时
e 比较间隔(毫秒)
f 门限(触发检测的表格差异度,范围0~25)
g 画网格线(0=no,1=yes)
h 返回动作检测时表格的变化数
可选参数:
i 区域(masking)模式: 0=无区域,1=包含,2=排除。
j 区域第一列
k 区域第一行
l 区域最后一列
m 区域最后一行
n 参数:1=使立即拍摄,2=记录调试信息到文件,4=从内存转储活动视图图像到一个文件,8=立即拍摄,不释放快门。
o 像素跨度――调节速度与精确度(1=使用每个像素,2=使用每两个像素等等)
p 到开始触发的延时毫秒数,对校准和画网格选项有用。
最少变量数应该像如下命令这样设置(8个参数):
md_detect_motion a, b, c, d, e, f, g, h
参数详解:
a和b(输入参数):定义屏幕被分割的列数与行数,通过将屏幕分割成表格,以对各单元格进行运动检测。(如果值小于0或表格格数大于1024[即a ×b>1024],则默认设置为3×3。)
c(输入参数):像素检测模式,可以基于亮度(Y)、U色差分量、V色差分量或R、G、B颜色分量值检测运动。如没有特别需要,应使用亮度Y模式(即默认值c=1)。(0-U,1-Y, 2 -V, 3-R, 4 -G, 5 -B.)相关知识:YUV是被欧洲电视系统所采用的一种颜色编码方法(属于PAL),是PAL 和SECAM模拟彩色电视制式采用的颜色空间。其中的Y,U,V几个字母不是英文单词的组合词,Y代表亮度,uv代表色差,u和v是构成彩色的两个分量。在现代彩色电视系统中,通常采用三管彩色摄影机或彩色CCD摄影机进行取像,然后把取得的彩色图像信号经分色、分别放大校正后得到RGB,再经过矩阵变换电路得到亮度信号Y和两个色差信号R -Y(即U)、B-Y(即V),最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。这种色彩的表示方法就是所谓的YUV色彩空间表示。采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V 信号分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的相容问题,使黑白电视机也能接收彩色电视信号。
d(输入参数):检测暂停,设置运动检测事件发生的时间限制,在这段时间结束之后脚本命令结束,检测表格计数将为0(h参数项)。它让md_detect_motion在一段时间内运行,在这段时间内如果没有检测到运动,则阻止下一条uBASIC命令执行(以毫秒为单位),直到该命令结束。如果在这段时间内检测到了运动,命令将立即结束,然后执行下一条命令(h将大于0)。当你想和MD一起定时地执行其它一些uBASIC命令时这将是有用的。
例如:MD例程等候变化10秒钟;如果没有检测到运动,则会在10秒钟之后继续执行一些其它的代码,如果检测到了运动,则马上结束检测,进入下一条命令。如果需要,还能再一次呼叫md_detect_motion恢复运动检测。实际上,暂停值(参数d)应该比触发延时毫秒数(参数p)更大,否则总是会得到返回变化数(参数h)=0。
e(输入参数):两张图片进行比较间隔的毫秒数,设置一个适当的值,可以使运动检测事件通过屏幕图像的快速或慢速改变引起触发。如果你需要过滤掉由那些快速移动对象频繁引起的微小变化(如风吹树叶,飞行的昆虫),应该增加这个值使采样时间间隔更大。这在对移动非常慢的对象进行运动检测时是很有用的,例如:蜗牛、粘菌、试图避开运动检测的缓慢移动的罪犯。
f(输入参数):能够触发检测的变化差异值,通过设置一个较大的门限值(0~255),可以防止“普通”操作触发检测,而以你期待的模式触发运动检测,通过设置一个较小的门限值,可以提高运动检测的灵敏度,即:小的运动变化、小的运动对象都可以检测到。
g(布尔型输入参数):决定检测表格的网格是否被显示,true(1)表示在屏幕上画网格(表格的检测区块),false(0)表示不画网格。
h(输出参数):达到足够触发运动检测的像素值有差异的表格数。这个变量用于决定在其变化超过指定门限值的表格数达到一定数量时,是否要拍摄。
示例:if h>0 then shoot
i(输入参数):剪取区域模式,决定一个区域是包含还是排除。可以将一个区域排除在运动检测触发之外,或只用一个指定区域进行运动检测(该区域由j,k,l,m四个参数确定)。取值为:0=没有剪取区域(默认),1=从运动检测中排除选择区域,2=仅用该区域进行运动检测
j,k,l,m:定义屏幕的一个子区域在进行运动检测时是限制在该子区域内部或者排除在该子区域之外。j,k为剪取区域左上角的列号、行号,l,m为剪取区域右下角的列号、行号。
n:参数:1=使立即拍摄,2=记录调试信息到文件,4=从内存转储活
动视图图像到一个文件,8=立即拍摄,不释放快门。(一般用0)o:像素跨度――调节速度与精确度(1=使用每个像素,2=使用每两个像素等等),对每像素进行采样将获得最大的检测精确度,但在某些情况下需要增大像素采样跨度,以获得更快的检测速度。
p:开始触发的延时毫秒数,对精确度调整(o)和画网格选项(g)有用,默认值是0.5秒。由于延时较小时,相机在触发进入下一次检测时,相机还在执行存储、处理等操作,屏幕图像还没有稳定下来,这将会使相机立即触发,进入拍摄死循环,所以应该尽量将这个参数设置为一个较大的数值。我在A540中拍摄jpg格式全尺寸图像时是把它设为4秒以上。如果你的相机处理速度够快,存储卡的速度也够快的话,可以尝试降低触发延时,以使相机尽快触发,进入下一次的运动检测状态。当然这个延时必须小于d参数设定的检测暂停时间,否则检测暂停时间一到,检测命令则将完成并退出,此时还未开始触发检测,不能进行任何运动检测操作,h参数将只能返回0,也就是检测不到运动改变。
示例:闪电捕捉脚本
rem Tested on A570IS, Allbest build 16
rem For bursts, set the camera in continuous shooting mode and set j>0
rem If j>0 in single shot mode, you will see your shot for j seconds on screen.
@title Fast MD with Burst/Preview 080205
@param a Columns
@default a 6
@param b Rows
@default b 4
@param c Threshold (0-255)
@default c 10
@param d Compare Interval (ms)
@default d 1
@param e Trigger Delay (0.1 sec)
@default e 42
@param f Rows to Exclude
@default f 0
@param g Pix-Step(speed/accuracy adj)
@default g 8
@param h Reg Mode(0-no,1-incl,2-excl)
@default h 0
@param i Measure Mode (1-Y,0-U,2-V)
@default i 1
@param j Burst/Preview (sec,0=off)
@default j 0
if a<1 then a=1
if b<1 then b=1
if c<0 then c=0
if g<1 then g=1
if f<1 then f=1
if j<0 then j=0
e=e*100
j=j*1000
print ">[";a;",";b;"] threshold: ";c