[05] 目的ごとの整理(3)
図形や形状、パターンの検索検出
円 : Cv2.HoughCircles(引数8つ)
CircleSegment[] HoughCircles(入力画像, 方式, dp, param1, param2, min_radius, max_radius)
【引数】
入力画像: 8ビット,シングルチャンネル,グレースケールの入力画像。グレースケール画像を入力にし 内部で2値化(Canny)している。 方式: 検出方式。Standard,Probabilistic,MultiScale,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