2011-02-04 2 views
3

У меня есть черно-белое изображение, подобное этому (цветные накладки мои, и их можно удалить): enter image description here Мне нужно выяснить, что показано на краю руки, как я могу это сделать?Обнаружение кромок на C#

Мой текущий алгоритм:

 List<Point> edgePoints = new List<Point>(); 
     for (int x = 0; x < largest.Rectangle.Width && edgePoints.Count == 0; x++) { 
      //top 
      for (int y = 0; y < largest.Rectangle.Height - 3 && edgePoints.Count == 0; y++) { 
       if (colorGrid[x, y].ToArgb() == Color.White.ToArgb() && 
        colorGrid[x, y + 1].ToArgb() == Color.White.ToArgb() && 
        colorGrid[x, y + 2].ToArgb() == Color.White.ToArgb() && 
        colorGrid[x, y + 3].ToArgb() == Color.White.ToArgb() 
        ) { 
        edgePoints.Add(new Point(x, y)); 
        //g.DrawLine(new System.Drawing.Pen(Color.Orange), new Point(largest.Rectangle.X + x, largest.Rectangle.Y + y), new Point(largest.Rectangle.X + x, largest.Rectangle.Y + y + 3)); 
        break; 
       } 
      } 
      //bottom 
      for (int y = largest.Rectangle.Height - 1; y > 3 && edgePoints.Count == 0; y++) { 
       if (colorGrid[x, y].ToArgb() == Color.White.ToArgb() && 
        colorGrid[x, y - 1].ToArgb() == Color.White.ToArgb() && 
        colorGrid[x, y - 2].ToArgb() == Color.White.ToArgb() && 
        colorGrid[x, y - 3].ToArgb() == Color.White.ToArgb() 
        ) { 
        edgePoints.Add(new Point(x, y)); 
        //g.DrawLine(new System.Drawing.Pen(Color.Orange), new Point(largest.Rectangle.X + x, largest.Rectangle.Y + y), new Point(largest.Rectangle.X + x, largest.Rectangle.Y + y + 3)); 
        break; 
       } 
      } 
     } 

Результаты в достаточно хорошо определены очертания, но если и кривые в любом месте, что край не обнаружен. I.Е., если бы я держал мою руку боком, я бы получил край верхнего пальца и нижнего пальца, но это все.

Что я могу сделать, чтобы исправить это и получить реальное преимущество?

ответ

5

Посмотрите на проекты вроде этого: http://code.google.com/p/aforge/, которые вам очень помогут, и вам не придется изобретать велосипед!

+0

Я использую aforge.net, но я вижу только пример того, как сделать это детектированием blob, чего я не хочу. – Malfist

+0

На самом деле, я нашел их краевой фильтр. – Malfist

+0

Его довольно хорошая библиотека, и они получили большинство вещей. удачи! – StefanE

0

Существует решение на C++ http://outliner.codeplex.com/ Но задача преобразования его в C# будет непростой задачей, алгоритм довольно сложный.

Смежные вопросы