目次

ハレーション対策

 昼間の太陽光が入る部屋では、人工網膜チップが
 ハレーションを起こしてしまいます。

 カメラで考えると、絞りが開いた状態なので、露光時間
 を調整できるようにします。

 人工網膜チップのマニュアルを読むと、レジスタ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のコード量の倍以上になるでしょう。  コンパイル、リンクも必要なので、開発時間が長く効率が悪いです。

画像入力サンプル

 作成した画像入力システムで、露光時間を変えて  撮影してみました。  左側は、露光時間を長くしています。  周囲が暗い場合は、露光時間を長くするように  ファームウエアを改良すればよいと理解できます。  上の写真では、ラインの位置が少し変わっていますが  同じカメラで、高さを変えて撮影したため、位置ズレ  が出ています。
目次

inserted by FC2 system