python 计算两直线交点

最近在做图像的透射变换,有一个关键问题就是找到原图像内四边形的四个顶点。

在处理过程中,经过霍夫直线检测后,即可得到四边形的四边。而边的表示形式为:[x1,y1,x2,y2],即以两点确定一条直线。

因此,需要通过编写一个函数计算两直线交点。

首先,我们定义:直线L1:[x1,y1,x2,y2],直线L2:[x3,y3,x4,y4]

简单解释一下原理:

两点确定一条直线,而每一条直线都可以表示为:Y=kX+b 的形式(即直线的斜截式方程),找到两条直线的斜截式方程后联立方程组,求解。

联立方程组为:python 计算两直线交点_第1张图片,其中|,之后任意取线上一点即可得b1与b2,至此两条直线就已经得到。

之后,推导计算公式

通过联立的方程组,可以解得横坐标x为:,取直线L1,将x带入即可得纵坐标y。

最后,考虑特殊情况

某一直线为水平直线,斜率为0,此时交点纵坐标直接取水平线上两点任一点的纵坐标。(该情况不会引起程序错误,因此未加考虑)

某一直线为竖直直线,斜率不存在,此时交点横坐标直接取竖直线上两点任一点的横坐标。(代码考虑L2可能存在该情况)

两条直线均水平或均竖直,则无交点。(代码未考虑该情况)

代码

def cross_point(line1,line2):#计算交点函数
    x1=line1[0]#取四点坐标
    y1=line1[1]
    x2=line1[2]
    y2=line1[3]
    
    x3=line2[0]
    y3=line2[1]
    x4=line2[2]
    y4=line2[3]
    
    k1=(y2-y1)*1.0/(x2-x1)#计算k1,由于点均为整数,需要进行浮点数转化
    b1=y1*1.0-x1*k1*1.0#整型转浮点型是关键
    if (x4-x3)==0:#L2直线斜率不存在操作
        k2=None
        b2=0
    else:
        k2=(y4-y3)*1.0/(x4-x3)#斜率存在操作
        b2=y3*1.0-x3*k2*1.0
    if k2==None:
        x=x3
    else:
        x=(b2-b1)*1.0/(k1-k2)
    y=k1*x*1.0+b1*1.0
    return [x,y]
对程序进行测试:
line1=[1,1,-1,-1]
line2=[-1,1,1,-1]
print cross_point(line1, line2)

结果如下,且正确:

编程环境为python2.7,直线的数据结构为列表。

若有任何问题欢迎交流~谢谢观看

你可能感兴趣的:(Python,两直线求交点,Python,Opencv)