【发布时间】: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# 代码中定义“元素”的方式有问题吗?
提前致谢!
【问题讨论】: