足球(足球)场线的单应性

Oxb*_*rce 5 python opencv opencv3.0

我正在研究使用足球比赛的视频,并尝试使用单应性将帧映射到球场的俯视图。我已经开始使用霍夫线以及线段检测器找到帧中的所有白线,其中线段检测器似乎工作得稍好一些。请参阅下面我的代码和示例:

import cv2
import numpy as np

cv2.imread("frame-27.jpg")
hsv = cv2.cvtColor(frame, cv2.COLOR_RGB2HSV)
mask_green = cv2.inRange(hsv, (36, 25, 25), (86, 255, 255)) # green mask to select only the field
frame_masked = cv2.bitwise_and(frame, frame, mask=mask_green)

gray = cv2.cvtColor(frame_masked, cv2.COLOR_RGB2GRAY)
_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

canny = cv2.Canny(gray, 50, 150, apertureSize=3)
# Hough line detection
lines = cv2.HoughLinesP(canny, 1, np.pi / 180, 50, None, 50, 20)
# Line segment detection
lines_lsd = lsd.detect(canny)[0]
Run Code Online (Sandbox Code Playgroud)

这使用这个输入框架

在此输入图像描述

并返回该图像的霍夫线

在此输入图像描述

该图像用于线段检测。

在此输入图像描述

我的问题有两个:(1)关于如何进一步完善线检测的任何想法(即减少误报,例如球员周围和场外的线)和(2)使用检测线创建一个好的方法单应性,这样我就可以将框架映射到该领域的更高概述(像这样)。任何帮助是极大的赞赏!

Dan*_*iel 9

铅笔的线条

使用 RANSAC 将两支线中的线段聚类。线铅笔是一组相交于公共点的线。对于齐次坐标,交点可能位于无穷远(例如,如果所有线都是平行的)。

您可以找到两条随机线段,计算它们的交点,然后考虑稍微接近该交点(在某个阈值内)的所有线。重复此操作,直到找到线段数量最多的两支铅笔。然后我们可以假设这些铅笔对应于消失点。

线段

在这里,蓝色和红色部分对应于两支铅笔。绿色部分是异常值。正如您所看到的,RANSAC 算法非常擅长拒绝异常值。

整顿

我不知道 OpenCV 是否专门针对线段进行内置校正;现有功能旨在处理点对应关系。

运行优化以恢复单应性以处理方向。一般来说,单应性的H形式是H = KRK^-1其中K是固有矩阵,R是旋转矩阵。

例如,您可以对李群 SO(3) 的流形运行非线性最小二乘优化来恢复矩阵R。例如,您可以LocalParameterization在 Ceres 求解器中使用使用。但用 Python 自己实现这个也非常简单。如果焦距未知,您还必须将其添加为优化参数。

除了非线性最小二乘法之外,可能还有其他方法。一些方法直接估计单应性,但可能无法保留正确的纵横比。

使用单应性扭曲

您可以通过调用opencv的WarpPerspective函数来预览单应性。

估计翻译和规模

这将涉及了解足球场的几何形状。您可以检测足球场特有的一些显着特征并估计其规模。例如,您可以使用圆霍夫变换来检测圆弧。

足球场叠加

  • 感谢您的广泛回答,这看起来非常有希望!我不得不说,我对计算机视觉领域一点也不精通,所以还有很多东西需要我进一步研究。也许这个要求太多了,但是您有答案中显示的步骤/结果的代码吗? (2认同)
  • 抱歉,我无法提供代码,因为我正在工作中从事类似的工作。但对于运动场校准的一般调查,这里有一系列论文:https://github.com/cemunds/awesome-sports-camera-calibration 尽管它的外观很简单,但它是一个相当困难的课题,并且正在进行积极的研究。 (2认同)