我有这样的黑白图像(颜色覆盖是我的,可以删除): 我需要弄清楚所示手的边缘,我该怎么做?
我目前的算法:
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;
}
}
}
得到一个定义相当清晰的轮廓,但是如果和曲线在任何地方,则不会检测到该边缘。是的,如果我把手放在一边,我会得到顶部手指和底部手指的边缘,但就是这样。
我该怎么做才能纠正这个并获得真正的优势?
答案 0 :(得分:5)
看看这样的项目:http://code.google.com/p/aforge/这对你有很大的帮助,你不必重新发明轮子!
答案 1 :(得分:0)
C ++上有一个解决方案http://outliner.codeplex.com/ 但是将它转换为C#并不是一件容易的事,算法非常复杂。