足球场线的单应性

2024-10-09 02:19:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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]

这将使用此输入帧

enter image description here

并返回此图像的霍夫线

enter image description here

并将此图像用于线段检测

enter image description here

我的问题有两个:(1)关于如何进一步细化线条检测(即减少误报,如球员周围和球场外的线条)的想法;(2)使用检测线条创建单应性的好方法,以便我可以将帧映射到更高的球场概览(like this)。非常感谢您的帮助


Tags: importnpmaskgreencv2hsvframe检测器
1条回答
网友
1楼 · 发布于 2024-10-09 02:19:47

铅笔行

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

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

line segments

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

矫正

我不知道有专门针对线段的内置OpenCV校正;现有功能设计用于处理点对应

运行优化以恢复单应性以处理方向。通常,单应性H的形式为H = KRK^-1,其中K是本征矩阵R是旋转矩阵

例如,您可以在Lie群SO(3)的流形上运行非线性最小二乘优化以恢复R矩阵。例如,您可以使用^{} in Ceres solver。但自己用Python实现这一点也很简单。如果焦距未知,您还必须将其添加为优化参数

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

warped using homography

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

估计翻译和比例尺

这将涉及到对足球场几何的了解。您可以检测足球场特有的一些显著特征,并估计其规模。例如,可以使用圆Hough变换检测圆弧

football field superimposed

相关问题 更多 >

    热门问题