3

我正在做一个项目,我需要跟踪空中物体并计算六个自由度。

  1. 我目前正在跟踪彩色球,并在 rgb_frame 中计算它们的中心,并使用中心值来查找 depth_frame 中的深度。

  2. 在现实世界的坐标中找到深度(Z)后,我正在使用等式计算现实世界的 X 和 Y: X = (Z u)/fx 和 Y = (Z v)/fy ,其中 fx,fy是从 kinect 的固有参数获得的焦距,在这种情况下 u 和 v 是中心的 x,y 值。

  3. 我将 (u,v) 视为图像点,将 (X,Y,Z) 视为图像点并输入此方法:solvePnP

    obj_pts = np.array([[X,Y,Z]],np.float64) img_pts = np.array([[u,v]],np.float64)

    ret,rvecs,tvecs = cv2.solvePnP(obj_pts,img_pts,camera_matrix2,np_dist_coefs)

我希望找到将用作输入的 rvecs:

cv2.Rodrigues(rvecs)

得到欧拉角,即俯仰、偏航、滚动。

我目前遇到了 solvePnP 调用的问题,这给了我以下错误:

/opencv-3.0.0/modules/calib3d/src/solvepnp.cpp:61: 错误: (-215) npoints >= 0 && npoints == std::max(ipoints.checkVector(2, CV_32F), ipoints.checkVector (2, CV_64F)) 在函数solvePnP

我也明白不建议只发送中心的对象和图像点。这是我迈向实现的第一步。我打算使用像 SIFT 这样的特征检测器,让它在以后变得更有趣。

任何人都可以建议我的方法并帮助我完成找到六个自由度:

forward/back, up/down, left/right, pitch, yaw, roll.

4

1 回答 1

1

虽然我的方法完全正确,但我错过了这样一个事实,即要在实坐标中计算 3D 对象的方向,我们需要至少 4 个以上像素和对象坐标中的对应点集。

我只需要检查图像中超过 4 个点的轮廓,我的代码就可以按预期工作,并且我能够准确地计算 6 自由度,而且现在我已经让它变得更加复杂并且很快我将能够分享我工作的 git 链接。

我仍然想听听,如何成功测试我能够使用罗德里格斯公式计算的方向的正确性。

于 2015-12-06T19:08:17.757 回答