Я работаю над проектом, в котором мне нужно отслеживать воздушные объекты и вычислять шесть степеней свободы.
В настоящее время я отслеживаю цветные шары и вычисляю их центр в rgb_frame и использую значения центра, чтобы найти глубину в depth_frame.
После нахождения глубины (Z) в реальных координатах я вычисляю реальные X и Y, используя уравнения: X = (Zu)/fx и Y = (Zv) /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
.