直線を検出する(古典的Hough変換)その2

前回は、古典的Hough変換で直線一本を検出しました。今回は 右下がりの直線 さらに 水平・垂直線を扱ってみます。

前回同様 検出した直線のMatの内容を表示したかったのですが。。。。。。
HoughLinesの引数を変えると 真っ赤になったり 水平線を検出できなかったりで Matの表示はあきらめました。
最終的には Imgproc.HoughLines(edge, lines, 1, Math.PI/180, 65); 
で以下の結果になりました。

なお検出した直線を表示する部分は 以下のようなコーディングを実装しました。

double[] data;
double rho, theta;
Point pt1 = new Point();
Point pt2 = new Point();
double x0, y0;
for (int i = 0; i < lines.cols(); i++){
    data = lines.get(0, i);
    rho = data[0];
    theta = data[1];

    double cosTheta = Math.cos(theta);
    double sinTheta = Math.sin(theta);
    if (sinTheta == 0){
        pt1.x = rho;
        pt1.y = 0;
        pt2.x = rho;
        pt2.y = image.height();
    }
    else {
        if (cosTheta == 0){
            pt1.x = 0;
            pt1.y = rho;
            pt2.x = image.width();
            pt2.y = rho;
        }
        else {
            if (rho > 0) {
                pt1.x = rho / cosTheta;
                pt1.y = 0;
                pt2.x = 0;
                pt2.y = rho / sinTheta;
            }
            else {
                pt1.x = rho / cosTheta;
                pt1.y = 0;
                pt2.x = -(sinTheta / cosTheta) * image.height() + rho / cosTheta;
                pt2.y = image.height();
            }
        }
    }
    Core.line(image, pt1, pt2, new Scalar(255, 0, 0), 1);
}

実はこの直線表示ロジックには誤りがあることが 後日わかりました。正しくは 次回の投稿分に修正コーディングを載せてあります。(こちらを参照) 

 by Android2.2 with OpenCv 2.3.1 for Android
スポンサーリンク
Rectangle大広告
Rectangle大広告

シェアする

  • このエントリーをはてなブックマークに追加

フォローする