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 中使用 Selenium 处理“接受 Cookie”弹出窗口

    我一直在尝试用硒抓取这个房地产网站的一些信息 但是 当我访问该网站时 我需要接受 cookie 才能继续 这仅在机器人访问网站时发生 而不是在我手动执行时发生 当我尝试通过 xpath 或 id 查找相应的元素时 正如我在手动检查页面时找到
  • 从正在运行的 python 脚本检测优化标志是否为 -O 或 -OO

    有时我想生成一个子进程 其优化标志与启动父进程时使用的优 化标志相同 我可以使用类似的东西 optimize not debug 但这样我就可以匹配两者 O and OO flags 是否有一些 python 内部状态包含该信息 经过一番深
  • 在 Numpy 中切片后确定结果数组的形状

    我很难理解在 numpy 中切片后如何确定结果数组的形状 例如 我使用以下简单代码 import numpy as np array np arange 27 reshape 3 3 3 slice1 array 1 2 1 slice2
  • 一次将Python dict的内容分配给多个变量?

    我想做这样的事情 def f return a 1 b 2 c 3 a b f or a b f IE 这样 a 被分配为 1 b 被分配为 2 并且 c 是未定义的 这与此类似 def f return 1 2 a b f 依赖于变量名称
  • 如何确定非阻塞套接字是否真正连接?

    这个问题不仅限于Python 这是一个一般的套接字问题 我有一个非阻塞套接字 想要连接到一台可访问的机器 在另一端 该端口不存在 为什么 select 仍然成功 我预计会超时 sock send 因管道损坏而失败 select 之后如何确定
  • OpenCV InRange 参数

    我在 Android 上使用 OpenCV 来实时查找特定颜色的圆圈 我的第一步是仅保留与我正在寻找的定义颜色相对应的像素 在本例中为红色或绿色 示例图像 https i stack imgur com CIozU jpg 为此 我正在使用
  • Pandas重置索引未生效[重复]

    这个问题在这里已经有答案了 我不确定我在哪里误入歧途 但我似乎无法重置数据帧上的索引 当我跑步时test head 我得到以下输出 正如您所看到的 数据帧是一个切片 因此索引超出范围 我想做的是重置该数据帧的索引 所以我跑test rese
  • 在径向(树)网络x图中查找末端节点(叶节点)

    给定下图 是否有一种方便的方法来仅获取末端节点 我所说的端节点是指那些具有一个连接边的到节点 我认为这些有时被称为叶节点 G nx DiGraph fromnodes 0 1 1 1 1 1 2 3 4 5 5 5 7 8 9 10 ton
  • 如何通过双击在浏览器中打开 ipynb 文件

    以前 我安装了 Canopy 当时 我只需双击 ipynb 文件并在浏览器中打开它们即可 但是 后来我需要Anaconda 一旦我安装了它 这个功能就没有了 现在我只希望能够简单地双击 ipynb 文件 然后该文件就会在 Firefox 中
  • 如何在 Python 中将彩色输出打印到终端?

    是否有与 Perl 等效的 Python 语言 print color red print
  • spacy 如何使用词嵌入进行命名实体识别 (NER)?

    我正在尝试使用以下方法训练 NER 模型spaCy识别位置 人 名和组织 我试图理解如何spaCy识别文本中的实体 但我无法找到答案 从这个问题 https github com explosion spaCy issues 491在 Gi
  • Python 中的 @staticmethod 与 @classmethod

    方法和方法有什么区别装饰的 https peps python org pep 0318 with staticmethod http docs python org library functions html staticmethod和
  • 无法截取宽度为 0 的屏幕截图

    我正在尝试截取 Bootstrap 模态内元素的屏幕截图 经过一番努力 我终于想出了这段代码 driver get https enlinea sunedu gob pe driver find element by xpath div c
  • 如何通过字符串匹配加速 pandas 行过滤?

    我经常需要过滤 pandas 数据框df by df df col name string value 并且我想加快行选择操作 有没有快速的方法可以做到这一点 例如 In 1 df mul df 3000 2000 3 reset inde
  • Flask WTForms 使用变量自动填充 StringField

    我有一个表格 我想用上一页收到的信息自动填充一些字段 但如果他们想调整它 它需要是可更改的 我正在为我的 SelectField 使用动态创建的列表 但添加 StringField 并不成功 请参阅下面的我的代码 forms py clas
  • Python 3.2 中 **kwargs 和 dict 有什么区别?

    看起来Python的很多方面都只是功能的重复 除了我在 Python 中的 kwargs 和 dict 中看到的冗余之外 还有什么区别吗 参数解包存在差异 许多人使用kwargs 并通过dict作为论据之一 使用参数解包 Prepare f
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 检查字符串是否只有字母和空格 - Python

    试图让 python 返回一个字符串仅包含字母和空格 string input Enter a string if all x isalpha and x isspace for x in string print Only alphabe
  • 异步和协程与任务队列

    我一直在阅读有关 python 3 中的 asyncio 模块的内容 以及更广泛地了解 python 中的协程的内容 但我不明白是什么让 asyncio 成为如此出色的工具 我的感觉是 你可以用协程做的所有事情 通过使用基于多处理模块 例如
  • 使用 Python 生成类似于 Messenger 或 kik 代码的圆形二维码

    我可以使用 Python 生成圆形 QR 码 就像 Facebook Messenger 或 kik 使用的那样吗 我访问了很多网站 但找不到这种类型的二维码 默认情况下 Python 生成方形 QR 码 但在我的项目中我想要圆形 QR 码

随机推荐