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

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

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

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

简单解释一下原理:

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

联立方程组为:,其中|,之后任意取线上一点即可得b1与b2,至此两条直线就已经得到。

之后,推导计算公式

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

最后,考虑特殊情况

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

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

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

代码(以下第一版,存在bug,麻烦看尾部第二版)

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=Noneb2=0else:k2=(y4-y3)*1.0/(x4-x3)#斜率存在操作b2=y3*1.0-x3*k2*1.0if k2==None:x=x3else:x=(b2-b1)*1.0/(k1-k2)y=k1*x*1.0+b1*1.0return [x,y]

对程序进行测试:

line1=[1,1,-1,-1]
line2=[-1,1,1,-1]
print cross_point(line1, line2)

结果如下,且正确:

第二版代码

def cross_point(line1, line2):  # 计算交点函数x1 = line1[0]  # 取直线1的第一个点坐标y1 = line1[1]x2 = line1[2]  # 取直线1的第二个点坐标y2 = line1[3]x3 = line2[0]  # 取直线2的第一个点坐标y3 = line2[1]x4 = line2[2]  # 取直线2的第二个点坐标y4 = line2[3]if x2 - x1 == 0:  # L1 直线斜率不存在k1 = Noneb1 = 0else:k1 = (y2 - y1) * 1.0 / (x2 - x1)  # 计算k1,由于点均为整数,需要进行浮点数转化b1 = y1 * 1.0 - x1 * k1 * 1.0  # 整型转浮点型是关键if (x4 - x3) == 0:  # L2直线斜率不存在操作k2 = Noneb2 = 0else:k2 = (y4 - y3) * 1.0 / (x4 - x3)  # 斜率存在操作b2 = y3 * 1.0 - x3 * k2 * 1.0if k1 is None and k2 is None:  # L1与L2直线斜率都不存在,两条直线均与y轴平行if x1 == x3:  # 两条直线实际为同一直线return [x1, y1]  # 均为交点,返回任意一个点else:return None  # 平行线无交点elif k1 is not None and k2 is None:  # 若L2与y轴平行,L1为一般直线,交点横坐标为L2的x坐标x = x3y = k1 * x * 1.0 + b1 * 1.0elif k1 is None and k2 is not None:  # 若L1与y轴平行,L2为一般直线,交点横坐标为L1的x坐标x = x1y = k2 * x * 1.0 + b2 * 1.0else:  # 两条一般直线if k1 == k2:  # 两直线斜率相同if b1 == b2:  # 截距相同,说明两直线为同一直线,返回任一点return [x1, y1]else:  # 截距不同,两直线平行,无交点return Noneelse:  # 两直线不平行,必然存在交点x = (b2 - b1) * 1.0 / (k1 - k2)y = k1 * x * 1.0 + b1 * 1.0return [x, y]

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

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

python 计算两直线交点相关推荐

  1. 根据倾斜矩形中心点,长宽和倾斜角度,计算顶点,计算两直线交点

    已知倾斜矩形中心点center,长w,宽h,倾斜角theta.顶点计算公式为: void getRectVertex(const cv::Point center,float theta,float ...

  2. 一种计算两直线交点的方法

    写在前面: 文章转载请注明出处,谢谢! 对于计算四个点表达的两条直线交点这个问题其实网上相应的代码与数学模型比较好找,所以这里无法保证提供的思路就是最正确或效率最高的,如果能帮助到你那真的是万分荣幸 ...

  3. 记录:python 求两直线交点

    本人数学渣渣,公式来自知乎大佬,大佬真是太强了. https://www.zhihu.com/question/381406535/answer/1095948349 用方程法,避开了算K,真是太强了 ...

  4. 分别已知两直线上的两点,求两直线交点

    分别已知两直线上的两点,求两直线交点 求两直线的交点是初中数学的简单问题了,在直角坐标系中直线有很多种表示方式.同时我们知道两点确定一条直线,已知两点坐标自然能求出直线坐标,已知两直线坐标自然能求出两 ...

  5. Python计算两个numpy数组的交集(Intersection)实战:两个输入数组的交集并排序、获取交集元素及其索引、如果输入数组不是一维的,它们将被展平(flatten),然后计算交集

    Python计算两个numpy数组的交集(Intersection)实战:两个输入数组的交集并排序.获取交集元素及其索引.如果输入数组不是一维的,它们将被展平(flatten),然后计算交集 目录

  6. python计算两个字典的相同点(从key、value、item角度)

    python计算两个字典的相同点(从key.value.item角度) 字典是由一个一个的 key-value 构成的,key 是找到数据的关键,Python 对字典的操作都是通过 key 来完成的. ...

  7. python计算两个向量之间的欧氏距离

    python计算两个向量之间的欧氏距离 代码: import numpy as np # 向量的值 feature_1 = np.array([1,2,3]) feature_2 = np.array ...

  8. java 求两线交点_JAVA求两直线交点和三角形内外心的编程代码

    JAVA求两直线交点和三角形内外心的编程代码 一.求两直线交点 复制代码 代码如下: class Point { double x; double y; public Point() { this.x ...

  9. CAD中如何快速找到两直线交点?

    CAD是在很多行业都是必备的绘图软件,那么CAD中如何快速找到两直线交点?在CAD制图过程中,想要找出两直线交点该如何操作呢? 1.首先打开CAD制图工具迅捷CAD编辑器专业版,标准版同样也可以进行操 ...

最新文章

  1. linux驱动之i2c子系统mpu6050设备驱动
  2. python中data.find_all爬取网站为空列表_Python网络爬虫之Scrapy 框架-分布式【第二十九节】...
  3. 洛谷 P2738 [USACO4.1]篱笆回路Fence Loops
  4. apple tv 开发_如何防止Apple TV进入睡眠状态
  5. .NET 6 Preview 1 开箱,带你体验新版本
  6. JS-取出字符串中重复次数最多的字符并输出
  7. 韩信大招:一致性哈希
  8. Laravel Homestead安装笔记
  9. php安装调式redis扩展,下载安装thinkphp5.0,调试Redis是否可以正常使用
  10. tomcat 改端口 运维最最重要的就是有看日志的习惯
  11. GD32f103介绍第二章
  12. 机器学习理论知识的自学整理(持续更新,建议收藏)
  13. POSTING_INTERFACE_DOCUMENT解决特别总账'W'类型的过账问题
  14. Elasticsearch索引yellow修复
  15. [2019 icpc徐州] H.Yuuki and a problem 带修改的主席树(主席树+树状数组)
  16. 招银网络---C++
  17. 磨金石教育摄影技能干货分享|那些酷炫的照片是怎么拍出来的?
  18. 等级保护测评策略建议整改措施
  19. α-IoU | 再助YOLOv5登上巅峰,造就IoU Loss大一统
  20. 华为机试真题 Java 实现【数字涂色】

热门文章

  1. RabbitMQ消息确认机制和消息重发机制
  2. 四种傅里叶变换的简述
  3. 微信小程序 nodejs+vue校园学生社团管理系统
  4. java oracle 时间查询_Oracle 日期查询
  5. 2022年最新宁夏建筑安全员模拟题库及答案
  6. R-2R梯形网络 DAC简易的电路
  7. Linux-uboot-学习笔记(10):移植三星官方uboot
  8. 组合数学——特征方程与线性递推方程
  9. ENVE5.3安装与汉化(一次性安装成功附安装包)
  10. vue中基于echarts和基于高德地图的两种地图下钻与上浮方式