直線の壁を見出して角度補正をしてみようと
ハフ変換の勉強して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();
}