我正在开展一个项目,我需要跟踪空中物体并计算六个自由度。
我正在跟踪彩球,并在rgb_frame中计算它们的中心,并使用中心值在depth_frame中找到深度。
在现实世界中找到深度(Z)后,我使用公式计算现实世界的X和Y:X =(Z u)/ fx和Y =(Z v)/ fy,其中fx,fy是从kinect的内部参数获得的焦距,在这种情况下u和v是中心的sx,y值。
我将(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: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
。
答案 0 :(得分:1)
虽然我的方法完全正确,但我错过了在实际坐标中计算3D物体方向的事实,我们需要在像素和物体坐标中至少有4个以上的对应点集。
我只需检查图像中有超过4个点的轮廓,并且我的代码按预期工作,并且我能够准确地计算6自由度,而且现在我已经做了更多很复杂,我很快就能分享到我工作的git链接。
我仍然想听听,如何成功测试我能够使用罗德里格斯公式计算的方向的正确性。