目次
前
次
ハレーション対策
昼間の太陽光が入る部屋では、人工網膜チップが
ハレーションを起こしてしまいます。
カメラで考えると、絞りが開いた状態なので、露光時間
を調整できるようにします。
人工網膜チップのマニュアルを読むと、レジスタ2、3に
露光時間を設定できるようになっていると記されています。
露光時間は、16μsの整数倍(0〜65535)で決めることに
なっています。そこで、露光時間を与えると、倍数を算出
するスクリプトを記述しました。
露光時間を、μsのオーダで入力し、計算ボタンを押すと
16進と10進で表示します。
このTcl/Tkのスクリプトは、以下です。
#!/bin/sh
wm title . "calculate exposure time"
# clear counter
set etime 0
set ncount 0
# add menu on TopLevel
. configure -menu .mnuTop
menu .mnuTop
# menu title and context
.mnuTop add cascade -label File -underline 0 -menu .mnuTop.file
menu .mnuTop.file -tearoff no
# add sub menu "Quit"
.mnuTop.file add command -label "Quit" -command {exit}
# set window size
set w 1000
set h 1000
entry .edtEtime -textvariable etime
label .lblUnit -text "us"
label .lblNcount -textvariable ncount
button .btnCalc -text "calculate" -command {CalcX}
pack .edtEtime
pack .lblUnit
pack .lblNcount
pack .btnCalc
##### procesure #####
proc CalcX {} {
global etime ncount
# get parameters
set x $ncount
set result [expr $etime / 16]
set ncount [format "0x%04x(%d)" $result $result]
}
テストファームウエアには、指定レジスタの値を個別に
設定する機能があります。値は、16進で設定するので、
16進表現して、入力するのに再度計算する手間を省き
ました。
露光時間を変えただけでは、どのような画像になるのか
見当もつかいないので、入力画像を評価するシステムを
考えます。
画像入力システム
テストファームウエアを利用すると、人工網膜チップ内蔵
カメラから、画像を取得できます。
取得した画像は、10進数を羅列したテキストデータなので
PGM形式ファイルに変換するスクリプトを作成します。
Tcl/Tkのファイル名をダブルクリックし
テキストファイルを指定します。
メニューからSaveを選択して、ダブルクリックします。
テキストファイルから、PGM形式ファイルを生成します。
PGM形式ファイルのままでは、扱いが面倒なので、imagemagik
を利用して、GIF形式にするように指示を出します。
このTcl/Tkのスクリプトは、以下です。
#!/bin/sh
wm title . "GIF supporter"
# clear file names
set fname ""
set pname ""
set fd_in ""
set fd_out ""
set fd_target ""
# add menu on TopLevel
. configure -menu .mnuTop
menu .mnuTop
# add sub form
.mnuTop add cascade -label File -underline 0 -menu .mnuTop.file
menu .mnuTop.file -tearoff no
# add sub menu "Open"
.mnuTop.file add command -label "Open" -command {OpenText}
# add sub menu "Save"
.mnuTop.file add command -label "Save" -command {SaveImage}
# add sub menu "Quit"
.mnuTop.file add command -label "Quit" -command {exit}
# declare image file
image create photo input_image -file $fname
# set window size
set w 1000
set h 1000
label .lblTxt -textvariable fname
label .lblPgm -textvariable pname
pack .lblTxt
pack .lblPgm
#######################
# Open Text procedure
#######################
proc OpenText { } {
global fname pname fd_target
# set file types
set ftype {{ "text Files" .txt} { "All Files" * }}
# get file name from built-in tool
set fname [tk_getOpenFile -filetypes $ftype -parent . ]
# create file name
set xlist [split $fname "."]
set xlist [split $xlist "/"]
set xlist [lindex $xlist end]
set pname [lindex $xlist 0]
set fd_target "$pname.gif"
set pname "$pname.pgm"
}
#######################
# Save Image procedure
#######################
proc SaveImage { } {
global fname gname pname fd_target
# open files
set fd_in [open $fname "r"]
set fd_out [open $pname "w"]
# save header
puts $fd_out "P2"
puts $fd_out "128 128"
puts $fd_out "255"
# justify context
set i 0
set obuf ""
while { [gets $fd_in sbuf] >= 0 } {
# check item count
if { [llength $sbuf] < 3 } {
continue
}
# store
set tmp [string trimright $sbuf " "]
set obuf "$obuf$tmp "
# increment
incr i
# judge
if { $i == 8 } {
set pgm [string trimright $obuf " "]
# show
puts $fd_out $pgm
# prepare next
set i 0
set obuf ""
}
}
# close
close $fd_in
close $fd_out
# convert
tk_messageBox -type ok -message "convert $pname $fd_target"
#exec "convert $pname $fd_target"
}
DOS窓で、PGM形式からGIF形式に変換します。
タイプ量を減らすために、バッチファイルを作成して
使います。バッチファイルの内容は、以下です。
convert %1.pgm %1.gif
GIF形式ファイルが生成できたならば、ピンポイントで
内容を表示できるように、スクリプトを記述します。
Tcl/Tkのファイル名をダブルクリックし
テキストファイルを指定します。
メニューからOpenを選択して、ファイルを指定します。
ファイルファイルの画像が表示されます。
このTcl/Tkのスクリプトは、以下です。
#!/bin/sh
wm title . "Image Viewer"
# clear file names
set fname ""
set input_image ""
# add menu on TopLevel
. configure -menu .mnuTop
menu .mnuTop
#
.mnuTop add cascade -label File -underline 0 -menu .mnuTop.file
menu .mnuTop.file -tearoff no
# add sub menu "Open"
.mnuTop.file add command -label "Open" -command {OpenImage}
# add sub menu "Quit"
.mnuTop.file add command -label "Quit" -command {exit}
# declare image file
image create photo input_image -file $fname
# set window size
set w 1000
set h 1000
# define image canvas with both scroll bar
canvas .drawcanvas -background white -width 200 -height 200 \
-scrollregion "0 0 $w $h" -yscrollcommand ".yscrl set" \
-xscrollcommand ".xscrl set"
scrollbar .yscrl -command ".drawcanvas yview"
scrollbar .xscrl -command ".drawcanvas xview" -orient horizontal
pack .yscrl -side right -fill y
pack .xscrl -side bottom -fill x
pack .drawcanvas -side left -fill both -expand yes
.drawcanvas create image 0 0 -image input_image -anchor nw
#######################
# Open Image procedure
#######################
proc OpenImage { } {
# set file types
set ftype {{ "gif Files" .gif} { "All Files" * }}
# get file name from built-in tool
set fname [tk_getOpenFile -filetypes $ftype -parent . ]
if { [regexp {ppm$|gif$|pgm$|pbm$} $fname] > 0 } {
input_image read $fname
}
}
Windowsのアプリケーションとすると、UNIXやMac上で使えないので
Tcl/Tkを利用して、マルチプラットホームに対応しました。
同じ処理をするのに、WindowsのRDAツールであるC#等を使うと
Tcl/Tkのコード量の倍以上になるでしょう。
コンパイル、リンクも必要なので、開発時間が長く効率が悪いです。
画像入力サンプル
作成した画像入力システムで、露光時間を変えて
撮影してみました。
左側は、露光時間を長くしています。
周囲が暗い場合は、露光時間を長くするように
ファームウエアを改良すればよいと理解できます。
上の写真では、ラインの位置が少し変わっていますが
同じカメラで、高さを変えて撮影したため、位置ズレ
が出ています。
目次
前
次