[05] 目的ごとの整理(3)

図形や形状、パターンの検索検出

 : Cv2.HoughCircles(引数8つ)

CircleSegment[] HoughCircles(入力画像, 方式, dp, param1, param2, min_radius, max_radius)

【引数】
入力画像: 8ビット,シングルチャンネル,グレースケールの入力画像。グレースケール画像を入力にし 内部で2値化(Canny)している。
方式: 検出方式。StandardProbabilisticMultiScale,Gradient の4択。
dp : 検査領域比(逆比) (Double実数)、解像度を 1/n に。
minDist : 検出円の中心間の最小距離(Double実数)
param1 : 前処理「Cannyのエッジ検出」係数の最小値(Double実数,省略可)。小さいほど細かくなる
param2 :中心検出計算時しきい値。(Double実数,省略可)小さいほどあいまいな円を検出
minRadius : 最小半径(整数 int32,省略可)
maxRadius : 最大半径(整数 int32,省略可)

以下は動いたソースです。引数が適当なのでたくさん誤検出します。
円中心の距離制限を大きくしてみてください。

Mat img = new Mat(Imgs[0]);
Mat gray = new Mat(Imgs[0], ImreadModes.GrayScale);
using (new Window(“Imput Gray Image”, gray)) ;
CircleSegment[] circls = Cv2.HoughCircles(gray, HoughMethods.Gradient, 1.8,5);
   if (circls.Length == 0)
    {
       MessageBox.Show(“Circle can NOT found.”,”Result Message”,                     MessageBoxButtons.OK, MessageBoxIcon.Error);
      }
      else
         {
                FncDrwCircles(circls, img);
          }

// 円描画用の関数
private void FncDrwCircles(CircleSegment[] circles, Mat img)
{
Mat imgi =  img;
OpenCvSharp.Point pt = new OpenCvSharp.Point();
foreach (CircleSegment ccl in circles)
 {
  Cv2.Circle(imgi, ccl.Center, (int)ccl.Radius, new Scalar(0, 255, 255), 1);
 }
using (new Window(“Circle Result Image”, imgi))
 {
 Cv2.WaitKey();
}
}

 

線1(オーソドックスタイプ) : HoughLineHoughLinesStandard

線2(自動範囲調整タイプ) : HoughLines

線3(確率利用タイプ) : HoughLines2