2010年10月30日土曜日

ハフ変換

hafu02
hafu01

直線の壁を見出して角度補正をしてみようと
ハフ変換の勉強してURGのデータにかけて見て実験中

最も最上位の候補のみ抽出して
予測した直線を重ねて見たのが上の図です

ハフ変換は理屈がシンプルなので実装もしやすいですが
マシンの速度とメモリ結構食います

でも最近のマシンだと何とかなりそうです。
解説なしで今回作って試したハフ変換部分のコードをのせてみます
何かのお役にたてれば幸いです


void houghtrans()
{
int[] houghmat = new int[1024 * 1024];
int N = 1024;
int maxvalue=0;
int tmp=0;
int maxindex=0;
int maxm = 0;
int maxn = 0;
double maxro = 0;
double maxtheta = 0;

for (int i = 0; i < 1080; i = i + 1)//URGのデータ一つ一つ検査
{
double x = lrf.Range[i] * Math.Cos(i * 0.25*Math.PI/180 - Math.PI / 4);//極座標→デカルト座標
double y = lrf.Range[i] * Math.Sin(i * 0.25*Math.PI/180 - Math.PI / 4);
if (Math.Abs(x) < 5000 && Math.Abs(x) > 500 && Math.Abs(y) < 5000 && Math.Abs(y) > 500)//範囲を限定
{
for (int n = 0; n < N; n++)//走査範囲をNで決めた数で分割して調べる
{
double ro = x * Math.Cos(n * Math.PI / N) + y * Math.Sin(n * Math.PI / N);
int m = (int)(ro / 7500 * N/2 + N/2);
tmp = ++houghmat[m * N + n];
if (tmp > maxvalue)
{
maxvalue = tmp;//ハフ変換により変換された曲線がピクセルに何線重なっているかカウントしこれまでの最大値を記憶
maxindex = m * N + n;//最大値のインデックス番号
maxm = m;//最大値の行番号
maxn = n;//最大値の列番号
maxro = ro;//最大値のρ
maxtheta = maxn * Math.PI / N;
}
}
}
}
leserScanerViewer1.Theta = maxtheta;
leserScanerViewer1.Ro = maxro;
label1.Text = maxindex.ToString();
label2.Text = maxvalue.ToString();
label3.Text = maxm.ToString();
label4.Text = maxn.ToString();
}

0 件のコメント:

コメントを投稿