2

単純なコンソールアプリケーション(.net 4.0およびc#)からEmguCV 2.3.0.1416を使用していますが、キャニー、エッジ検出などについて質問があります。次のコードが与えられます。

var colours = new[]
                  {
                      new Bgr(Color.YellowGreen),
                      new Bgr(Color.Turquoise),
                      new Bgr(Color.Blue),
                      new Bgr(Color.DeepPink)
                  };

// Convert to grayscale, remove noise and get the canny
using (var image = new Image<Bgr, byte>(fileName)
    .Convert<Gray, byte>()
    .PyrDown()
    .PyrUp()
    .Canny(new Gray(180),
           new Gray(90)))
{
    // Save the canny out to a file and then get each contour within
    // the canny and get the polygon for it, colour each a different
    // colour from a selection so we can easily see if they join up
    image.Save(cannyFileName);

    var contours = image
        .FindContours(CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE,
                      RETR_TYPE.CV_RETR_EXTERNAL);

    using (var debug = new Image<Bgr, byte>(image.Size))
    {
        int colIndex = 0;
        for (; contours != null; contours = contours.HNext)
        {
            Contour<Point> poly = contours
                .ApproxPoly(contours.Perimeter*0.05,
                            contours.Storage);

            debug.Draw(poly, colours[colIndex], 1);

            colIndex++;
            if (colIndex > 3) colIndex = 0;
        }

        debug.Save(debugFileName);
    }
}

私はこの出力を取得します(これは実際には画像の一部ですが、私が質問していることを示しています):

キャニーエッジ

ご覧のとおり、少しピンクがかった青い線と、次に緑の線があります。ここでは本物のエッジがしっかりしているので、これを1本の線にして、自分が見ているもののエッジであることを確認できるようにします。

元の画像は次のようになります(ズームしましたが、簡単に見つけられると期待していた非常に特徴的なエッジがあることがわかります)。

オリジナル

キャニーだけを見ると、そこにギャップがあるので、キャニーを作成するためのパラメーター(しきい値とリンクしきい値)を調整してみましたが、違いはありませんでした。

また、キャニーを拡張してから侵食しました(反復パラメーターに同じ値を使用します-10)。これでうまくいくように見えましたが、これを行うと精度が低下する可能性があります(どういうわけか少し間違っていると感じます)。

では、この場合、どのようにして1行を確実に取得する必要がありますか?

4

3 に答える 3

2

キャニーの前にスムージングを試しましたか?

私はこのリンクを見つけました、多分あなたのために役立つでしょう

http://www.indiana.edu/~dll/B657/B657_lec_hough.pdf

于 2012-05-02T11:06:04.307 に答える
0

単一行とは正確にはどういう意味ですか?おそらくあなたはあなたの線を太くしようとしています:

debug.Draw(poly, colours[colIndex], 2);

それ以外の:

debug.Draw(poly, colours[colIndex], 1);

または、必要な線の太さ。 これがポリゴンのemgucvDrawメソッドです。おそらくこのリンクも見てください。

于 2012-04-28T01:47:57.170 に答える
0

approxPoly()関数の最初の引数は、まさにあなたが探しているものです。それをいじるだけで、あなたはまさにあなたが望むものを手に入れるでしょう。

于 2013-06-06T03:02:04.240 に答える