【发布时间】:2020-02-22 13:06:30
【问题描述】:
我正在使用来自足球(足球)比赛的视频,并尝试使用单应性将帧映射到球场的顶视图。我已经开始使用霍夫线和线段检测器从帧中找到所有白线,其中线段检测器似乎工作得更好。请参阅下面的代码和示例:
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)。非常感谢任何帮助!
【问题讨论】:
-
如果您将线段作为单独的对象,我会尝试根据它们的长度过滤它们,例如只保留 10-20 左右最长的线段。至少从您的示例来看,这应该过滤掉大部分误报。
-
这似乎有点工作,当这样做时,我似乎错过了该领域的一些实际行。使用线段检测器似乎工作得更好一些,也减少了误报的数量。您对提取点的好方法有什么想法,我可以将这些点映射到该字段的自上而下视图?
-
查找线端点附近的线交点。