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)使用检测线创建一个好的方法单应性,这样我就可以将框架映射到该领域的更高概述(像这样)。任何帮助是极大的赞赏!
使用 RANSAC 将两支线中的线段聚类。线铅笔是一组相交于公共点的线。对于齐次坐标,交点可能位于无穷远(例如,如果所有线都是平行的)。
您可以找到两条随机线段,计算它们的交点,然后考虑稍微接近该交点(在某个阈值内)的所有线。重复此操作,直到找到线段数量最多的两支铅笔。然后我们可以假设这些铅笔对应于消失点。
在这里,蓝色和红色部分对应于两支铅笔。绿色部分是异常值。正如您所看到的,RANSAC 算法非常擅长拒绝异常值。
我不知道 OpenCV 是否专门针对线段进行内置校正;现有功能旨在处理点对应关系。
运行优化以恢复单应性以处理方向。一般来说,单应性的H形式是H = KRK^-1其中K是固有矩阵,R是旋转矩阵。
例如,您可以对李群 SO(3) 的流形运行非线性最小二乘优化来恢复矩阵R。例如,您可以LocalParameterization在 Ceres 求解器中使用使用。但用 Python 自己实现这个也非常简单。如果焦距未知,您还必须将其添加为优化参数。
除了非线性最小二乘法之外,可能还有其他方法。一些方法直接估计单应性,但可能无法保留正确的纵横比。
您可以通过调用opencv的WarpPerspective函数来预览单应性。
这将涉及了解足球场的几何形状。您可以检测足球场特有的一些显着特征并估计其规模。例如,您可以使用圆霍夫变换来检测圆弧。
| 归档时间: |
|
| 查看次数: |
5601 次 |
| 最近记录: |