【问题标题】:Skeletonization using EmguCV使用 EmguCV 进行骨架化
【发布时间】:2014-06-15 05:37:22
【问题描述】:

我正在尝试使用 EmguCV 在 C# 中进行骨架化。我正在使用此页面底部的 C++ 示例,我尝试了它并且它有效: http://felix.abecassis.me/2011/09/opencv-morphological-skeleton/

我已将 cod 转换为 C#,如下所示:

        Image<Gray, Byte> eroded = new Image<Gray, byte>(img2.Size);
        Image<Gray, Byte> temp = new Image<Gray, byte>(img2.Size);
        Image<Gray, Byte> skel = new Image<Gray, byte>(img2.Size);
        skel.SetValue(0);
        CvInvoke.cvThreshold(img2, img2, 127, 256, 0);
        StructuringElementEx element = new StructuringElementEx(3, 3, 1, 1, Emgu.CV.CvEnum.CV_ELEMENT_SHAPE.CV_SHAPE_CROSS);
        bool done = false;

        while (!done)
        {
            CvInvoke.cvErode(img2, eroded, element,1);
            CvInvoke.cvDilate(eroded, temp, element,1);
            temp = img2.Sub(temp);
            skel = skel | temp;
            img2 = eroded;
            if (CvInvoke.cvCountNonZero(img2) == 0) done = true;
        }

但这不起作用!怎么了? 在 while 循环的开始,它腐蚀图像“img2”并将其保存到“腐蚀”,然后膨胀“腐蚀”,然后将其保存到“临时”。在上面的 C# 代码中,这会导致“temp=img2”,这是有道理的。那么为什么这适用于 C++ 代码而不是 n C#?上面 C# 代码中定义“元素”的方式有问题吗?

提前致谢!

【问题讨论】:

    标签: c# c++ opencv emgucv


    【解决方案1】:

    您的代码适用于这样的图像:http://i.stack.imgur.com/YMA4r.jpg

    我认为您使用图像,背景为白色而不是黑色。

    克服的简单方法是反转图像。

    Image<Gray, Byte> invert_img = (new Image<Gray, byte>(img_old.Width, img_old.Height, new Gray(255))).Sub(img_old);
    

    然后你可以把它倒过来。

    skel = (new Image<Gray, byte>(img_old.Width, img_old.Height, new Gray(255))).Sub(skel);
    

    【讨论】:

      【解决方案2】:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      相关资源
      最近更新 更多