gpt4 book ai didi

python - 从单个 2D 视频重建飞行物体的 3D 轨迹

转载 作者:行者123 更新时间:2023-12-02 17:28:15 32 4
gpt4 key购买 nike

enter image description here

我正在尝试仅使用广播源来重建篮球的 3D 轨迹。
为此,我必须计算单应矩阵,因此在每一帧中,我都成功地跟踪了球,以及它们在“现实世界”中的位置已知的 6 个点(4 个在球场上,2 个在篮板上)为在图片中看到。

使用物理定律,我还在每一帧中近似了球的 z 坐标。

现在我想将球的位置从 2D 像素坐标映射到现实世界。我现在拥有的代码(稍后附上)输入像素位置(u,v)和高度(z)并输出x,y,z位置。它适用于球场上的点(意味着 z=0),但是当我需要跟踪空中的某物(球)时,结果没有意义。如果有人可以帮助告诉我需要做些什么来获得映射,我将不胜感激。

# Make empty list for ball's 3D location
ball_3d_location = []
# Fixed things
size = frame_list[0].shape
focal_length = size[1]
center = (size[1]/2, size[0]/2)
camera_matrix= np.array(
[[focal_length, 0, center[0]],
[0, focal_length, center[1]],
[0, 0, 1]], dtype = "double"
)
def groundProjectPoint(image_point, z = 0.0):
camMat = np.asarray(camera_matrix)
iRot = np.linalg.inv(rotMat)
iCam = np.linalg.inv(camMat)
uvPoint = np.ones((3, 1))

# Image point
uvPoint[0, 0] = image_point[0]
uvPoint[1, 0] = image_point[1]

tempMat = np.matmul(np.matmul(iRot, iCam), uvPoint)
tempMat2 = np.matmul(iRot, translation_vector)

s = (z + tempMat2[2, 0]) / tempMat[2, 0]
wcPoint = np.matmul(iRot, (np.matmul(s * iCam, uvPoint) - translation_vector))

# wcPoint[2] will not be exactly equal to z, but very close to it
assert int(abs(wcPoint[2] - z) * (10 ** 8)) == 0
wcPoint[2] = z

return wcPoint
dist_coeffs = np.zeros((4,1)) # Assuming no lens distortion

# The tracked points coordinates in the "Real World"
model_points = np.array([
(0,1524/2,0), #Baseline-sideline
(0,-244,0), #Paint-sideline
(579,-244,0), #Paint-FT
(579,1524/2,0), #Sideline-FT
(122,-182.9/2,396.32),#Top Left Backboard
(122,182.9/2,396.32)],dtype=np.float32 #Top Right BackBoard
)
for i,frame in enumerate(bball_frames):
f =frame
#This array has the pixel coordinates of the court & backboard points
image_points =np.array([f.baseline_sideline,
f.paint_sideline,
f.paint_ft,
f.sideline_ft,
f.top_left_backboard,
f.top_right_backboard],dtype=np.float32)

(success, rotation_vector, translation_vector) = cv2.solvePnP(model_points, image_points, camera_matrix, dist_coeffs, flags=cv2.SOLVEPNP_ITERATIVE)

rotMat, _ = cv2.Rodrigues(rotation_vector)
#We assume we know the ball's height in each frame due to the laws of physics.
ball_3d_location+=[groundProjectPoint(image_point=ball_2d_location[i],z = ball_height[i])]

编辑: Is this how to calculate the basketball's height?

最佳答案

首先,我想澄清引用平面:

  • 您拥有的视频是 3D 世界的 2D 投影(视平面),作为垂直于相机镜头中心线的平面。
  • 射门弧嵌入一个平面(射门平面),该平面垂直于真实世界 (3D) 地板,由出手点(射手的手)和接触点(篮板)定义。

  • 您在视频中看到的镜头弧线是从该镜头平面到观察平面的投影。

    I want to make sure we're clear with respect to your most recent comment: So let's say I can estimate the shooting location on the court (x,y). using the laws of physics I can say where the ball is in each frame (x,y) wise and then from that and the pixel coordinates I can extract the height coordinate?


  • 实际上,您可以估计 (x,y) 坐标。但是,我不会将我的方法归因于“物理定律”。我会使用解析几何。
  • 您可以非常准确地估计出手点(从射手脚的已知 (x, y, 0) 位置)和篮板上的终点(其角点已知)的 3D 坐标。
  • 从这些点中的每一个垂线到地板(z = 0)。地板上的那条线是弧线到地板的垂直投影——这些是飞行中球的 (x,y) 坐标。
  • 对于每个视频帧,从球的图像投影垂直线到地板上的那条线......这会为您提供球的 (x,y) 坐标,这是值得的。
  • 您有 View 平面、视点(相机)和弧平面的定义(方程式)。要确定每个视频帧的球位置,请从视点画一条线,穿过球在 View 平面上的图像。确定这条线与圆弧平面的交点。这为您提供了该帧中球的 3D 坐标。

  • 这是否阐明了一条有用的攻击路线?

    关于python - 从单个 2D 视频重建飞行物体的 3D 轨迹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57613477/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com