我正在做一个项目,我需要跟踪空中物体并计算六个自由度。
我目前正在跟踪彩色球,并在 rgb_frame 中计算它们的中心,并使用中心值来查找 depth_frame 中的深度。
在现实世界的坐标中找到深度(Z)后,我正在使用等式计算现实世界的 X 和 Y: X = (Z u)/fx 和 Y = (Z v)/fy ,其中 fx,fy是从 kinect 的固有参数获得的焦距,在这种情况下 u 和 v 是中心的 x,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: 错误: (-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
.