如何使用EmguCV获得连续多边形?

时间:2012-04-23 06:55:36

标签: c# .net emgucv

我在一个简单的控制台应用程序(.net 4.0和c#)中使用EmguCV 2.3.0.1416,我有一个关于canny,边缘检测等的问题。给出以下代码:

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);
    }
}

我得到了这个输出(这实际上只是图像的一部分,但它显示了我所询问的内容):

Canny Edge

正如你所看到的,它有一条蓝色的线条,有一点粉红色,然后是一条绿线。真实的东西在这里只有一个坚实的边缘,所以我希望这是一个单行,以便我可以肯定它是我正在看的边缘。

原始图像看起来像这样(我已将其缩放,但您可以看到它具有非常独特的边缘,我希望能够轻松找到它。)

Orignal

如果我看一下canny,我可以看到那里的差距,所以我尝试调整创建canny的参数(阈值和链接阈值),但它们没有任何区别。

我也扩张然后侵蚀了canny(使用相同的迭代参数值 - 偶然使用10)这似乎可以解决这个问题,但是这样做会让我失去准确性(它只是感觉有些不对劲)? / p>

那么,我应该如何确保在这个实例中获得一行?

3 个答案:

答案 0 :(得分:2)

你在canny之前尝试过平滑吗?

我找到了这个链接,对你有用

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

答案 1 :(得分:0)

单行是什么意思?也许你正试图加强你的界限:

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

而不是:

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

或者你想要的任何线条厚度。 Here's多边形的emgucv绘制方法。 或许也可以查看this链接。

答案 2 :(得分:0)

approxPoly()函数中的第一个参数正是您要查找的内容。只要摆弄它,你就会得到你想要的东西。