初めて投稿させていただきます。
テンプレートマッチングをするプログラムを作っていて行き詰ってしまいました。
以下のように構成しています。
●画像をそれぞれ配列化(グレースケール画像を使用)
テンプレート画像t(tx,ty) サイズ:160*120
元画像p1(px,py) サイズ:640*480
●平均(正規化)
各画像の画素全体を足して平均を出す。
●分散(正規化)
平均化された画素から分散を求める
ここからが行き詰っているのですが640*480の画像同士であれば簡単にマッチングを行えました。
しかしブロック単位となると少しプログラムをどう記述すべきか悩んでおります。
For iy = 0 To 480
For ix = 0 To 640
//mf,mgは平均, bf,bgは分散値, t1はマッチング値
t1 = (Abs((t(ix, iy) - mf) / Sqr(bf0)) - Abs((p1(ix, iy) - mg) / Sqr(bg0))) ^ 2
Debug.Print ix & "," & iy & "," & t1
DoEvents
Next ix
Next iy
全体探索では以上のようになったのですが、ブロック探査はどういったようにしたらよいでしょうか。どなたかご教授のほうお願いいたします。
多分、それなりにまとめてくれたんだろうけど、専門外の
人間から見たら説明の無い変数・キーワードは全く
分からないね。特にブロック単位が何を意味するかが
分からないと回答は付かない。
結局、
For iy = 0 To 480
For ix = 0 To 640
Debug.Print ix & "," & iy
DoEvents
Next ix
Next iy
で 0 To 480 と 0 To 640 を例えば
20 To 40 と 60 To 80 にしたい…みたいに聞こえたけど
…すればいいんじゃない?そのまま
[VB6.0]
Dim ixStart As Integer
Dim ixEnd As Integer
Dim iyStart As Integer
Dim iyEnd As Integer
ixStart = 20 '好きなように計算した結果を代入
ixEnd = 40
iyStart = 60
iyEnd = 80
For iy = ixStart To ixEnd
For ix = iyStart To iyEnd
Debug.Print ix & "," & iy _
& " 処理開始原点からは[" & (ix - ixStart) & "," & (iy - iyStart) & "]"
DoEvents
Next ix
Next iy
それとも大きな画像のステップ数を変えるんでしょうか?
For iy = 1 To 20 Step 5
Debug.Print iy
Next iy
すみませんでした。
ブロック単位は、160*120の画像を640*480の中で探して
行くという意味です。(やりたいことです)
具体的には、640*480の画像上から160*120の画像を1ピクセル
ずつ動かして行き、ixが640−160になったらiyに1プラスする
というのをやりたいと思っているのですが、うまく行きません。
For iy_l = 0 To 480-120
For ix_l = 0 To 640-160
'ブロック単位の比較
For iy_s = 0 To 120
For ix_s = 0 To 160
'640*480上の比較ポイントix,iy
ix = ix_l + ix_s
iy = iy_l + iy_s
'処理
Next ix_s
Next iy_s
'ブロック単位での比較結果判断
Next ix_l
Next iy_l
実際の処理では For が4階層になってると分かりにくいし
扱いにくいから、ブロック単位の比較は関数(Function)に
したほうが良さそうね。
みいさん、特攻隊長まるるうさん ありがとうございます。
Forの使い方をすこし勘違いしていたようでした。
みいさんのヒントで問題解決できました。
ツイート | ![]() |