2014年1月19日日曜日

Android OpenCV 直線検出

Android OpenCV 直線検出

輪郭の抽出などをやってきましたが今回は直線についてやりたいと思います。

直線検出には

Imgproc.HoughLines(Mat image, Mat lines, double rho, double theta, int threshold, double srn, double stn)
  • image – 8ビット,シングルチャンネルの2値入力画像.この画像は関数により書き換えられる可能性があります.
  • lines – 検出された直線が出力されるベクトル.各直線は,2要素のベクトル (\rho, \theta) で表現されます. \rho は原点(画像の左上コーナー)からの距離, \theta はラジアン単位で表される直線の回転角度(0 \sim 垂直線, \pi/2 \sim 水平線)です.
  • rho – ピクセル単位で表される投票空間の距離分解能.
  • theta – ラジアン単位で表される投票空間の角度分解能.
  • threshold – 投票の閾値パラメータ.十分な票( >\texttt{threshold} )を得た直線のみが出力されます.
  • srn – マルチスケールハフ変換において,距離分解能 rho の除数となる値.投票空間の粗い距離分解能は rho となり,細かい分解能は rho/srn となります.もし srn=0 かつ stn=0 の場合は,古典的ハフ変換が利用されます.そうでない場合は,両方のパラメータが正値である必要があります.
  • stn – マルチスケールハフ変換において,角度分解能 theta の除数となる値.


Imgproc.HoughLinesP(Mat image, Mat lines, double rho, double theta, int threshold, double minLineLength, double maxLineGap)
  • image – 8ビット,シングルチャンネルの2値入力画像.この画像は関数により書き換えられる可能性があります.
  • lines – 検出された線分が出力されるベクトル.各線分は,4要素のベクトル (x_1, y_1, x_2, y_2) で表現されます.ここで (x_1,y_1) および (x_2, y_2) は,検出された各線分の端点です.
  • rho – ピクセル単位で表される投票空間の距離分解能.
  • theta – ラジアン単位で表される投票空間の角度分解能.
  • threshold – 投票の閾値パラメータ.十分な票( >\texttt{threshold} )を得た直線のみが出力されます.
  • minLineLength – 最小の線分長.これより短い線分は棄却されます.
  • maxLineGap – 2点が同一線分上にあると見なす場合に許容される最大距離.
を用いることでできます。(OpenCV リファレンス参照)

直線を取得する前に輪郭(エッジ)の画像に変換してから直線を取得します。

/*-----------------------------------------------------------------------

Mat src;
Mat dst;
Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGB2GRAY);

Mat image = dst;
Mat edges;
Imgproc.Canny( image, edges, 80, 100);

Mat image2 = edges;
Mat lines;
Imgproc.HoughLinesP(image, lines, 1, Math.PI / 180 , 50, 100 ,10);

--------------------------------------------------------------------------------------------------*/
 

0 件のコメント:

コメントを投稿