2014年1月19日日曜日

Android OpenCV 円検出

Android OpenCV 円検出

前回の記事 直線検出では直線の検出をしましたが今回は円の検出をしたいと思います。

円の検出には以下の関数を用いることでできます。(OpenCV リファレンス参照)


Imgproc.HoughCircles(Mat image, Mat circles, int method, double dp, double minDist, double param1, double param2, int minRadius, int maxRadius)

  • image – 8ビット,シングルチャンネル,グレースケールの入力画像.
  • circles – 検出された円を出力するベクトル.各ベクトルは,3要素の浮動小数点型ベクトル (x, y, radius) としてエンコードされます.
  • method – 現在のところ, CV_HOUGH_GRADIENT メソッドのみが実装されています.基本的には 2段階ハフ変換 で,これについては Yuen90 で述べられています.
  • dp – 画像分解能に対する投票分解能の比率の逆数.例えば, dp=1 の場合は,投票空間は入力画像と同じ分解能をもちます.また dp=2 の場合は,投票空間の幅と高さは半分になります.
  • minDist – 検出される円の中心同士の最小距離.このパラメータが小さすぎると,正しい円の周辺に別の円が複数誤って検出されることになります.逆に大きすぎると,検出できない円がでてくる可能性があります.
  • param1 – 手法依存の 1 番目のパラメータ. CV_HOUGH_GRADIENT の場合は, Canny() エッジ検出器に渡される2つの閾値の内,大きい方の閾値を表します(小さい閾値は,この値の半分になります).
  • param2 – 手法依存の 2 番目のパラメータ. CV_HOUGH_GRADIENT の場合は,円の中心を検出する際の投票数の閾値を表します.これが小さくなるほど,より多くの誤検出が起こる可能性があります.より多くの投票を獲得した円が,最初に出力されます.
  • minRadius – 円の半径の最小値.
  • maxRadius – 円の半径の最大値.


直線の時は輪郭(エッジ)の画像に変換してから直線を取得しましたが円検出の場合はぼかし(平滑化)を行ってから検出するほうが誤検出起こりにくいみたいです。ですが、実際にやってみた結果あまり変化がないというよりは平滑化するとほぼ円を認識しなくなり確かに誤検出は減りますが円を認識してもらわないと困るので誤検出が多い場合のみ使用したほうがよさそうです。

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

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

GaussianBlur( dst, dst, Size(9, 9), 2, 2 );//←別になくてもよい

Mat image = dst;
Mat lines;
Imgproc.HoughLinesP(image, lines, Imgproc.CV_HOUGH_GRADIENT, 2, 10, 160, 50, 50, 120);

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

 

0 件のコメント:

コメントを投稿