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

时间:2015-11-26 01:15:11

标签: python opencv openni openkinect

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

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

  2. 在现实世界中找到深度(Z)后,我使用公式计算现实世界的X和Y:X =(Z u)/ fx和Y =(Z v)/ fy,其中fx,fy是从kinect的内部参数获得的焦距,在这种情况下u和v是中心的sx,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)

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

    cv2.Rodrigues(rvecs)
    

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

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

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

    我也理解不建议只发送中心的物体和图像点。这是我迈向实现的第一步。我打算使用像SIFT这样的特征检测器,以便以后更有趣。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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