前回は、古典的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 |