EmguCV:获取两点之间一行中像素的坐标

时间:2015-01-19 04:53:11

标签: c# wpf emgucv

所以这就是我的目标:我想停在一条线上的每个像素上并对这些像素进行一些处理。目前我正在使用EmguCV作为我的图像处理库。在openCV中有一个名为LineIterator的方法,您可以使用该方法迭代一行中的像素。但是,我没有在EmguCV中找到类似于此的方法,这是我遇到的问题。

目前,我可以使用Image.Sample方法获取两个预定义点之间的线上所有像素的像素值。对于灰度图像Image,这将返回一个n×1矩阵,其中n是该行上的像素数。然而,我无法获得与上述n×1矩阵中的像素值对应的该特定行上的每个像素的坐标。因此,即使我有像素值,我也无法对这些像素进行图像处理。有没有办法在EmguCV上做到这一点?

谢谢。

2 个答案:

答案 0 :(得分:4)

我为自己的项目实施了bresenham line algoritm (我用其他语言移植它,不能记住原作者,sry)

    public static List<Point> GetBresenhamLine(Point p0, Point p1)
    {
        int x0 = p0.X;
        int y0 = p0.Y;
        int x1 = p1.X;
        int y1 = p1.Y;
        int dx = Math.Abs(x1 - x0);
        int dy = Math.Abs(y1 - y0);

        int sx = x0 < x1 ? 1 : -1;
        int sy = y0 < y1 ? 1 : -1;

        int err = dx - dy;

        var points = new List<Point>();

        while (true)
        {
            points.Add(new Point(x0, y0));
            if (x0 == x1 && y0 == y1) break;

            int e2 = 2 * err;
            if (e2 > -dy)
            {
                err = err - dy;
                x0 = x0 + sx;
            }
            if (e2 < dx)
            {
                err = err + dx;
                y0 = y0 + sy;
            }
        }

        return points;
    }

我实施了自己的&#34; Point&#34;结构,但认为它符合Emgu的。 我认为这应该照顾任何特殊情况。

答案 1 :(得分:0)

如果(x1,y1)和(x2,y2)是两个端点。

(x1, y1) ___________________ (x2, y2)

然后你可以通过

得到中间点
for (int i = x1, i < x2; i++)
{
 int x = i;
 int y = (y1 + (y2-y1)/(x2-x1) * (x - x1)))
 cout << "Points : " << x << " " << y << endl;
}