画像処理検討
デバッグ処理コマンド'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
目次
前
次