Python/OpenCV - 在 OpenCV 中使用两种不同的霍夫线方法检测网球场中的线 - 获得不同的结果

2024-01-13

我正在尝试使用 openCV 和霍夫变换检测网球场中的线。我想找到水平线和垂直线,以便找到交点并最终检测网球场的角落。

Here the original image. enter image description here

但我有一些问题。

1)我尝试使用 HoughLineP 。 这里的代码:

gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

edges = cv2.Canny(gray,100,200,apertureSize = 3)
lines = cv2.HoughLinesP(edges, 1, np.pi/2, 6, None, 50, 10);
for line in lines[0]:
    pt1 = (line[0],line[1])
    pt2 = (line[2],line[3])
    cv2.line(img, pt1, pt2, (0,0,255), 2)
cv2.imshow('dst',img)

return res

结果如下:houghLineP 的结果 http://www.hostingpics.net/viewer.php?id=726975houghP.png

2)我尝试使用HoughLines 这是代码

gray=cv2.cvtColor(res,cv2.COLOR_BGR2GRAY)

edges = cv2.Canny(gray,100,200,apertureSize = 3)


#Lignes
lines = cv2.HoughLines(edges,1,np.pi/70,110)
for rho,theta in lines[0]:
    if (np.pi/70 <= theta <= np.pi/7) or (2.056 < theta < 4.970) or (1.570 <= theta <= 1.600): #(2,6 <=theta <= 26) or (theta >118 and theta <= 285)

        a = np.cos(theta)
        b = np.sin(theta)
        x0 = a*rho
        y0 = b*rho
        x1 = int(x0 + 1000*(-b))
        y1 = int(y0 + 1000*(a))

        x2 = int(x0 - 1000*(-b))
        y2 = int(y0 - 1000*(a))

        cv2.line(res,(x1,y1),(x2,y2),(0,0,255),1)

结果如下:霍夫线的结果 http://www.hostingpics.net/viewer.php?id=282743houghline.png

在第一种情况下,我只有很少的线条,我想过延长它们,但我没有找到...我尝试使用 fitLine 但它只适用于查找轮廓(findContours 方法在这张图片中很糟糕)

在第二种情况下,它工作得很好,但我有很多线,几乎相同,在右下角,我没有任何交集来检测角点......

也许我走错路了...

您有一些想法或可行的东西吗?最后,我只想要与网球场有关的兴趣点。

ps : I did a method which calculate the intersection between the horizontal lines and the vertical lines. enter image description here

非常感谢,


看起来HougLines 输出的行包含您想要的行。您只需要过滤掉异常值即可。

为此,您可以使用网球场的模型。您所知道的是您拥有:

  • 字段的外部界限,由一个大矩形表示
  • 两条走廊,由两条从侧面切割矩形的线表示
  • 发球方格,同样由两条线表示,一条平行于发球线,一条平行于边

例如,您可以尝试从必须过滤掉异常值的模型中获利。有些方法,比如RANSAC http://en.wikipedia.org/wiki/RANSAC,就是为此而设计的。基本思想是采取随机点,计算模型并检查数据是否合适。经过几次迭代后,最适合的模型很可能就是您正在寻找的模型。这是一种众所周知的方法(由 Fischler 于 1986 年首次发布),因此您可以找到大量相关文档。让我们举一个适合您的简单示例算法(可能需要进行调整):

  1. 在线交叉点内随机取 4 个点。计算将这些点映射到场的顶视图的透视投影 P。您可以使用 OpenCV 的 getPerspectiveTransform 来实现此目的。现在,您已在俯视图中获得了该场的模型。

  2. 由于您有场地模型(基于网球规则),因此您可以说出其他线的交叉点(服务线与走廊线、服务广场..)应该在顶视图上的位置。如果对这些点应用透视变换 P^{-1} 的逆,它们就会出现在图像空间中。

  3. 检查一致性:寻找图像空间中与模型的线最接近的交点。这里你应该有一个度量:距离小于 x 像素的线的交叉点数量,或 SSD。您将使用此指标来评估不同的模型。

  4. 对您的模型进行评分:如果您定义的指标小于之前找到的最佳模型,则这现在是您当前的最佳模型

  5. 迭代。您进行的迭代次数直接关系到最终选择好模型的概率。查看 Fischler 和 Bolls 的开创性工作,了解如何设置迭代次数。

在这里,在迭代结束时,您将找到最适合您的数据的模型,即描述网球场的内部值和不描述网球场的异常值。请注意,此方法对于大量异常值(超过 50%)具有鲁棒性,但获得良好结果的机会只是统计性的(不过,您可以通过调整迭代次数来设置结果的预期质量)。

希望这可以帮助,

