目次

画像処理検討

 デバッグ処理コマンド'G'を利用し、画像データをSRAMに保存できます。

 SRAMに保存してある画像データを取得するには、コマンド'R'を使います。

 実際には、TeraTermProを利用して、H8に必要なコマンドを送信し
 データを取得しました。

 左クランクの画像を、デバッグコマンドで取得して表示すると
 次のようになります。



 画面上側には、中央に右から左に白線が走っているのがわかります。
 右から左に走る白線の下に、ぼんやりと霞のような白がありますが
 これは、照明の反射です。

 照明の反射が、0〜255の階調で、どの程度の数値になるのかを
 知るために、1ピクセル(0〜255)の数値で黒とみなす値を
 200、180、160、140、120、100、80、60、40、20と変化させてみました。



 上段の左から200、180、160、140、120と変化させています。
 上段の画像を見る限りでは、照明の反射は確認できません。

 下段の左から100、80、60、40、20と変化させています。
 80あたりから、照明の反射を確認できます。

 照明反射の影響を少なくするため、閾値を決めて、その値を
 下回った場合には、0にしました。

 より確実に閾値を決めるためには、カメラ側からLEDで光を照射
 して輝度が一定になるようにするべきでしょう。

変換結果

 タスク3で利用している80ピクセルのデータを8ビットに変換  する処理が、左クランクでどのようになるか調べました。  以下のように、80ピクセルを8ビットに変換しても、コースを  移動するために必要となる情報が取得できることがわかります。 1 1 1 1 1 1 0 0 -> 0xFC 1 1 1 1 1 1 0 0 -> 0xFC 0 0 1 0 1 1 0 0 -> 0x2C 0 0 0 0 1 0 0 0 -> 0x08 0 0 0 0 1 1 0 0 -> 0x0C 0 0 0 0 1 1 0 0 -> 0x0C 0 0 0 0 1 1 0 0 -> 0x0C 0 0 0 0 1 1 0 0 -> 0x0C 0 0 0 0 1 1 0 0 -> 0x0C 0 0 0 0 1 1 0 0 -> 0x0C 0 0 0 0 1 1 0 0 -> 0x0C 0 0 0 0 1 1 0 0 -> 0x0C 0 0 0 0 1 1 0 0 -> 0x0C 0 0 0 0 1 1 0 0 -> 0x0C 0 0 0 0 1 1 0 0 -> 0x0C 0 0 0 0 1 1 0 0 -> 0x0C 0 0 0 0 1 1 0 0 -> 0x0C 0 0 0 0 1 1 0 0 -> 0x0C 0 0 0 0 1 1 0 0 -> 0x0C 0 0 0 0 1 0 0 0 -> 0x08 0 0 0 0 1 1 0 0 -> 0x0C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C 0 0 0 1 1 1 0 0 -> 0x1C  移動には、全ラインのデータを利用する必要はありません。  2ラインを決めて、その組み合わせで制御パターンを生成  します。

画像表示アプリケーション

 デバッグ処理コマンドを利用し、画像データを取得できます。  画像データは、テキストファイルに保存したので、そのままでは  画像として見れません。フリーのHSP(Hot Soup Processor)を利用  し画像表示しました。  HSPは、画像データを1点ごとに色と位置を指定できる言語仕様を  もっているので、このような用途に最適です。  ソースコードは、以下です。 #include "hspext.as" ;======================================== screen 0,80*2,60*2 ;======================================== dim src,320 ;======================================== ylast = 60 : xlast = 80 ;======================================== ; select string buffer ;======================================== notesel sbuf ;======================================== ; get contexts of text ;======================================== noteload "mlogy0.txt" ;noteload "mlogy01a.txt" ;noteload "mlogy01b.txt" ;noteload "mlogy01c.txt" ;noteload "mlogy01d.txt" ;noteload "mlogy01e.txt" ;noteload "mlogy01f.txt" ;noteload "mlogy01g.txt" ;noteload "mlogy01h.txt" ;noteload "mlogy01i.txt" ;noteload "mlogy01j.txt" ;======================================== ; draw picture ;======================================== ; line direction for j,0,ylast,1 ; get 1 line noteget src,j ; pixel direction for i,0,xlast,1 ; get datatum v = int(strmid(src,4*i,3)) ; set color color v,v,v ; show pset 2*i,2*j pset 2*i+1,2*j pset 2*i,2*j+1 pset 2*i+1,2*j+1 next next stop  80x60のサイズでは見難いので、縦横に2倍に拡大しています。

データ成形アプリケーション

 テキストファイルに保存する画像データは、1行を16個の数値で  構成しています。そのままでは、扱いにくいので、1行を80個の  数値にします。  テキストエディタを利用する方法もありますが、何度も修正するのは  時間の無駄なので、Tcl/Tkのスクリプトでデータ成形しました。  ソースコードは、以下です。  (ただし、openの右に書くファイル名は、その時に変更します。) #!/usr/local/bin/wish ####################################### # open files ####################################### set fd_in [open "mlogx0.txt" "r"] set fd_out [open "mlogy0.txt" "w"] ####################################### # read context ####################################### set i 0 set j 0 set result "" while { [gets $fd_in sbuf1] >= 0 } { # append for {set j 0} {$j < 80 } {incr j} { # get 1 line set tmp [lindex $sbuf1 $j] if { [string index $tmp 0] == "0" } { if { [string index $tmp 1] == "0" } { set tmp [string range $tmp 2 2] } else { set tmp [string range $tmp 1 2] } } set tmp [format "%3d" $tmp] if { $j == 0 } { set result $tmp } else { set result "$result $tmp" } } # show puts $fd_out $result # prepare next stage set result "" incr i } ####################################### # close files ####################################### close $fd_out close $fd_in
目次

inserted by FC2 system