Kinect + OpenCV:无法使用 python 中的 cv2.solvePnP 获取旋转矢量

Kinect + OpenCV : Unable to fetch rotational vectors using cv2.solvePnP in python

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

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

  2. 在现实世界的坐标中找到深度(Z)后,我正在使用等式计算现实世界的 X 和 Y:X = (Zu)/ fx 和 Y = (Zv)/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.

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

我只需要检查图像中有超过 4 个点的轮廓,我的代码按预期工作,我能够准确地计算 6 个自由度,而且现在我已经做到了它更复杂,很快我就可以分享 git link 我的作品。

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