我正在使用足球比赛的视频,并尝试使用单应性将帧映射到球场的俯视图。我已经开始使用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]
这将使用此输入帧
并返回此图像的霍夫线
并将此图像用于线段检测
我的问题有两个:(1)关于如何进一步细化线条检测(即减少误报,如球员周围和球场外的线条)的想法;(2)使用检测线条创建单应性的好方法,以便我可以将帧映射到更高的球场概览(like this)。非常感谢您的帮助
铅笔行
使用RANSAC将两支铅笔中的线段进行聚类。一束线是在一个公共点相交的一组线。对于齐次坐标,交点可能位于无穷远处(例如,如果所有直线平行)
你可以找到两个随机的线段,计算它们的交叉点,然后考虑所有在接近某个交点处的线(在某个阈值内)。重复此操作,直到找到线段数量最多的两支铅笔。然后我们可以假设这些铅笔对应于消失点
在这里,蓝色和红色部分对应于两支铅笔的线条。绿色部分是异常值。正如您所看到的,RANSAC算法非常擅长拒绝异常值
矫正
我不知道有专门针对线段的内置OpenCV校正;现有功能设计用于处理点对应
运行优化以恢复单应性以处理方向。通常,单应性
H
的形式为H = KRK^-1
,其中K
是本征矩阵R
是旋转矩阵例如,您可以在Lie群SO(3)的流形上运行非线性最小二乘优化以恢复} in Ceres solver 。但自己用Python实现这一点也很简单。如果焦距未知,您还必须将其添加为优化参数
R
矩阵。例如,您可以使用^{除了非线性最小二乘法,可能还有其他方法。有些方法直接估计单应性,但可能无法保持正确的纵横比
可以通过调用opencv的
WarpPerspective
函数预览单应性估计翻译和比例尺
这将涉及到对足球场几何的了解。您可以检测足球场特有的一些显著特征,并估计其规模。例如,可以使用圆Hough变换检测圆弧
相关问题 更多 >
编程相关推荐