Ben

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python/OpenCV - 在 OpenCV 中使用两种不同的霍夫线方法检测网球场中的线 - 获得不同的结果 的相关文章

  • 如何在 Python 中使用 .format() 打印“for”循环中的列表?

    我是 Python 新手 我正在编写一段非常简单的代码 使用 for 循环打印列表的内容 format 我想要如下的输出 但我收到此错误 names David Peter Michael John Bob for i in names p
  • Python - 定义常量列表或字典的最佳/最简洁的方法

    第一次使用堆栈溢出 我很高兴来到这里 简介 我最近开始了 Python 编程世界的神奇冒险 我喜欢它 现在 在我从 C 语言的尴尬过渡中 一切都进展顺利 但我在创建与标头文件 h 同义的内容时遇到了麻烦 问题 我有中等大小的字典和列表 大约
  • Flask/Apache 提交按钮用于文件上传

    我有一个在 apache 后面运行的 Flask 应用程序 在我的 index html 页面上有一个文件上传按钮和一个提交按钮 如下所示
  • PyQt4 信号和槽

    我正在使用 PyQt4 编写我的第一个 Python 应用程序 我有一个 MainWindow 和一个 Dialog 类 它是 MainWindow 类的一部分 self loginDialog LoginDialog 我使用插槽和信号 这
  • 使用 for 循环 Python 为数组赋值

    我正在尝试将字符串的值分配给不同的数组索引 但我收到一个名为 列表分配超出范围 的错误 uuidVal distVal uuidArray distArray for i in range len returnedList for beac
  • 使用解析将 ** 运算符更改为幂函数?

    我的要求是将 运算符更改为幂函数 例如 1 Input B 2 Output power B 2 2 B 2 T 2 X Output power B 2 我写了下面的正则表达式来解决这个问题 rx r a zA Z0 9 a zA Z0
  • 创建一个行为类似于任何变量但具有更改/读取回调的类

    我想创建一个类 其行为类似于 python 变量 但在更改 读取 变量 时调用一些回调函数 换句话说 我希望能够按如下方式使用该类 x myClass change callback read callback 将 x 定义为 myclas
  • 计算 for 循环期间的运行总计 - Python

    编辑 下面是我根据收到的反馈 答案编写的工作代码 这个问题源于我之前使用 MIT 的开放课件学习 Python CS 时提出的问题 在这里查看我之前的问题 https stackoverflow com questions 4990159
  • 使用 shell=True 将 PATH 设置为 bitbake 的“source”在 Python 中没有效果

    下面是shell脚本中的代码 source proj common tools repo etc profile d repo sh repo project init branch repo project sync source pok
  • PyCharm 输出错误消息散布在控制台输出中。如何解决这个问题?

    我正在运行 PyCharm 社区版 4 0 4 有谁知道为什么控制台输出后不显示错误消息 Thanks C Python27 python exe F Google Drive code python scripts leetcode lc
  • Pandas:向量化局部范围操作([i:i+2] 行的最大值和总和)

    我希望在数据帧中的每一行的局部范围内进行计算 同时避免速度缓慢for环形 例如 对于下面数据中的每一行 我想找到未来 3 天内 包括当天 的最高气温以及未来 3 天内的总降雨量 Day Temperature Rain 0 30 4 1 3
  • 使用 python 写入 aws lambda 中的 /tmp 目录

    Goal 我正在尝试将 zip 文件写入 python aws lambda 中的 tmp 文件夹 因此我可以在压缩之前提取操作 并将其放入 s3 存储桶中 Problem 操作系统 Errno30 只读文件系统 这段代码在我的计算机上进行
  • Mac 上的 Errno 13 权限被拒绝

    我只是测试如何从一个 py 文件调用外部 py 文件 我有 2 个 py 文件 都在同一目录中 这是主要代码 runext py 假设调用 ext py import subprocess subprocess call Users tra
  • 如何使用 Python Pandas 制作 DataFrame 切片并在特定切片中“fillna”?

    问题 让我们从 Kaggle 获取泰坦尼克号数据集 我有包含 Pclass 性别 和 年龄 列的数据框 我需要用特定组的中位数填充 年龄 列中的 NaN 如果是来自一等的女性 我想用一等女性的中位数填写她的年龄 而不是整个年龄列的中位数 问
  • python 中的异步编程

    python 中有异步编程的通用概念吗 我可以为一个函数分配一个回调 执行它并立即返回主程序流 无论该函数的执行需要多长时间吗 您所描述的 主程序流程在另一个函数执行时立即恢复 不是通常所说的 异步 又名 事件驱动 编程 而是 多任务 又名
  • Python写入dbf数据时出错

    我得到这个错误 DbfError unable to modify fields individually except in with or Process 如何修复它 这是我的code with dbf Table aa dbf as
  • Numba jitclass 不适用于 python 列表

    我在用python 3 6 and numba 0 36 这个问题有一个sister https stackoverflow com questions 48159360 numba custom stack class and pop f
  • 磁盘寻道时间测量方法

    我编写了一个脚本来测量 HDD 上的寻道时间 并且其完成方式的微小变化会导致显着不同的时间 第一个周期在磁盘开头的区域内进行跳转 第二个周期选择磁盘上执行查找的随机区域 相同大小 这种方法显然不同 但我不明白为什么它会改变结果 请注意 对于
  • 使用 Tweepy 获取推文时出错

    我有一个用于获取推文的 Python 脚本 在脚本中我使用该库 Tweepy 我使用有效的身份验证参数 运行此脚本后 一些推文存储在我的 MongoDB 中 有些则被 if 语句拒绝 但我仍然收到错误 requests packages u
  • 如何平滑循环列向量

    这是一个 OpenCV2 问题 我有一个矩阵代表closed空间曲线 cv Mat

随机推荐