EmguCV:获取两点之间直线中像素的坐标
EmguCV: Get coordinates of pixels in a line between two points
所以这是我的目标:我想在一条线上的每个像素处停下来并对这些像素进行一些处理。目前我正在为我的图像处理库使用 EmguCV。在 openCV 中有一个名为 LineIterator 的方法,您可以使用它来遍历一行中的像素。但是,我没有在 EmguCV 中找到与此类似的方法,这就是我被卡住的地方。
目前,我可以使用Image.Sample 方法获取两个预定义点之间连线上所有像素的像素值。对于灰度图像图像,此 returns 一个 n×1 矩阵,其中 n 是该行上的像素数。但是,我无法获得与上述 n×1 矩阵中的像素值相对应的特定行上每个像素的坐标。因此,即使我有它们的像素值,我也无法对这些像素进行图像处理。有没有办法在 EmguCV 上做到这一点?
谢谢。
如果(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 线算法
(从 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 的相匹配。
我认为这应该处理任何特殊情况。
所以这是我的目标:我想在一条线上的每个像素处停下来并对这些像素进行一些处理。目前我正在为我的图像处理库使用 EmguCV。在 openCV 中有一个名为 LineIterator 的方法,您可以使用它来遍历一行中的像素。但是,我没有在 EmguCV 中找到与此类似的方法,这就是我被卡住的地方。
目前,我可以使用Image.Sample 方法获取两个预定义点之间连线上所有像素的像素值。对于灰度图像图像,此 returns 一个 n×1 矩阵,其中 n 是该行上的像素数。但是,我无法获得与上述 n×1 矩阵中的像素值相对应的特定行上每个像素的坐标。因此,即使我有它们的像素值,我也无法对这些像素进行图像处理。有没有办法在 EmguCV 上做到这一点?
谢谢。
如果(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 线算法 (从 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 的相匹配。 我认为这应该处理任何特殊情况。