【问题标题】:EmguCV: Get coordinates of pixels in a line between two pointsEmguCV:获取两点之间直线中的像素坐标
【发布时间】:2015-01-19 04:53:10
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: c# wpf emgucv


    【解决方案1】:

    我为自己的项目实施了 bresenham 线算法 (从wikipedia article转换为C#)

        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;
        }
    

    我实现了自己的“Point”结构,但认为它与 Emgu 的匹配。 我认为这应该处理任何特殊情况。

    【讨论】:

    • 谢谢,我自己做了,和你的代码差不多。
    【解决方案2】:

    如果 (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;
    }
    

    【讨论】:

    • 谢谢。我认为这是 Bresenham 的线算法。我在 emguCV 中寻找其他可能已经内置到库中的解决方案,但我没有找到,所以我想我会使用它。您发布的方程式适用于绝对斜率小于 1 或在您的情况下 abs((y2-y1)/(x2-x1))
    • 是的,这是 Bresenham 的算法,
    • 此答案仅适用于水平线。接受的答案也考虑在垂直方向上采样。
    猜你喜欢
    • 2016-05-10
    • 2012-11-09
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多