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