Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用EmguCV获得连续多边形?_C#_.net_Emgucv - Fatal编程技术网

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

C# 如何使用EmguCV获得连续多边形?,c#,.net,emgucv,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(Colo

我正在从一个简单的控制台应用程序(.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);
    }
}
var colors=new[]
{
新Bgr(颜色为黄绿色),
新Bgr(颜色为绿松石色),
新Bgr(颜色为蓝色),
新Bgr(颜色:深粉色)
};
//转换为灰度,消除噪音,并获得canny
使用(var image=新映像(文件名)
.Convert()
派尔当先生()
皮鲁普先生()
.Canny(新灰色(180),
新灰(90))
{
//将canny输出保存到一个文件中,然后在其中获取每个轮廓
//机警的,得到多边形的,颜色各不相同
//颜色从一个选择,所以我们可以很容易地看到,如果他们加入
image.Save(cannyFileName);
var等高线=图像
.FindContours(链近似法。CV链近似法),
RETR_类型。CV_RETR_外部);
使用(var debug=新映像(Image.Size))
{
int-colIndex=0;
对于(;轮廓!=null;轮廓=轮廓.HNext)
{
轮廓多边形=轮廓
.近似多边形(等高线周长*0.05,
(a)储存);
调试.绘制(多边形,颜色[colIndex],1);
colIndex++;
如果(colIndex>3)colIndex=0;
}
保存(debugFileName);
}
}
我得到了这个输出(这实际上只是图像的一部分,但它显示了我的问题):

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

原始图像看起来像这样(我放大了它,但你可以看到它有一个非常独特的边缘,我希望能够很容易地找到)

如果我只看canny,我可以看到其中的差距,因此我尝试调整创建canny的参数(阈值和链接阈值),但它们没有任何区别

我还扩展了canny(顺便说一句,对迭代参数-10使用了相同的值),这似乎起到了作用,但这样做会使我失去准确性吗(只是感觉有点不对劲)


那么,在这种情况下,我应该如何确保得到一行呢?

你所说的单行到底是什么意思?也许您正试图加粗您的线条:

debug.Draw(poly, colours[colIndex], 2);
而不是:

debug.Draw(poly, colours[colIndex], 1);
或者任何你想要的线条的厚度。 多边形的emgucv绘制方法。
也许也可以看看链接。

在canny之前,您是否尝试过平滑处理

我发现了这个链接,也许对你有用


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

谢谢,但我不是指绘图部分(我只是画它们来显示问题),而是我想做的是,首先让更少的多边形来绘制-这样emgu只会检测到一条线(在第二张图中黑色与白色相遇的地方)。对此表示抱歉。不知怎的,我误解了你的意思。你是说调用SMOOTHMEDIANT方法(有几种)吗?我刚试过,但没什么区别。@kmp好的,你能做二值阈值吗?如果不影响您的目的,请使用它。可能是图像边缘模糊造成的。有一种阈值二值化方法,它有两个参数:-我应该为这些值输入什么?另外,这样做会影响到找到边缘的准确性吗?@kmp你在这个问题上提供了赏金吗?我以为我得到了+50,但没有得到任何。有点困惑:|其他人提供了赏金,但我接受了你的答案,因此我认为这意味着你会得到赏金(因为我没有提供赏金,所以我无法手动分配赏金,但我认为如果你得到了接受的答案,你会得到赏金-也许可以在meta上询问你为什么没有得到赏金)