Я пытаюсь сделать скелетонизации в C # с помощью EmguCV. Я использую образец внизу этой страницы, который находится на 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» и сохраняет его в «размытом», затем расширяет «размытое» и затем сохраняет в «temp». В приведенном выше коде C # это приводит к ‘temp = img2’, что имеет смысл. Так почему же это работает в коде C ++, а не в C #? Что-то не так с определением элемента в приведенном выше коде C #?
Заранее спасибо!
Ваш код отлично работает с изображением вот так: 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);
Библиотека Aforge предоставляет функцию скелетонизации
http://www.aforgenet.com/framework/docs/html/c0cc0715-0e71-cf63-e1cd-922786f5786e.htm