2

私はアプリケーションで Matlab と OpenCV/labview の両方を使用してハフ変換を使用してきましたが、一部の画像では、ハフ変換が明らかに間違ったライン フィットを (一貫して) 与えていることがわかりました。

これがテスト画像とオーバーレイ画像です。角度は正しいように見えますが、ローがずれています。 代替テキスト

下の画像では、上の画像は元の画像の左側に線を合わせようとし、下の画像は画像の右側に線を合わせようとしていることがわかります。

代替テキスト

Matlab では、Hough 関数を次のように呼び出します。

[H1D,theta1D,rho1D] = hough(img_1D_dilate,'ThetaResolution',0.2);

C++ では、OpenCV の HoughLines 関数を削除したので、アキュムレータを埋めている部分だけになります。シータの解像度が 0.2 であるため、分析する角度が 900 あることに注意してください。tabSin と tabCos は関数の前に定義されているため、角度の正弦と余弦になります。

これらのルーチンは通常はうまく機能しますが、特定のケースでは、私が示した方法で実行されることに注意してください。

double start_angle = 60.0;
    double end_angle = 120.0;
    double num_theta = 180;
    int start_ang = num_theta * start_angle/180;
    int end_ang = num_theta * end_angle/180;
    int i,j,n,index;
        for (i = 0;i<numrows;i++)
        {
            for (j = 0;j<numcols;j++)
            {
                    if (img[i*numcols + j] == 100)
                {
                    for (n = 0;n<180;n++)
                    {   
                        index = cvRound((j*tabCos[n] + i * tabSin[n])) + (numrho-1)/2;
                        accum[(n+1) * (numrho+2) + index+1]++;
                    }
                }
            }
        }

TabCos と tabSin は、Labview でこのコード int32 i で定義されます。float64 theta_prec; float64 tabSin[180]; float64 tabCos[180];

theta_prec = 1/180*3.14159; for (i = 0;i<180;i++) { tabSin[i] = sin(i theta_prec); tabCos[i] = cos(i theta_prec); }

どんな提案でも大歓迎です

4

1 に答える 1

1

この問題の答えを書き留めておこうと思います。

ローとシータを m と b に変換してから、m と b から x と y の値を計算しました。これにより、どこかで精度エラーが発生した可能性があると思います。

このエラーは、m と b を経由するのではなく、rho と theta から直接 x と y を取得することで修正されました。

関数は

y = -cos(theta)/sin(theta)*x + rho/sin(theta);
于 2010-12-14T21:28:21.580 に答える