使用EmguCV进行骨架化

时间:2014-06-15 05:37:23

标签: c# c++ opencv emgucv

我正在尝试使用EmguCV在C#中进行Skeletonization。我正在使用本页底部的示例,它是用C ++编写的,我尝试了它并且它可以工作: http://felix.abecassis.me/2011/09/opencv-morphological-skeleton/

我已将鳕鱼转换为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'并将其保存为'eroded',然后扩展'eroded'然后将其保存为'temp'。在上面的C#代码中,这导致'temp = img2',这是有道理的。那么为什么这个在C ++代码而不是C#中工作呢?在上面的C#代码中定义'element'的方式有问题吗?

提前致谢!

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)