参考https://blog.csdn.net/yinhuan1649/article/details/78732775,增加斜率不存在处理
原博客是opencv版本,转成opencvsharp非常方便
public static void Main()
{
Mat mat = new Mat(800, 800, MatType.CV_8UC3);
Line2D l1 = new Line2D(100, 100, 100, 700);
Line2D l2 = new Line2D(100, 700, 700, 100);
Cv2.Line(mat, (int)l1.Vx, (int)l1.Vy, (int)l1.X1, (int)l1.Y1, Scalar.White);
Cv2.Line(mat, (int)l2.Vx, (int)l2.Vy, (int)l2.X1, (int)l2.Y1, Scalar.White);
IntersectionPoint(l1, l2 out Point2d c);
c.X = Math.Round(c.X, 0);
c.Y = Math.Round(c.Y, 0);
Point calccenter = new Point(c.X, c.Y);
Console.WriteLine(calccenter);
Cv2.Circle(mat, calccenter, 10, Scalar.Red);
}
public static void IntersectionPoint(Line2D Line1, Line2D Line2, out Point2d crossPoint)
{
// 如果是一条垂直线,计算斜率会发生除0错误,所以对线稍加修改,对结果影响不大
if (Line1.X1 - Line1.Vx == 0)
{
Line1 = new Line2D(Line1.Vx, Line1.Vy, Line1.X1 + 0.1, Line1.Y1);
}
if (Line2.X1 - Line2.Vx == 0)
{
Line2 = new Line2D(Line2.Vx, Line2.Vy, Line2.X1 + 0.1, Line2.Y1);
}
//对于过两个点(Vx,Vy) 和 (X1,Y1)的直线,斜率为k=(Y1-Vy)/(X1-Vx)。
double k1 = (Line1.Y1 - Line1.Vy) / (Line1.X1 - Line1.Vx);
double k2 = (Line2.Y1 - Line2.Vy) / (Line2.X1 - Line2.Vx);
//交点
crossPoint.X = (k1 * Line1.Vx - Line1.Vy - k2 * Line2.Vx + Line2.Vy) / (k1 - k2);
crossPoint.Y = (k1 * k2 * (Line1.Vx - Line2.Vx) + k1 * Line2.Vy - k2 * Line1.Vy) / (k1 - k2);
}
}